Integrate changes from full .NET Framework
authorJan Kotas <jkotas@microsoft.com>
Wed, 3 Feb 2016 14:18:44 +0000 (06:18 -0800)
committerJan Kotas <jkotas@microsoft.com>
Wed, 3 Feb 2016 14:18:44 +0000 (06:18 -0800)
- Custom attribute to suppress NGen with method granularity
- Static contract fixes
- GC fix

[tfs-changeset: 1571860]

16 files changed:
src/gc/env/gcenv.structs.h
src/gc/gc.cpp
src/gc/gcpriv.h
src/inc/corcompile.h
src/vm/appdomainstack.h
src/vm/classcompat.h
src/vm/compile.cpp
src/vm/compile.h
src/vm/i386/cgencpu.h
src/vm/jitinterface.h
src/vm/mixedmode.cpp
src/vm/peimage.cpp
src/vm/peimagelayout.inl
src/vm/security.inl
src/vm/sigformat.cpp
src/zap/zapimage.cpp

index 64c39f3..ef6ec59 100644 (file)
@@ -102,19 +102,6 @@ public:
 
 #ifndef _INC_WINDOWS
 
-typedef union _LARGE_INTEGER {
-    struct {
-#if BIGENDIAN
-        int32_t HighPart;
-        uint32_t LowPart;
-#else
-        uint32_t LowPart;
-        int32_t HighPart;
-#endif
-    } u;
-    int64_t QuadPart;
-} LARGE_INTEGER, *PLARGE_INTEGER;
-
 #ifdef PLATFORM_UNIX
 
 typedef struct _RTL_CRITICAL_SECTION {
index 869b0b9..0d9e986 100644 (file)
@@ -39,6 +39,10 @@ inline BOOL ShouldTrackMovementForProfilerOrEtw()
 }
 #endif // defined(GC_PROFILING) || defined(FEATURE_EVENT_TRACE)
 
+#if defined(BACKGROUND_GC) && defined(FEATURE_EVENT_TRACE)
+BOOL bgc_heap_walk_for_etw_p = FALSE;
+#endif //BACKGROUND_GC && FEATURE_EVENT_TRACE
+
 #if defined(FEATURE_REDHAWK)
 #define MAYBE_UNUSED_VAR(v) v = v
 #else
