Crossgen - Disable the Target-dependent SIMD vector types warning
authorBrian Sullivan <briansul@microsoft.com>
Thu, 15 Jun 2017 01:44:12 +0000 (18:44 -0700)
committerBrian Sullivan <briansul@microsoft.com>
Thu, 15 Jun 2017 01:44:12 +0000 (18:44 -0700)
When a SIMD type is referenced during CEEPreloader instead of loading it
we throw a type load exception with a unique resource ID and message.
This commit changed the ICorCompileDataStore interface to allow us to pass
the unique resource ID over to the zapper from the VM.

The Zapper can then demote certain resource ID warnings down to the
lowest informational level, so that they aren't printed out  during crossgen.
With this commit we currently are demoting IDS_EE_SIMD_NGEN_DISALLOWED

Commit migrated from https://github.com/dotnet/coreclr/commit/f79d7e81f70739ab9ae266382aecdfd8c750d06d

src/coreclr/src/inc/corcompile.h
src/coreclr/src/vm/compile.cpp
src/coreclr/src/zap/zapcode.cpp
src/coreclr/src/zap/zapimage.cpp
src/coreclr/src/zap/zapimage.h

index f1c2314..d7ac28d 100644 (file)
@@ -1378,9 +1378,12 @@ class ICorCompileDataStore
     // Returns ZapImage
     virtual ZapImage * GetZapImage() = 0;
 
-    // Reports an error during preloading.  Return the error code to propagate,
-    // or S_OK to ignore the error
-    virtual void Error(mdToken token, HRESULT hr, LPCWSTR description) = 0;
+    // Report an error during preloading:
+    // 'token' is the metadata token that triggered the error
+    // hr is the HRESULT from the thrown Exception, or S_OK if we don't have an thrown exception
+    // resID is the resourceID with additional information from the thrown Exception, or 0
+    //
+    virtual void Error(mdToken token, HRESULT hr, UINT _resID, LPCWSTR description) = 0;
 };
 
 
index 49b329e..269e194 100644 (file)
@@ -6838,10 +6838,20 @@ void CEEPreloader::Error(mdToken token, Exception * pException)
 {
     STANDARD_VM_CONTRACT;
 
+    HRESULT hr = pException->GetHR();
+    UINT    resID = 0;
+
     StackSString msg;
 
 #ifdef CROSSGEN_COMPILE
     pException->GetMessage(msg);
+
+    // Do we have an EEException with a resID?
+    if (EEMessageException::IsEEMessageException(pException))
+    {
+        EEMessageException * pEEMessageException = (EEMessageException *) pException;
+        resID = pEEMessageException->GetResID();
+    }
 #else
     {
         GCX_COOP();
@@ -6860,7 +6870,7 @@ void CEEPreloader::Error(mdToken token, Exception * pException)
     }
 #endif
     
-    m_pData->Error(token, pException->GetHR(), msg.GetUnicode());
+    m_pData->Error(token, hr, resID, msg.GetUnicode());
 }
 
 CEEInfo *g_pCEEInfo = NULL;
index 7384283..8d41222 100644 (file)
@@ -983,7 +983,7 @@ void ZapMethodEntryPoint::Resolve(ZapImage * pImage)
     {
         mdMethodDef token;
         pImage->GetCompileInfo()->GetMethodDef(GetHandle(), &token);
-        pImage->Error(token, S_OK, W("MapMethodEntryPoint failed"));
+        pImage->Error(token, S_OK, 0, W("MapMethodEntryPoint failed"));
     }
     else
 #endif
index 61cf099..469b841 100644 (file)
@@ -3553,7 +3553,7 @@ void ZapImage::FileNotFoundError(LPCWSTR pszMessage)
     fileNotFoundErrorsTable.Append(message);
 }
 
-void ZapImage::Error(mdToken token, HRESULT hr, LPCWSTR message)
+void ZapImage::Error(mdToken token, HRESULT hr, UINT resID,  LPCWSTR message)
 {
     // Missing dependencies are reported as fatal errors in code:CompilationDomain::BindAssemblySpec.
     // Avoid printing redundant error message for them.
@@ -3562,12 +3562,21 @@ void ZapImage::Error(mdToken token, HRESULT hr, LPCWSTR message)
 
     CorZapLogLevel level = CORZAP_LOGLEVEL_ERROR;
 
+    // Some warnings are demoted to informational level
+    if (resID == IDS_EE_SIMD_NGEN_DISALLOWED)
+    {
+        // Supress printing of "Target-dependent SIMD vector types may not be used with ngen."
+        level = CORZAP_LOGLEVEL_INFO;
+    }
+
     if (m_zapper->m_pOpt->m_ignoreErrors)
     {
 #ifdef CROSSGEN_COMPILE
         // Warnings should not go to stderr during crossgen
         if (level == CORZAP_LOGLEVEL_ERROR)
+        {
             level = CORZAP_LOGLEVEL_WARNING;
+        }
 #endif
         m_zapper->Print(level, W("Warning: "));
     }
index f0bcbcb..582c9a3 100644 (file)
@@ -829,7 +829,7 @@ public:
 
     // Returns ZapImage
     virtual ZapImage * GetZapImage();
-    void Error(mdToken token, HRESULT error, LPCWSTR message);
+    void Error(mdToken token, HRESULT error, UINT resID, LPCWSTR message);
 
     // Returns virtual section for EE datastructures
     ZapVirtualSection * GetSection(CorCompileSection section)