@@ -15285,10 +15289,14 @@ void gc_heap::gc1()
 #if defined(VERIFY_HEAP) || (defined (FEATURE_EVENT_TRACE) && defined(BACKGROUND_GC))
     if (FALSE 
 #ifdef VERIFY_HEAP
+        // Note that right now g_pConfig->GetHeapVerifyLevel always returns the same
+        // value. If we ever allow randomly adjusting this as the process runs,
+        // we cannot call it this way as joins need to match - we must have the same
+        // value for all heaps like we do with bgc_heap_walk_for_etw_p.
         || (g_pConfig->GetHeapVerifyLevel() & EEConfig::HEAPVERIFY_GC)
 #endif
 #if defined(FEATURE_EVENT_TRACE) && defined(BACKGROUND_GC)
-        || (ETW::GCLog::ShouldTrackMovementForEtw() && settings.concurrent)
+        || (bgc_heap_walk_for_etw_p && settings.concurrent)
 #endif
         )
     {
@@ -15331,7 +15339,7 @@ void gc_heap::gc1()
 #ifdef BACKGROUND_GC
         assert (settings.concurrent == (uint32_t)(bgc_thread_id.IsCurrentThread()));
 #ifdef FEATURE_EVENT_TRACE
-        if (ETW::GCLog::ShouldTrackMovementForEtw() && settings.concurrent)
+        if (bgc_heap_walk_for_etw_p && settings.concurrent)
         {
             make_free_lists_for_profiler_for_bgc();
         }
@@ -16402,8 +16410,7 @@ int gc_heap::garbage_collect (int n)
         }
 
         {
-            int gen_num_for_data = ((settings.condemned_generation < (max_generation - 1)) ? 
-                                    (settings.condemned_generation + 1) : (max_generation + 1));
+            int gen_num_for_data = max_generation + 1;
             for (int i = 0; i <= gen_num_for_data; i++)
             {
                 gc_data_per_heap.gen_data[i].size_before = generation_size (i);
@@ -31185,6 +31192,10 @@ void gc_heap::background_sweep()
     if (bgc_t_join.joined())
 #endif //MULTIPLE_HEAPS
     {
+#ifdef FEATURE_EVENT_TRACE
+        bgc_heap_walk_for_etw_p = ETW::GCLog::ShouldTrackMovementForEtw();
+#endif //FEATURE_EVENT_TRACE
+
         leave_spin_lock (&gc_lock);
 
 #ifdef MULTIPLE_HEAPS
index 868c59e..1727a4c 100644 (file)
@@ -141,12 +141,12 @@ inline void FATAL_GC_ERROR()
 
 #if defined (SYNCHRONIZATION_STATS) || defined (STAGE_STATS)
 #define BEGIN_TIMING(x) \
-    LARGE_INTEGER x##_start; \
-    x##_start = GCToOSInterface::QueryPerformanceCounter ()
+    int64_t x##_start; \
+    x##_start = GCToOSInterface::QueryPerformanceCounter()
 
 #define END_TIMING(x) \
-    LARGE_INTEGER x##_end; \
-    x##_end = GCToOSInterface::QueryPerformanceCounter (); \
+    int64_t x##_end; \
+    x##_end = GCToOSInterface::QueryPerformanceCounter(); \
     x += x##_end - x##_start
 
 #else
index 0159d86..e3e159f 100644 (file)
@@ -1924,6 +1924,8 @@ class ICorCompileInfo
 
     virtual BOOL AreAllClassesFullyLoaded(CORINFO_MODULE_HANDLE moduleHandle) = 0;
 #endif
+
+    virtual BOOL HasCustomAttribute(CORINFO_METHOD_HANDLE method, LPCSTR customAttributeName) = 0;
 };
 
 /*****************************************************************************/
index 44ca280..1390364 100644 (file)
@@ -55,7 +55,7 @@ class AppDomainStack
 public:
     AppDomainStack() : m_numEntries(0), m_pExtraStack(NULL), m_ExtraStackSize(0), m_dwOverridesCount(0), m_dwAsserts(0), m_dwThreadWideSpecialFlags(0xFFFFFFFF)
     {
-        WRAPPER_NO_CONTRACT;
+        LIMITED_METHOD_CONTRACT;
         FillEntries(m_pStack, ADSTACK_BLOCK_SIZE);
     }
 
index a00dcaf..678cb79 100644 (file)
@@ -634,7 +634,7 @@ private:
                                               UINT idResWhy,
                                               mdMethodDef tokMethodDef)
     {
-        WRAPPER_NO_CONTRACT;
+        STANDARD_VM_CONTRACT;
         bmtError->resIDWhy = idResWhy;
         bmtError->dMethodDefInError = tokMethodDef;
         bmtError->szMethodNameForError = NULL;
@@ -647,7 +647,7 @@ private:
         UINT idResWhy,
         LPCUTF8 szMethodName)
     {
-        WRAPPER_NO_CONTRACT;
+        STANDARD_VM_CONTRACT;
         bmtError->resIDWhy = idResWhy;
         bmtError->dMethodDefInError = mdMethodDefNil;
         bmtError->szMethodNameForError = szMethodName;
@@ -659,7 +659,7 @@ private:
                                               UINT idResWhy,
                                               mdMethodDef tokMethodDef = mdMethodDefNil)
     {
-        WRAPPER_NO_CONTRACT;
+        STANDARD_VM_CONTRACT;
         BuildMethodTableThrowException(COR_E_TYPELOAD, idResWhy, tokMethodDef);
     }
 
@@ -667,7 +667,7 @@ private:
         UINT idResWhy,
         LPCUTF8 szMethodName)
     {
-        WRAPPER_NO_CONTRACT;
+        STANDARD_VM_CONTRACT;
         BuildMethodTableThrowException(COR_E_TYPELOAD, idResWhy, szMethodName);
     }
 
index 422189a..1d17c5e 100644 (file)
@@ -2657,6 +2657,13 @@ BOOL CEECompileInfo::AreAllClassesFullyLoaded(CORINFO_MODULE_HANDLE moduleHandle
 
 #endif // FEATURE_READYTORUN_COMPILER
 
+BOOL CEECompileInfo::HasCustomAttribute(CORINFO_METHOD_HANDLE method, LPCSTR customAttributeName)
+{
+    STANDARD_VM_CONTRACT;
+
+    MethodDesc * pMD = GetMethod(method);
+    return S_OK == pMD->GetMDImport()->GetCustomAttributeByName(pMD->GetMemberDef(), customAttributeName, NULL, NULL);
+}
 
 #define OMFConst_Read            0x0001
 #define OMFConst_Write           0x0002
index d6ed980..46fec94 100644 (file)
@@ -423,6 +423,8 @@ class CEECompileInfo : public ICorCompileInfo
     BOOL AreAllClassesFullyLoaded(CORINFO_MODULE_HANDLE moduleHandle);
 #endif
 
+    BOOL HasCustomAttribute(CORINFO_METHOD_HANDLE method, LPCSTR customAttributeName);
+
     //--------------------------------------------------------------------
     // ZapperLoaderModules and the ZapperLoaderModuleTable
     //
index e40c856..917d731 100644 (file)
@@ -226,6 +226,7 @@ struct EHContext {
 
     inline void Init()
     {
+        LIMITED_METHOD_CONTRACT;
         Eax = 0;
         Ebx = 0;
         Ecx = 0;
index 97dbd62..72a4b17 100644 (file)
@@ -406,33 +406,33 @@ public:
 class ICorModuleInfo_Hack
 {
 public:
-    virtual void ICorModuleInfo_Hack_dummy() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
+    virtual void ICorModuleInfo_Hack_dummy() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
 };
 
 class ICorClassInfo_Hack
 {
 public:
-    virtual void ICorClassInfo_Hack_dummy1() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy2() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy3() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy4() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy5() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy6() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy7() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy8() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy9() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy10() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy11() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy12() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy13() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
-    virtual void ICorClassInfo_Hack_dummy14() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy1() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy2() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy3() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy4() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy5() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy6() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy7() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy8() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy9() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy10() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy11() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy12() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy13() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
+    virtual void ICorClassInfo_Hack_dummy14() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
 
     virtual mdMethodDef __stdcall ICorClassInfo_Hack_getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod) = 0;
 };
 
 class ICorStaticInfo_Hack : public virtual ICorMethodInfo_Hack, public virtual ICorModuleInfo_Hack, public virtual ICorClassInfo_Hack
 {
-    virtual void ICorStaticInfo_Hack_dummy() { WRAPPER_NO_CONTRACT; UNREACHABLE(); };
+    virtual void ICorStaticInfo_Hack_dummy() { LIMITED_METHOD_CONTRACT; UNREACHABLE(); };
 };
 
 #endif // FEATURE_CORECLR
index 0cafb61..32d4368 100644 (file)
@@ -23,7 +23,7 @@
 
 IJWNOADThunk::IJWNOADThunk(HMODULE pModulebase, DWORD dwIndex, mdToken Token)
 {
-    WRAPPER_NO_CONTRACT;
+    LIMITED_METHOD_CONTRACT;
     m_pModulebase=pModulebase;
     m_dwIndex=dwIndex;
     m_Token=Token;
index 874f20f..27904ff 100644 (file)
@@ -829,7 +829,14 @@ void PEImage::VerifyIsILOrNIAssembly(BOOL fIL)
 
 void DECLSPEC_NORETURN PEImage::ThrowFormat(HRESULT hrError)
 {
-    WRAPPER_NO_CONTRACT;
+    CONTRACTL
+    {
+        GC_TRIGGERS;
+        THROWS;
+        MODE_ANY;
+    }
+    CONTRACTL_END;
+
     EEFileLoadException::Throw(m_path, hrError);
 }
 
index 0917fc7..f9a5215 100644 (file)
@@ -12,6 +12,7 @@
 
 inline const SString &PEImageLayout::GetPath()
 {
+    LIMITED_METHOD_CONTRACT;
     return m_pOwner?m_pOwner->GetPath():SString::Empty();
 }
 
index cc552e1..745de28 100644 (file)
@@ -520,6 +520,7 @@ inline BOOL Security::CheckCriticalAccess(AccessCheckContext* pContext,
     FieldDesc* pOptionalTargetField,
     MethodTable * pOptionalTargetType)
 {
+    WRAPPER_NO_CONTRACT;
     return SecurityTransparent::CheckCriticalAccess(pContext,
                 pOptionalTargetMethod, 
                 pOptionalTargetField, 
index 86251db..69e818a 100644 (file)
@@ -640,7 +640,13 @@ const char* FormatSig(MethodDesc * pMD, LoaderHeap * pHeap, AllocMemTracker * pa
 /*******************************************************************/
 const char* FormatSig(MethodDesc* pMD, AppDomain *pDomain, AllocMemTracker *pamTracker)
 {
-    WRAPPER_NO_CONTRACT;
+    CONTRACTL
+    {
+        THROWS;
+        GC_NOTRIGGER;
+    }
+    CONTRACTL_END;
+
     return FormatSig(pMD,pDomain->GetLowFrequencyHeap(),pamTracker);
 }
 #endif
index 727f457..887051a 100644 (file)
@@ -3752,12 +3752,14 @@ ZapImage::CompileStatus ZapImage::TryCompileMethodWorker(CORINFO_METHOD_HANDLE h
     if (m_zapper->m_pOpt->m_onlyOneMethod && (m_zapper->m_pOpt->m_onlyOneMethod != md))
         return NOT_COMPILED;
 
+    if (GetCompileInfo()->HasCustomAttribute(handle, "System.Runtime.BypassNGenAttribute"))
+        return NOT_COMPILED;
+
 #ifdef MDIL
     // This is a quick workaround to opt specific methods out of MDIL generation to work around bugs.
     if (m_zapper->m_pOpt->m_compilerFlags & CORJIT_FLG_MDIL)
     {
-        HRESULT hr = m_pMDImport->GetCustomAttributeByName(md, "System.Runtime.BypassMdilAttribute", NULL, NULL);
-        if (hr == S_OK)
+        if (GetCompileInfo()->HasCustomAttribute(handle, "System.Runtime.BypassMdilAttribute"))
             return NOT_COMPILED;
     }
 #endif
@@ -3766,8 +3768,7 @@ ZapImage::CompileStatus ZapImage::TryCompileMethodWorker(CORINFO_METHOD_HANDLE h
     // This is a quick workaround to opt specific methods out of ReadyToRun compilation to work around bugs.
     if (IsReadyToRunCompilation())
     {
-        HRESULT hr = m_pMDImport->GetCustomAttributeByName(md, "System.Runtime.BypassReadyToRun", NULL, NULL);
-        if (hr == S_OK)
+        if (GetCompileInfo()->HasCustomAttribute(handle, "System.Runtime.BypassReadyToRunAttribute"))
             return NOT_COMPILED;
     }
 #endif