Add a fourth parameter to the DEFINE_DACVAR macro that is the actual fully qualified...
authorMike McLaughlin <mikem@microsoft.com>
Tue, 24 Feb 2015 23:25:57 +0000 (15:25 -0800)
committerMike McLaughlin <mikem@microsoft.com>
Fri, 6 Mar 2015 22:32:22 +0000 (14:32 -0800)
First pass at the global DAC table support for Linux. Explicitly build the table in the coreclr module instead of extract it from the pdb and put it in a resource.

Fixed the SVR gc globals in the DAC table. They had to be seperated and initialized in gceesvr.cpp.

Start on global pointer table.

PAL functions to write and read the DAC table address between processes.

The dac table is now copied from the coreclr process to the DAC/debugger process.  The tables were not being built with exactly the same defines so they weren't the same size. Fixed a bug in the read memory implementation. Still assumes pid = 0.

Changed the dacTable entries to be RVAs and renabled getting the corclr module base addres (m_globalBase). Added dac table address file cleanup on coreclr shutdown.

Filled in the vtable entries in the global dac table.  Changed some of the VPTR_* macros to be defined on the coreclr side (RS) to defined a constructor that is used to get the vtable in dactable.cpp. These changes required default constructors to be added to some of the classes.

Changed getting the vtable address to not invoke the destructors since the constructor used didn't do anything (like initialize variables, etc.).

Added a TODO comment about the debuggee pid not being available in the dac table address file name.

Fixed Windows build. Created a couple of new VPTR_* macros that add a default constructor only if building coreclr (not DAC) on Linux.

Comment on how these DAC table functions are temporary.

40 files changed:
dac.cmake
src/ToolBox/SOS/Strike/strike.cpp
src/ToolBox/SOS/lldbplugin/debugclient.cpp
src/debug/daccess/daccess.cpp
src/debug/daccess/enummem.cpp
src/debug/ee/CMakeLists.txt
src/debug/ee/dactable.cpp [new file with mode: 0644]
src/dlls/mscoree/mscoree.cpp
src/gc/gc.h
src/gc/gceesvr.cpp
src/gc/gcpriv.h
src/gc/gcscan.h
src/inc/corhost.h
src/inc/daccess.h
src/inc/dacvars.h
src/inc/eetwain.h
src/inc/sstring.h
src/inc/vptr_list.h
src/pal/inc/pal.h
src/pal/src/CMakeLists.txt
src/pal/src/misc/dactableaddress.cpp [new file with mode: 0644]
src/unwinder/dac/hostwinamd64/CMakeLists.txt
src/vm/appdomain.hpp
src/vm/ceemain.h
src/vm/codeman.h
src/vm/crst.h
src/vm/dbginterface.h
src/vm/eedbginterface.h
src/vm/eedbginterfaceimpl.h
src/vm/object.h
src/vm/pefile.h
src/vm/rcwwalker.h
src/vm/security.h
src/vm/securitydescriptor.h
src/vm/securitydescriptorappdomain.h
src/vm/securitydescriptorassembly.h
src/vm/simplerwlock.hpp
src/vm/stackwalktypes.h
src/vm/stubmgr.h
src/vm/win32threadpool.h

index 90608c6..1b27ac0 100644 (file)
--- a/dac.cmake
+++ b/dac.cmake
@@ -1,7 +1,6 @@
 # Contains the dac build specific definitions. Included by the leaf dac cmake files.
 
 remove_definitions(-DPROFILING_SUPPORTED)
-add_definitions(-DPROFILING_SUPPORTED_DATA)
 add_definitions(-DDACCESS_COMPILE)
 if(WIN32)
     add_definitions(-MT)
index c41e656..6419534 100644 (file)
@@ -279,11 +279,6 @@ DECLARE_API(IP2MD)
     {
         return Status;
     }
-#ifdef FEATURE_PAL 
-    // TODO - mikem 2/20/14 - temporary until the rest of the DAC is working.
-    ExtOut("Test output for IP2MD %16x\n", IP);
-    return Status;
-#endif 
     EnableDMLHolder dmlHolder(dml);
 
     if (IP == 0)
index 5f506fe..e973670 100644 (file)
@@ -176,7 +176,7 @@ DebugClient::ReadVirtual(
     ULONG bufferSize,
     PULONG bytesRead)
 {
-    bytesRead = 0;
+    *bytesRead = 0;
 
     lldb::SBTarget target = m_debugger.GetSelectedTarget();
     if (!target.IsValid())
index 7e10e2a..24f18bd 100644 (file)
@@ -7180,6 +7180,25 @@ HRESULT
 ClrDataAccess::GetDacGlobals()
 {
 #ifdef FEATURE_PAL
+    // TODO - 3/5/15 - the DAC side needs the debuggee pid
+    DWORD pid = 0;
+    PVOID dacTableAddress = nullptr;
+    ULONG dacTableSize = 0;
+    DWORD err = PAL_GetDacTableAddress(pid, &dacTableAddress, &dacTableSize);
+    if (err != ERROR_SUCCESS)
+    {
+        return CORDBG_E_MISSING_DEBUGGER_EXPORTS;
+    }
+
+    if (dacTableSize != sizeof(g_dacGlobals))
+    {
+        return E_INVALIDARG;
+    }
+
+    if (FAILED(ReadFromDataTarget(m_pTarget, (ULONG64)dacTableAddress, (BYTE*)&g_dacGlobals, dacTableSize)))
+    {
+        return CORDBG_E_MISSING_DEBUGGER_EXPORTS;
+    }
     return S_OK;
 #else
     HRESULT status = E_FAIL;
index ce7786e..0d50ec6 100644 (file)
@@ -216,7 +216,10 @@ HRESULT ClrDataAccess::EnumMemCLRStatic(IN CLRDataEnumMemoryFlags flags)
     // global variables. But it won't report the structures that are pointed by 
     // global pointers.
     //
-#define DEFINE_DACVAR(id_type, size_type, id)   \
+#define DEFINE_DACVAR(id_type, size_type, id, var) \
+    ReportMem(m_globalBase + g_dacGlobals.id, sizeof(size_type));
+
+#define DEFINE_DACVAR_SVR(id_type, size_type, id, var) \
     ReportMem(m_globalBase + g_dacGlobals.id, sizeof(size_type));
 
     // Cannot use CATCH_ALL_EXCEPT_RETHROW_COR_E_OPERATIONCANCELLED
index 5200072..bd4849e 100644 (file)
@@ -43,6 +43,10 @@ if(WIN32)
     dbgtransportproxy.cpp
     ddunpack.cpp
   )
+else()
+  list(APPEND CORDBEE_SOURCES_WKS 
+    dactable.cpp
+  )
 endif(WIN32)
 
 if (IS_64BIT_BUILD EQUAL 1)
diff --git a/src/debug/ee/dactable.cpp b/src/debug/ee/dactable.cpp
new file mode 100644 (file)
index 0000000..43b2799
--- /dev/null
@@ -0,0 +1,89 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+//*****************************************************************************
+// File: dacglobals.cpp
+//
+
+//
+// The DAC global pointer table
+//
+//*****************************************************************************
+
+#include "stdafx.h"
+#include <daccess.h>
+#include "../../vm/virtualcallstub.h"
+#include "../../vm/win32threadpool.h"
+#include "../../vm/hillclimbing.h"
+#include "../../vm/codeman.h"
+#include "../../vm/eedbginterfaceimpl.h"
+#include "../../vm/common.h"
+#include "../../vm/gcenv.h"
+#include "../../vm/ecall.h"
+#include "../../vm/rcwwalker.h"
+#include "../../gc/gc.h"
+#include "../../gc/gcscan.h"
+
+#undef SERVER_GC
+namespace WKS {
+#include "../../gc/gcimpl.h"
+#include "../../gc/gcpriv.h"
+}
+
+#ifdef DEBUGGING_SUPPORTED
+
+extern PTR_ECHash gFCallMethods;
+extern TADDR gLowestFCall;
+extern TADDR gHighestFCall;
+extern PCODE g_FCDynamicallyAssignedImplementations;
+extern DWORD gThreadTLSIndex;
+extern DWORD gAppDomainTLSIndex;
+
+#ifdef FEATURE_APPX
+#if defined(FEATURE_CORECLR)
+extern BOOL g_fAppX;
+#else
+extern PTR_AppXRTInfo g_pAppXRTInfo;
+#endif
+#endif // FEATURE_APPX
+
+DacGlobals g_dacTable;
+
+// DAC global pointer table initialization
+void DacGlobals::Initialize()
+{
+    TADDR baseAddress = PTR_TO_TADDR(PAL_GetCoreClrModuleBase());
+    g_dacTable.InitializeEntries(baseAddress);
+#ifdef FEATURE_SVR_GC
+    g_dacTable.InitializeSVREntries(baseAddress);
+#endif
+    PAL_PublishDacTableAddress(&g_dacTable, sizeof(g_dacTable));
+}
+
+// Initializes the non-SVR table entries
+void DacGlobals::InitializeEntries(TADDR baseAddress)
+{
+#define DEFINE_DACVAR(id_type, size, id, var)                   id = PTR_TO_TADDR(&var) - baseAddress;
+#define DEFINE_DACVAR_SVR(id_type, size, id, var) 
+#define DEFINE_DACVAR_NO_DUMP(id_type, size, id, var)           id = PTR_TO_TADDR(&var) - baseAddress;
+#include "dacvars.h"
+
+#define VPTR_CLASS(name) \
+    { \
+        void *pBuf = _alloca(sizeof(name)); \
+        name *dummy = new (pBuf) name(0); \
+        name##__vtAddr = PTR_TO_TADDR(*((PVOID*)dummy)) - baseAddress; \
+    }
+#define VPTR_MULTI_CLASS(name, keyBase) \
+    { \
+        void *pBuf = _alloca(sizeof(name)); \
+        name *dummy = new (pBuf) name(0); \
+        name##__##keyBase##__mvtAddr = PTR_TO_TADDR(*((PVOID*)dummy)) - baseAddress; \
+    }
+#include <vptr_list.h>
+#undef VPTR_CLASS
+#undef VPTR_MULTI_CLASS
+}
+
+#endif // DEBUGGER_SUPPORTED
index 89d91b6..4d935d2 100644 (file)
@@ -180,7 +180,9 @@ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
             // If buffer is overrun, it is possible the saved callback has been trashed.
             // The callback is unsafe.
             //SetBufferOverrunHandler();
-
+#ifdef FEATURE_PAL
+            DacGlobals::Initialize();
+#endif
             if (!EEDllMain((HINSTANCE)hInstance, dwReason, lpReserved))
             {
                 return FALSE;
@@ -194,6 +196,9 @@ BOOL WINAPI DllMain(HANDLE hInstance, DWORD dwReason, LPVOID lpReserved)
 
     case DLL_PROCESS_DETACH:
         {
+#ifdef FEATURE_PAL
+            PAL_CleanupDacTableAddress();
+#endif
             EEDllMain((HINSTANCE)hInstance, dwReason, lpReserved);
 
 #ifdef FEATURE_MERGE_JIT_AND_ENGINE
index 455b6db..60e3dfd 100644 (file)
@@ -356,6 +356,7 @@ void record_changed_seg (BYTE* start, BYTE* end,
 #define GC_ALLOC_ALIGN8_BIAS 0x4
 
 class GCHeap {
+    friend struct ::_DacGlobals;
 #ifdef DACCESS_COMPILE
     friend class ClrDataAccess;
 #endif
index 6778e4a..6aa6c06 100644 (file)
@@ -21,4 +21,15 @@ namespace SVR {
 #include "gcee.cpp"
 }
 
-#endif // defined(FEATURE_SVR_GC)
+#if defined(FEATURE_PAL) && !defined(DACCESS_COMPILE)
+// Initializes the SVR DAC table entries
+void DacGlobals::InitializeSVREntries(TADDR baseAddress)
+{
+#define DEFINE_DACVAR_SVR(id_type, size, id, var)   id = PTR_TO_TADDR(&var) - baseAddress;
+#include "dacvars.h"
+}
+
+#endif // FEATURE_PAL && !DACCESS_COMPILE
+
+#endif // FEATURE_SVR_GC
index c99fd86..d16f4ba 100644 (file)
@@ -1112,6 +1112,7 @@ extern void GCProfileWalkHeapWorker(BOOL fProfilerPinned, BOOL fShouldWalkHeapRo
 #endif // defined(GC_PROFILING) || defined(FEATURE_EVENT_TRACE)
 class gc_heap
 {
+    friend struct ::_DacGlobals;
 #ifdef DACCESS_COMPILE
     friend class ::ClrDataAccess;
     friend class ::DacHeapWalker;
index 3b2fa70..9b198b0 100644 (file)
@@ -43,8 +43,10 @@ typedef void enum_alloc_context_func(alloc_context*);
 
 class CNameSpace
 {
+    friend struct ::_DacGlobals;
+
   public:
-    
+
     // Called on gc start
     static void GcStartDoWork();
 
index d77db20..133fb9c 100644 (file)
@@ -631,6 +631,7 @@ class CCLRErrorReportingManager :
 #endif // FEATURE_WINDOWSPHONE
 {
     friend class ClrDataAccess;
+    friend struct _DacGlobals;
 
     SVAL_DECL(ECustomDumpFlavor, g_ECustomDumpFlavor);
     
@@ -748,6 +749,8 @@ class CorHost2 :
 #endif
     , public CorExecutionManager
 {
+    friend struct _DacGlobals;
+
 public:
     CorHost2();
 
index fbd7919..e4f011b 100644 (file)
@@ -566,8 +566,6 @@ struct DacTableHeader
     DacTableInfo info;
 };
 
-#ifdef DACCESS_COMPILE
-
 //
 // This version of things wraps pointer access in
 // templates which understand how to retrieve data
@@ -587,7 +585,6 @@ typedef ULONG_PTR TADDR;
 // which reflects the host pointer size.
 typedef SIZE_T TSIZE_T;
 
-extern DacTableInfo g_dacTableInfo;
 
 //
 // The following table contains all the global information that data access needs to begin 
@@ -597,9 +594,18 @@ extern DacTableInfo g_dacTableInfo;
 
 typedef struct _DacGlobals
 {
+#ifdef FEATURE_PAL
+    static void Initialize();
+    void InitializeEntries(TADDR baseAddress);
+#ifdef FEATURE_SVR_GC
+    void InitializeSVREntries(TADDR baseAddress);
+#endif // FEATURE_SVR_GC
+#endif // FEATURE_PAL
+
 // These will define all of the dac related mscorwks static and global variables    
-#define DEFINE_DACVAR(id_type, size, id)                 id_type id;
-#define DEFINE_DACVAR_NO_DUMP(id_type, size, id)        id_type id;
+#define DEFINE_DACVAR(id_type, size, id, var)                 id_type id;
+#define DEFINE_DACVAR_SVR(id_type, size, id, var)             id_type id;
+#define DEFINE_DACVAR_NO_DUMP(id_type, size, id, var)         id_type id;
 #include "dacvars.h"
 
     // Global functions.
@@ -625,6 +631,9 @@ typedef struct _DacGlobals
 #undef VPTR_MULTI_CLASS
 } DacGlobals;
 
+#ifdef DACCESS_COMPILE
+
+extern DacTableInfo g_dacTableInfo;
 extern DacGlobals g_dacGlobals;
 
 #ifdef __cplusplus
@@ -1821,6 +1830,9 @@ typedef __VoidPtr PTR_CVOID;
 public: name(TADDR addr, TADDR vtAddr) : base(addr, vtAddr) {}  \
         VPTR_CLASS_METHODS(name)
 
+#define VPTR_VTABLE_CLASS_AND_CTOR(name, base)                  \
+        VPTR_VTABLE_CLASS(name, base)
+
 #define VPTR_MULTI_VTABLE_CLASS(name, base)                     \
 public: name(TADDR addr, TADDR vtAddr) : base(addr, vtAddr) {}  \
         VPTR_MULTI_CLASS_METHODS(name, base)
@@ -1842,6 +1854,9 @@ public: name(TADDR addr, TADDR vtAddr);                         \
 public: name(TADDR addr, TADDR vtAddr) {}                       \
         virtual ULONG32 VPtrSize(void) = 0;
 
+#define VPTR_BASE_VTABLE_CLASS_AND_CTOR(name)                   \
+        VPTR_BASE_VTABLE_CLASS(name)
+
 #define VPTR_BASE_VTABLE_CLASS_NO_CTOR_BODY(name)               \
 public: name(TADDR addr, TADDR vtAddr);                         \
         virtual ULONG32 VPtrSize(void) = 0;
@@ -2085,12 +2100,49 @@ typedef const void* PTR_CVOID;
 #define S8PTRMAX(type, maxChars) type*
 #define S16PTR(type) type*
 #define S16PTRMAX(type, maxChars) type*
+
+#if defined(FEATURE_PAL)
+
+#define VPTR_VTABLE_CLASS(name, base) \
+        friend struct _DacGlobals; \
+public: name(int dummy) : base(dummy) {}
+
+#define VPTR_VTABLE_CLASS_AND_CTOR(name, base) \
+        VPTR_VTABLE_CLASS(name, base) \
+        name() : base() {}
+
+#define VPTR_MULTI_VTABLE_CLASS(name, base) \
+        friend struct _DacGlobals; \
+public: name(int dummy) : base(dummy) {}
+
+#define VPTR_BASE_CONCRETE_VTABLE_CLASS(name) \
+        friend struct _DacGlobals; \
+public: name(int dummy) {}
+
+#define VPTR_BASE_VTABLE_CLASS(name) \
+        friend struct _DacGlobals; \
+public: name(int dummy) {}
+
+#define VPTR_BASE_VTABLE_CLASS_AND_CTOR(name) \
+        VPTR_BASE_VTABLE_CLASS(name) \
+        name() {}
+
+#define VPTR_ABSTRACT_VTABLE_CLASS(name, base) \
+        friend struct _DacGlobals; \
+public: name(int dummy) : base(dummy) {}
+
+#else // FEATURE_PAL
+
 #define VPTR_VTABLE_CLASS(name, base)
+#define VPTR_VTABLE_CLASS_AND_CTOR(name, base)
 #define VPTR_MULTI_VTABLE_CLASS(name, base)
 #define VPTR_BASE_CONCRETE_VTABLE_CLASS(name)
 #define VPTR_BASE_VTABLE_CLASS(name)
+#define VPTR_BASE_VTABLE_CLASS_AND_CTOR(name)
 #define VPTR_ABSTRACT_VTABLE_CLASS(name, base)
 
+#endif // FEATURE_PAL
+
 // helper macro to make the vtables unique for DAC
 #define VPTR_UNIQUE(unique) virtual int MakeVTableUniqueForDAC() {    STATIC_CONTRACT_SO_TOLERANT; return unique; }
 #define VPTR_UNIQUE_BaseDomain                          (100000)
index 4cf0c4b..35006f1 100644 (file)
@@ -13,8 +13,8 @@
 // DEFINE_DACVAR macro & include dacvars.h like so (see enummem.cpp and/or 
 // daccess.h for examples):
 //
-// #define DEFINE_DACVAR(type, size, id)  type id;     //this defn. discards
-//                                                                                                     //the size
+// #define DEFINE_DACVAR(type, size, id, var)  type id;     //this defn. discards
+//                                                          //the size
 // #include "dacvars.h"
 //
 // @dbgtodo: 
 // member, the name should be <class_name>__<member_name>. If the variable is a 
 // global, the name should be <dac>__<global_name>.
 //                                     *                               *                               *
+// The FOURTH ARGUMENT should be the actual name of the static/global variable. If 
+// static data the should be [<namespace>::]<class_name>::<member_name>. If global,
+// it should look like <global_name>.
+//                                     *                               *                               *
 // If you need to add an entry to this file, your type may not be visible when  
 // this file is compiled. In that case, you need to do one of two things:
 // - If the type is a pointer type, you can simply use UNKNOWN_POINTER_TYPE as the 
 // nothing will be dumped. 
 
 #ifndef DEFINE_DACVAR
-#define DEFINE_DACVAR(type, true_type, id)
+#define DEFINE_DACVAR(type, true_type, id, var)
 #endif
 
-#define UNKNOWN_POINTER_TYPE SIZE_T
+// Use this macro for any server (namespace SVR) variables
+#ifndef DEFINE_DACVAR_SVR
+#define DEFINE_DACVAR_SVR(type, true_type, id, var)
+#endif
 
 // Use this macro to define a static var that is known to DAC, but not captured in a dump.                         
 #ifndef DEFINE_DACVAR_NO_DUMP
-#define DEFINE_DACVAR_NO_DUMP(type, true_type, id)
+#define DEFINE_DACVAR_NO_DUMP(type, true_type, id, var)
 #endif
 
-DEFINE_DACVAR(ULONG, PTR_RangeSection, ExecutionManager__m_CodeRangeList)
-DEFINE_DACVAR(ULONG, PTR_EECodeManager, ExecutionManager__m_pDefaultCodeMan)
-DEFINE_DACVAR(ULONG, LONG, ExecutionManager__m_dwReaderCount)
-DEFINE_DACVAR(ULONG, LONG, ExecutionManager__m_dwWriterLock)
+#define UNKNOWN_POINTER_TYPE SIZE_T
+
+DEFINE_DACVAR(ULONG, PTR_RangeSection, ExecutionManager__m_CodeRangeList, ExecutionManager::m_CodeRangeList)
+DEFINE_DACVAR(ULONG, PTR_EECodeManager, ExecutionManager__m_pDefaultCodeMan, ExecutionManager::m_pDefaultCodeMan)
+DEFINE_DACVAR(ULONG, LONG, ExecutionManager__m_dwReaderCount, ExecutionManager::m_dwReaderCount)
+DEFINE_DACVAR(ULONG, LONG, ExecutionManager__m_dwWriterLock, ExecutionManager::m_dwWriterLock)
 
-DEFINE_DACVAR(ULONG, PTR_EEJitManager, ExecutionManager__m_pEEJitManager)
+DEFINE_DACVAR(ULONG, PTR_EEJitManager, ExecutionManager__m_pEEJitManager, ExecutionManager::m_pEEJitManager)
 #ifdef FEATURE_PREJIT
-DEFINE_DACVAR(ULONG, PTR_NativeImageJitManager, ExecutionManager__m_pNativeImageJitManager)
+DEFINE_DACVAR(ULONG, PTR_NativeImageJitManager, ExecutionManager__m_pNativeImageJitManager, ExecutionManager::m_pNativeImageJitManager)
 #endif
 #ifdef FEATURE_READYTORUN
-DEFINE_DACVAR(ULONG, PTR_ReadyToRunJitManager, ExecutionManager__m_pReadyToRunJitManager)
+DEFINE_DACVAR(ULONG, PTR_ReadyToRunJitManager, ExecutionManager__m_pReadyToRunJitManager, ExecutionManager::m_pReadyToRunJitManager)
 #endif
 
-DEFINE_DACVAR_NO_DUMP(ULONG, VMHELPDEF *, dac__hlpFuncTable)
-DEFINE_DACVAR(ULONG, VMHELPDEF *, dac__hlpDynamicFuncTable)
+DEFINE_DACVAR_NO_DUMP(ULONG, VMHELPDEF *, dac__hlpFuncTable, ::hlpFuncTable)
+DEFINE_DACVAR(ULONG, VMHELPDEF *, dac__hlpDynamicFuncTable, ::hlpDynamicFuncTable)
 
 #ifdef FEATURE_INCLUDE_ALL_INTERFACES
-DEFINE_DACVAR(ULONG, PTR_ConnectionNameTable, CCLRDebugManager__m_pConnectionNameHash)
+DEFINE_DACVAR(ULONG, PTR_ConnectionNameTable, CCLRDebugManager__m_pConnectionNameHash, CCLRDebugManager::m_pConnectionNameHash)
 #endif // FEATURE_INCLUDE_ALL_INTERFACES
-DEFINE_DACVAR(ULONG, PTR_StubManager, StubManager__g_pFirstManager)
-DEFINE_DACVAR(ULONG, PTR_PrecodeStubManager, PrecodeStubManager__g_pManager)
-DEFINE_DACVAR(ULONG, PTR_StubLinkStubManager, StubLinkStubManager__g_pManager)
-DEFINE_DACVAR(ULONG, PTR_ThunkHeapStubManager, ThunkHeapStubManager__g_pManager)
-DEFINE_DACVAR(ULONG, PTR_JumpStubStubManager, JumpStubStubManager__g_pManager)
-DEFINE_DACVAR(ULONG, PTR_RangeSectionStubManager, RangeSectionStubManager__g_pManager)
-DEFINE_DACVAR(ULONG, PTR_DelegateInvokeStubManager, DelegateInvokeStubManager__g_pManager)
-DEFINE_DACVAR(ULONG, PTR_VirtualCallStubManagerManager, VirtualCallStubManagerManager__g_pManager)
-
-DEFINE_DACVAR(ULONG, PTR_ThreadStore, ThreadStore__s_pThreadStore)
-
-DEFINE_DACVAR(ULONG, int, ThreadpoolMgr__cpuUtilization)
-DEFINE_DACVAR(ULONG, ThreadpoolMgr::ThreadCounter, ThreadpoolMgr__WorkerCounter)
-DEFINE_DACVAR(ULONG, int, ThreadpoolMgr__MinLimitTotalWorkerThreads)
-DEFINE_DACVAR(ULONG, DWORD, ThreadpoolMgr__MaxLimitTotalWorkerThreads)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_WorkRequest*/, ThreadpoolMgr__WorkRequestHead) // PTR_WorkRequest is not defined. So use a pointer type
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE  /*PTR_WorkRequest*/, ThreadpoolMgr__WorkRequestTail) // 
-DEFINE_DACVAR(ULONG, ThreadpoolMgr::ThreadCounter, ThreadpoolMgr__CPThreadCounter)
-DEFINE_DACVAR(ULONG, LONG, ThreadpoolMgr__MaxFreeCPThreads)
-DEFINE_DACVAR(ULONG, LONG, ThreadpoolMgr__MaxLimitTotalCPThreads)
-DEFINE_DACVAR(ULONG, LONG, ThreadpoolMgr__MinLimitTotalCPThreads)        
-DEFINE_DACVAR(ULONG, LIST_ENTRY, ThreadpoolMgr__TimerQueue)        
-DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__HillClimbingLog)
-DEFINE_DACVAR(ULONG, int, dac__HillClimbingLogFirstIndex)        
-DEFINE_DACVAR(ULONG, int, dac__HillClimbingLogSize)        
-
-DEFINE_DACVAR(ULONG, PTR_Thread, dac__g_pFinalizerThread)
-DEFINE_DACVAR(ULONG, PTR_Thread, dac__g_pSuspensionThread)
+DEFINE_DACVAR(ULONG, PTR_StubManager, StubManager__g_pFirstManager, StubManager::g_pFirstManager)
+DEFINE_DACVAR(ULONG, PTR_PrecodeStubManager, PrecodeStubManager__g_pManager, PrecodeStubManager::g_pManager)
+DEFINE_DACVAR(ULONG, PTR_StubLinkStubManager, StubLinkStubManager__g_pManager, StubLinkStubManager::g_pManager)
+DEFINE_DACVAR(ULONG, PTR_ThunkHeapStubManager, ThunkHeapStubManager__g_pManager, ThunkHeapStubManager::g_pManager)
+DEFINE_DACVAR(ULONG, PTR_JumpStubStubManager, JumpStubStubManager__g_pManager, JumpStubStubManager::g_pManager)
+DEFINE_DACVAR(ULONG, PTR_RangeSectionStubManager, RangeSectionStubManager__g_pManager, RangeSectionStubManager::g_pManager)
+DEFINE_DACVAR(ULONG, PTR_DelegateInvokeStubManager, DelegateInvokeStubManager__g_pManager, DelegateInvokeStubManager::g_pManager)
+DEFINE_DACVAR(ULONG, PTR_VirtualCallStubManagerManager, VirtualCallStubManagerManager__g_pManager, VirtualCallStubManagerManager::g_pManager)
+
+DEFINE_DACVAR(ULONG, PTR_ThreadStore, ThreadStore__s_pThreadStore, ThreadStore::s_pThreadStore)
+
+DEFINE_DACVAR(ULONG, int, ThreadpoolMgr__cpuUtilization, ThreadpoolMgr::cpuUtilization)
+DEFINE_DACVAR(ULONG, ThreadpoolMgr::ThreadCounter, ThreadpoolMgr__WorkerCounter, ThreadpoolMgr::WorkerCounter)
+DEFINE_DACVAR(ULONG, int, ThreadpoolMgr__MinLimitTotalWorkerThreads, ThreadpoolMgr::MinLimitTotalWorkerThreads)
+DEFINE_DACVAR(ULONG, DWORD, ThreadpoolMgr__MaxLimitTotalWorkerThreads, ThreadpoolMgr::MaxLimitTotalWorkerThreads)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_WorkRequest*/, ThreadpoolMgr__WorkRequestHead, ThreadpoolMgr::WorkRequestHead)  // PTR_WorkRequest is not defined. So use a pointer type
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE  /*PTR_WorkRequest*/, ThreadpoolMgr__WorkRequestTail, ThreadpoolMgr::WorkRequestTail) // 
+DEFINE_DACVAR(ULONG, ThreadpoolMgr::ThreadCounter, ThreadpoolMgr__CPThreadCounter, ThreadpoolMgr::CPThreadCounter)
+DEFINE_DACVAR(ULONG, LONG, ThreadpoolMgr__MaxFreeCPThreads, ThreadpoolMgr::MaxFreeCPThreads)
+DEFINE_DACVAR(ULONG, LONG, ThreadpoolMgr__MaxLimitTotalCPThreads, ThreadpoolMgr::MaxLimitTotalCPThreads)
+DEFINE_DACVAR(ULONG, LONG, ThreadpoolMgr__MinLimitTotalCPThreads, ThreadpoolMgr::MinLimitTotalCPThreads)
+DEFINE_DACVAR(ULONG, LIST_ENTRY, ThreadpoolMgr__TimerQueue, ThreadpoolMgr::TimerQueue)
+DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__HillClimbingLog, ::HillClimbingLog)
+DEFINE_DACVAR(ULONG, int, dac__HillClimbingLogFirstIndex, ::HillClimbingLogFirstIndex)
+DEFINE_DACVAR(ULONG, int, dac__HillClimbingLogSize, ::HillClimbingLogSize)
+
+DEFINE_DACVAR(ULONG, PTR_Thread, dac__g_pFinalizerThread, ::g_pFinalizerThread)
+DEFINE_DACVAR(ULONG, PTR_Thread, dac__g_pSuspensionThread, ::g_pSuspensionThread)
 
 #ifdef FEATURE_SVR_GC
-DEFINE_DACVAR(ULONG, DWORD, GCHeap__gcHeapType)
+DEFINE_DACVAR(ULONG, DWORD, GCHeap__gcHeapType, GCHeap::gcHeapType)
 #endif // FEATURE_SVR_GC
 
-DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__alloc_allocated)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_heap_segment*/, WKS__gc_heap__ephemeral_heap_segment)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_CFinalize*/, WKS__gc_heap__finalize_queue)
+DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__alloc_allocated, WKS::gc_heap::alloc_allocated)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_heap_segment*/, WKS__gc_heap__ephemeral_heap_segment, WKS::gc_heap::ephemeral_heap_segment)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_CFinalize*/, WKS__gc_heap__finalize_queue, WKS::gc_heap::finalize_queue)
 
 // Can not use MULTIPLE_HEAPS here because desktop build contains it is not defined for workstation GC
 // but we include workstation GC in mscorwks.dll.
 #ifdef FEATURE_SVR_GC
-DEFINE_DACVAR(ULONG, int, SVR__gc_heap__n_heaps)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*(PTR_gc_heap*)*/, SVR__gc_heap__g_heaps)
+DEFINE_DACVAR_SVR(ULONG, int, SVR__gc_heap__n_heaps, SVR::gc_heap::n_heaps)
+DEFINE_DACVAR_SVR(ULONG, UNKNOWN_POINTER_TYPE /*(PTR_gc_heap*)*/, SVR__gc_heap__g_heaps, SVR::gc_heap::g_heaps)
 #endif // FEATURE_SVR_GC
-DEFINE_DACVAR(ULONG, oom_history, WKS__gc_heap__oom_info)
+DEFINE_DACVAR(ULONG, oom_history, WKS__gc_heap__oom_info, WKS::gc_heap::oom_info)
 
-DEFINE_DACVAR(ULONG, PTR_SystemDomain, SystemDomain__m_pSystemDomain)
-DEFINE_DACVAR(ULONG, ArrayListStatic, SystemDomain__m_appDomainIndexList)
-DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceDebug)
-DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceProfiling)
-DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceInstrument)
-DEFINE_DACVAR(ULONG, PTR_SharedDomain, SharedDomain__m_pSharedDomain)
+DEFINE_DACVAR(ULONG, PTR_SystemDomain, SystemDomain__m_pSystemDomain, SystemDomain::m_pSystemDomain)
+DEFINE_DACVAR(ULONG, ArrayListStatic, SystemDomain__m_appDomainIndexList, SystemDomain::m_appDomainIndexList)
+DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceDebug, SystemDomain::s_fForceDebug)
+DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceProfiling, SystemDomain::s_fForceProfiling)
+DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceInstrument, SystemDomain::s_fForceInstrument)
+DEFINE_DACVAR(ULONG, PTR_SharedDomain, SharedDomain__m_pSharedDomain, SharedDomain::m_pSharedDomain)
 
 
-DEFINE_DACVAR(ULONG, DWORD, CExecutionEngine__TlsIndex)
+DEFINE_DACVAR(ULONG, DWORD, CExecutionEngine__TlsIndex, CExecutionEngine::TlsIndex)
 
-DEFINE_DACVAR(ULONG, LONG, CNameSpace__m_GcStructuresInvalidCnt)
+DEFINE_DACVAR(ULONG, LONG, CNameSpace__m_GcStructuresInvalidCnt, CNameSpace::m_GcStructuresInvalidCnt)
 
 #if defined(FEATURE_INCLUDE_ALL_INTERFACES) || defined(FEATURE_WINDOWSPHONE)
-DEFINE_DACVAR(ULONG, int, CCLRErrorReportingManager__g_ECustomDumpFlavor)
+DEFINE_DACVAR(ULONG, int, CCLRErrorReportingManager__g_ECustomDumpFlavor, CCLRErrorReportingManager::g_ECustomDumpFlavor)
 #endif
 
-DEFINE_DACVAR(ULONG, PTR_SString, SString__s_Empty)
+DEFINE_DACVAR(ULONG, PTR_SString, SString__s_Empty, SString::s_Empty)
 
 #ifdef FEATURE_APPX
 #if defined(FEATURE_CORECLR)
-DEFINE_DACVAR(ULONG, BOOL, dac__g_fAppX)
+DEFINE_DACVAR(ULONG, BOOL, dac__g_fAppX, ::g_fAppX)
 #else
-DEFINE_DACVAR(ULONG, PTR_AppXRTInfo, dac__g_pAppXRTInfo)
+DEFINE_DACVAR(ULONG, PTR_AppXRTInfo, dac__g_pAppXRTInfo, ::g_pAppXRTInfo)
 #endif
 #endif // FEATURE_APPX
 
-DEFINE_DACVAR(ULONG, BOOL, SString__s_IsANSIMultibyte)
+DEFINE_DACVAR(ULONG, BOOL, SString__s_IsANSIMultibyte, SString::s_IsANSIMultibyte)
 
 #ifdef FEATURE_REMOTING
-DEFINE_DACVAR_NO_DUMP(ULONG, MethodTable, CTPMethodTable__s_pThunkTable)
+DEFINE_DACVAR_NO_DUMP(ULONG, MethodTable, CTPMethodTable__s_pThunkTable, CTPMethodTable::s_pThunkTable)
 #endif // FEATURE_REMOTING
 
-DEFINE_DACVAR(ULONG, INT32, ArrayBase__s_arrayBoundsZero)
+DEFINE_DACVAR(ULONG, INT32, ArrayBase__s_arrayBoundsZero, ArrayBase::s_arrayBoundsZero)
 
-DEFINE_DACVAR(ULONG, BOOL, StackwalkCache__s_Enabled)
+DEFINE_DACVAR(ULONG, BOOL, StackwalkCache__s_Enabled, StackwalkCache::s_Enabled)
 
-DEFINE_DACVAR(ULONG, PTR_JITNotification, dac__g_pNotificationTable)
-DEFINE_DACVAR(ULONG, ULONG32, dac__g_dacNotificationFlags)
-DEFINE_DACVAR(ULONG, PTR_GcNotification, dac__g_pGcNotificationTable)
+DEFINE_DACVAR(ULONG, PTR_JITNotification, dac__g_pNotificationTable, ::g_pNotificationTable)
+DEFINE_DACVAR(ULONG, ULONG32, dac__g_dacNotificationFlags, ::g_dacNotificationFlags)
+DEFINE_DACVAR(ULONG, PTR_GcNotification, dac__g_pGcNotificationTable, ::g_pGcNotificationTable)
 
 #ifndef FEATURE_IMPLICIT_TLS
-DEFINE_DACVAR(ULONG, DWORD, dac__gThreadTLSIndex)
-DEFINE_DACVAR(ULONG, DWORD, dac__gAppDomainTLSIndex)
+DEFINE_DACVAR(ULONG, DWORD, dac__gThreadTLSIndex, ::gThreadTLSIndex)
+DEFINE_DACVAR(ULONG, DWORD, dac__gAppDomainTLSIndex, ::gAppDomainTLSIndex)
 #endif
 
-DEFINE_DACVAR(ULONG, PTR_EEConfig, dac__g_pConfig)
+DEFINE_DACVAR(ULONG, PTR_EEConfig, dac__g_pConfig, ::g_pConfig)
 
-DEFINE_DACVAR(ULONG, MscorlibBinder, dac__g_Mscorlib)
+DEFINE_DACVAR(ULONG, MscorlibBinder, dac__g_Mscorlib, ::g_Mscorlib)
 
 #if defined(PROFILING_SUPPORTED) || defined(PROFILING_SUPPORTED_DATA)
-DEFINE_DACVAR(ULONG, ProfControlBlock, dac__g_profControlBlock)
+DEFINE_DACVAR(ULONG, ProfControlBlock, dac__g_profControlBlock, ::g_profControlBlock)
 #endif // defined(PROFILING_SUPPORTED) || defined(PROFILING_SUPPORTED_DATA)
 
-DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__generation_table)
-DEFINE_DACVAR(ULONG, PTR_DWORD, dac__g_card_table)
-DEFINE_DACVAR(ULONG, PTR_BYTE, dac__g_lowest_address)
-DEFINE_DACVAR(ULONG, PTR_BYTE, dac__g_highest_address)
-
-DEFINE_DACVAR(ULONG, GCHeap, dac__g_pGCHeap)
-
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThinLockThreadIdDispenser)    
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pModuleIndexDispenser)    
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pRuntimeTypeClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pCanonMethodTableClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStringClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pArrayClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pSZArrayHelperClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pNullableClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExceptionClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThreadAbortExceptionClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pOutOfMemoryExceptionClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStackOverflowExceptionClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExecutionEngineExceptionClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDelegateClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pMulticastDelegateClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pFreeObjectMethodTable)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pOverlappedDataClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pValueTypeClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEnumClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThreadClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pCriticalFinalizerObjectClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pAsyncFileStream_AsyncResultClass)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pPredefinedArrayTypes)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_ArgumentHandleMT)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_ArgIteratorMT)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_TypedReferenceMT)
+DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__generation_table, WKS::generation_table)
+DEFINE_DACVAR(ULONG, PTR_DWORD, dac__g_card_table, ::g_card_table)
+DEFINE_DACVAR(ULONG, PTR_BYTE, dac__g_lowest_address, ::g_lowest_address)
+DEFINE_DACVAR(ULONG, PTR_BYTE, dac__g_highest_address, ::g_highest_address)
+
+DEFINE_DACVAR(ULONG, GCHeap, dac__g_pGCHeap, ::g_pGCHeap)
+
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThinLockThreadIdDispenser, ::g_pThinLockThreadIdDispenser)    
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pModuleIndexDispenser, ::g_pModuleIndexDispenser)    
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectClass, ::g_pObjectClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pRuntimeTypeClass, ::g_pRuntimeTypeClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pCanonMethodTableClass, ::g_pCanonMethodTableClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStringClass, ::g_pStringClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pArrayClass, ::g_pArrayClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pSZArrayHelperClass, ::g_pSZArrayHelperClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pNullableClass, ::g_pNullableClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExceptionClass, ::g_pExceptionClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThreadAbortExceptionClass, ::g_pThreadAbortExceptionClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pOutOfMemoryExceptionClass, ::g_pOutOfMemoryExceptionClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStackOverflowExceptionClass, ::g_pStackOverflowExceptionClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExecutionEngineExceptionClass, ::g_pExecutionEngineExceptionClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDelegateClass, ::g_pDelegateClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pMulticastDelegateClass, ::g_pMulticastDelegateClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pFreeObjectMethodTable, ::g_pFreeObjectMethodTable)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pOverlappedDataClass, ::g_pOverlappedDataClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pValueTypeClass, ::g_pValueTypeClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEnumClass, ::g_pEnumClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThreadClass, ::g_pThreadClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pCriticalFinalizerObjectClass, ::g_pCriticalFinalizerObjectClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pAsyncFileStream_AsyncResultClass, ::g_pAsyncFileStream_AsyncResultClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pPredefinedArrayTypes, ::g_pPredefinedArrayTypes)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_ArgumentHandleMT, ::g_ArgumentHandleMT)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_ArgIteratorMT, ::g_ArgIteratorMT)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_TypedReferenceMT, ::g_TypedReferenceMT)
 
 #ifdef FEATURE_COMINTEROP
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pBaseCOMObject)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pBaseRuntimeClass)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pBaseCOMObject, ::g_pBaseCOMObject)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pBaseRuntimeClass, ::g_pBaseRuntimeClass)
 #endif
 
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pPrepareConstrainedRegionsMethod)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExecuteBackoutCodeHelperMethod)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pPrepareConstrainedRegionsMethod, ::g_pPrepareConstrainedRegionsMethod)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExecuteBackoutCodeHelperMethod, ::g_pExecuteBackoutCodeHelperMethod)
 
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectCtorMD)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectFinalizerMD)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectCtorMD, ::g_pObjectCtorMD)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectFinalizerMD, ::g_pObjectFinalizerMD)
 
-DEFINE_DACVAR(ULONG, bool, dac__g_fProcessDetach)
-DEFINE_DACVAR(ULONG, DWORD, dac__g_fEEShutDown)
-DEFINE_DACVAR(ULONG, DWORD, dac__g_fHostConfig)
+DEFINE_DACVAR(ULONG, bool, dac__g_fProcessDetach, ::g_fProcessDetach)
+DEFINE_DACVAR(ULONG, DWORD, dac__g_fEEShutDown, ::g_fEEShutDown)
+DEFINE_DACVAR(ULONG, DWORD, dac__g_fHostConfig, ::g_fHostConfig)
 
-DEFINE_DACVAR(ULONG, ULONG, dac__g_CORDebuggerControlFlags)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDebugger)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDebugInterface)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEEDbgInterfaceImpl)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEEInterface)
+DEFINE_DACVAR(ULONG, ULONG, dac__g_CORDebuggerControlFlags, ::g_CORDebuggerControlFlags)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDebugger, ::g_pDebugger)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pDebugInterface, ::g_pDebugInterface)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEEDbgInterfaceImpl, ::g_pEEDbgInterfaceImpl)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEEInterface, ::g_pEEInterface)
 
-DEFINE_DACVAR(ULONG, BOOL, Debugger__s_fCanChangeNgenFlags)
+DEFINE_DACVAR(ULONG, BOOL, Debugger__s_fCanChangeNgenFlags, Debugger::s_fCanChangeNgenFlags)
 
-DEFINE_DACVAR(ULONG, PTR_DebuggerPatchTable, DebuggerController__g_patches)
-DEFINE_DACVAR(ULONG, BOOL, DebuggerController__g_patchTableValid)
+DEFINE_DACVAR(ULONG, PTR_DebuggerPatchTable, DebuggerController__g_patches, DebuggerController::g_patches)
+DEFINE_DACVAR(ULONG, BOOL, DebuggerController__g_patchTableValid, DebuggerController::g_patchTableValid)
 
 
-DEFINE_DACVAR(ULONG, SIZE_T, dac__gLowestFCall)
-DEFINE_DACVAR(ULONG, SIZE_T, dac__gHighestFCall)
-DEFINE_DACVAR(ULONG, SIZE_T, dac__gFCallMethods)
+DEFINE_DACVAR(ULONG, SIZE_T, dac__gLowestFCall, ::gLowestFCall)
+DEFINE_DACVAR(ULONG, SIZE_T, dac__gHighestFCall, ::gHighestFCall)
+DEFINE_DACVAR(ULONG, SIZE_T, dac__gFCallMethods, ::gFCallMethods)
 
-DEFINE_DACVAR(ULONG, PTR_SyncTableEntry, dac__g_pSyncTable)
+DEFINE_DACVAR(ULONG, PTR_SyncTableEntry, dac__g_pSyncTable, ::g_pSyncTable)
 #ifdef FEATURE_COMINTEROP
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pRCWCleanupList)
-DEFINE_DACVAR(ULONG, BOOL, RCWWalker__s_bIsGlobalPeggingOn);
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pRCWCleanupList, ::g_pRCWCleanupList)
+DEFINE_DACVAR(ULONG, BOOL, RCWWalker__s_bIsGlobalPeggingOn, RCWWalker::s_bIsGlobalPeggingOn)
 #endif // FEATURE_COMINTEROP
 
 #ifndef FEATURE_PAL
-DEFINE_DACVAR(ULONG, SIZE_T, dac__g_runtimeLoadedBaseAddress)
-DEFINE_DACVAR(ULONG, SIZE_T, dac__g_runtimeVirtualSize)
+DEFINE_DACVAR(ULONG, SIZE_T, dac__g_runtimeLoadedBaseAddress, ::g_runtimeLoadedBaseAddress)
+DEFINE_DACVAR(ULONG, SIZE_T, dac__g_runtimeVirtualSize, ::g_runtimeVirtualSize)
 #endif // !FEATURE_PAL
 
-DEFINE_DACVAR(ULONG, SyncBlockCache *, SyncBlockCache__s_pSyncBlockCache)
+DEFINE_DACVAR(ULONG, SyncBlockCache *, SyncBlockCache__s_pSyncBlockCache, SyncBlockCache::s_pSyncBlockCache)
 
-DEFINE_DACVAR(ULONG, HandleTableMap, dac__g_HandleTableMap)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStressLog)
+DEFINE_DACVAR(ULONG, HandleTableMap, dac__g_HandleTableMap, ::g_HandleTableMap)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStressLog, ::g_pStressLog)
 
-DEFINE_DACVAR(ULONG, SIZE_T, dac__s_gsCookie)
+DEFINE_DACVAR(ULONG, SIZE_T, dac__s_gsCookie, ::s_gsCookie)
 
 #ifdef FEATURE_IPCMAN
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pIPCManagerInterface)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pIPCManagerInterface, ::g_pIPCManagerInterface)
 #endif // FEATURE_IPCMAN
 
-DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__g_FCDynamicallyAssignedImplementations)
+DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__g_FCDynamicallyAssignedImplementations, ::g_FCDynamicallyAssignedImplementations)
 
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*BYTE**/, WKS__gc_heap__internal_root_array)
-DEFINE_DACVAR(ULONG, size_t, WKS__gc_heap__internal_root_array_index)
-DEFINE_DACVAR(ULONG, ULONG, WKS__gc_heap__heap_analyze_success)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*BYTE**/, WKS__gc_heap__internal_root_array, WKS::gc_heap::internal_root_array)
+DEFINE_DACVAR(ULONG, size_t, WKS__gc_heap__internal_root_array_index, WKS::gc_heap::internal_root_array_index)
+DEFINE_DACVAR(ULONG, ULONG, WKS__gc_heap__heap_analyze_success, WKS::gc_heap::heap_analyze_success)
 
-DEFINE_DACVAR(ULONG, SIZE_T, WKS__gc_heap__mark_array)
-DEFINE_DACVAR(ULONG, SIZE_T, WKS__gc_heap__current_c_gc_state)
-DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__next_sweep_obj)
-DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /* PTR_heap_segment */, WKS__gc_heap__saved_sweep_ephemeral_seg)
-DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__saved_sweep_ephemeral_start)
-DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__background_saved_lowest_address)
-DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__background_saved_highest_address)
+DEFINE_DACVAR(ULONG, SIZE_T, WKS__gc_heap__mark_array, WKS::gc_heap::mark_array)
+DEFINE_DACVAR(ULONG, SIZE_T, WKS__gc_heap__current_c_gc_state, WKS::gc_heap::current_c_gc_state)
+DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__next_sweep_obj, WKS::gc_heap::next_sweep_obj)
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /* PTR_heap_segment */, WKS__gc_heap__saved_sweep_ephemeral_seg, WKS::gc_heap::saved_sweep_ephemeral_seg)
+DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__saved_sweep_ephemeral_start, WKS::gc_heap::saved_sweep_ephemeral_start)
+DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__background_saved_lowest_address, WKS::gc_heap::background_saved_lowest_address)
+DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__background_saved_highest_address, WKS::gc_heap::background_saved_highest_address)
 
 #ifdef FEATURE_CORECLR
-DEFINE_DACVAR(ULONG, HANDLE, dac__g_hContinueStartupEvent)
-DEFINE_DACVAR(ULONG, DWORD, CorHost2__m_dwStartupFlags)
+DEFINE_DACVAR(ULONG, HANDLE, dac__g_hContinueStartupEvent, ::g_hContinueStartupEvent)
+DEFINE_DACVAR(ULONG, DWORD, CorHost2__m_dwStartupFlags, CorHost2::m_dwStartupFlags)
 #endif // FEATURE_CORECLR
 
-DEFINE_DACVAR(ULONG, HRESULT, dac__g_hrFatalError)
+DEFINE_DACVAR(ULONG, HRESULT, dac__g_hrFatalError, ::g_hrFatalError)
 
 #if defined(DEBUGGING_SUPPORTED) && defined (FEATURE_PREJIT)
-    DEFINE_DACVAR(ULONG, DWORD, PEFile__s_NGENDebugFlags)
+    DEFINE_DACVAR(ULONG, DWORD, PEFile__s_NGENDebugFlags, PEFile::s_NGENDebugFlags)
 #endif //defined(DEBUGGING_SUPPORTED) && defined (FEATURE_PREJIT)
 
 #ifndef FEATURE_CORECLR
-DEFINE_DACVAR(ULONG, DWORD, AssemblyUsageLogManager__s_UsageLogFlags)
+DEFINE_DACVAR(ULONG, DWORD, AssemblyUsageLogManager__s_UsageLogFlags, AssemblyUsageLogManager::s_UsageLogFlags)
 #endif // FEATURE_CORECLR
 
 #if defined(FEATURE_HOSTED_BINDER) && defined(FEATURE_APPX_BINDER)
-DEFINE_DACVAR(ULONG, PTR_CLRPrivBinderAppX, CLRPrivBinderAppX__s_pSingleton)
+DEFINE_DACVAR(ULONG, PTR_CLRPrivBinderAppX, CLRPrivBinderAppX__s_pSingleton, CLRPrivBinderAppX::s_pSingleton)
 #endif //defined(FEATURE_HOSTED_BINDER) && defined(FEATURE_APPX)
 
 #ifdef FEATURE_MINIMETADATA_IN_TRIAGEDUMPS
-DEFINE_DACVAR(ULONG, DWORD, dac__g_MiniMetaDataBuffMaxSize)
-DEFINE_DACVAR(ULONG, TADDR, dac__g_MiniMetaDataBuffAddress)
+DEFINE_DACVAR(ULONG, DWORD, dac__g_MiniMetaDataBuffMaxSize, ::g_MiniMetaDataBuffMaxSize)
+DEFINE_DACVAR(ULONG, TADDR, dac__g_MiniMetaDataBuffAddress, ::g_MiniMetaDataBuffAddress)
 #endif // FEATURE_MINIMETADATA_IN_TRIAGEDUMPS
 
 #undef DEFINE_DACVAR
+#undef DEFINE_DACVAR_SVR
 #undef DEFINE_DACVAR_NO_DUMP
index b88af6f..9143729 100644 (file)
@@ -133,7 +133,7 @@ enum GenericParamContextType
 
 class ICodeManager
 {
-    VPTR_BASE_VTABLE_CLASS(ICodeManager)
+    VPTR_BASE_VTABLE_CLASS_AND_CTOR(ICodeManager)
 
 public:
 
@@ -353,7 +353,7 @@ struct hdrInfo;
 
 class EECodeManager : public ICodeManager {
 
-    VPTR_VTABLE_CLASS(EECodeManager, ICodeManager)
+    VPTR_VTABLE_CLASS_AND_CTOR(EECodeManager, ICodeManager)
 
 public:
 
index 31329e2..a42d711 100644 (file)
@@ -73,6 +73,8 @@ typedef const UTF8 *LPCUTF8;
 typedef DPTR(class SString) PTR_SString;
 class SString : private SBuffer
 {
+    friend struct _DacGlobals;
+
 private:
     enum Representation
     {
@@ -757,7 +759,6 @@ private:
     SString(void *buffer, COUNT_T size);
 
  private:
     static int CaseCompareHelperA(const CHAR *buffer1, const CHAR *buffer2, COUNT_T count, LocaleID lcid, BOOL stopOnNull, BOOL stopOnCount);
     static int CaseCompareHelper(const WCHAR *buffer1, const WCHAR *buffer2, COUNT_T count, LocaleID lcid, BOOL stopOnNull, BOOL stopOnCount);
     
index a5198bb..352f6f8 100644 (file)
@@ -153,5 +153,7 @@ VPTR_CLASS(GlobalLoaderAllocator)
 VPTR_CLASS(AppDomainLoaderAllocator)
 VPTR_CLASS(AssemblyLoaderAllocator)
 
+#ifndef FEATURE_PAL
 VPTR_CLASS(AssemblySecurityDescriptor)
 VPTR_CLASS(ApplicationSecurityDescriptor)
+#endif // FEATURE_PAL
index de924fc..8516ce9 100644 (file)
@@ -566,6 +566,30 @@ PAL_DeleteExecWatchpoint(
 
 
 PALIMPORT
+DWORD
+PALAPI
+PAL_PublishDacTableAddress(
+    IN PVOID address,
+    IN ULONG size
+    );
+
+PALIMPORT
+DWORD
+PALAPI
+PAL_GetDacTableAddress(
+    IN DWORD pid,
+    OUT PVOID *pAddress,
+    OUT PULONG pSize
+    );
+
+PALIMPORT
+VOID
+PALAPI
+PAL_CleanupDacTableAddress(
+    );
+
+
+PALIMPORT
 BOOL
 PALAPI
 PAL_RegisterMacEHPort();
index 721bbba..d65233e 100644 (file)
@@ -89,6 +89,7 @@ set(SOURCES
   misc/fmtmessage.cpp
   misc/interlock.cpp
   misc/miscpalapi.cpp
+  misc/dactableaddress.cpp
   misc/strutil.cpp
   misc/sysinfo.cpp
   misc/time.cpp
diff --git a/src/pal/src/misc/dactableaddress.cpp b/src/pal/src/misc/dactableaddress.cpp
new file mode 100644 (file)
index 0000000..43ef7d6
--- /dev/null
@@ -0,0 +1,163 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information. 
+//
+
+/*++
+
+
+
+Module Name:
+
+    dactableaddress.cpp
+
+Abstract:
+
+    Functions to write and read DAC global pointer table address between the coreclr
+    and DAC/debugger processes.
+
+NOTE:
+
+   These functions are temporary until a better way to plumb the DAC table
+   address from the debuggee to debugger processes is implemented.
+
+Revision History:
+
+
+--*/
+
+#include "pal/palinternal.h"
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdio.h>
+
+/*++
+Function
+    PAL_PublishDacTableAddress
+
+Parameters
+
+    address
+       [in] address of dac table
+    size
+       [in] size of dac table
+
+Return Values
+   pal errors
+
+--*/
+PALIMPORT
+DWORD
+PALAPI
+PAL_PublishDacTableAddress(
+    IN PVOID address,
+    IN ULONG size)
+{
+    DWORD ret = NO_ERROR;
+
+    // TODO - 3/5/15 - the DAC side needs the debuggee pid
+    // pid_t pid = getpid();
+    pid_t pid = 0;
+    char fileName[100]; 
+    snprintf(fileName, sizeof(fileName), "/tmp/%d_dacTable", pid);
+
+    FILE *file = fopen(fileName, "w+");
+    if (file != nullptr) 
+    {
+        char dacTableAddress[100]; 
+        snprintf(dacTableAddress, sizeof(dacTableAddress), "%p %d\n", address, size);
+
+        if (fputs(dacTableAddress, file) < 0)
+        {
+            ret = ERROR_INVALID_DATA;
+        }
+
+        fclose(file);
+    }
+    else
+    {
+        ret = ERROR_FILE_NOT_FOUND;
+    }
+
+    return ret;
+}
+
+
+/*++
+Function
+    PAL_GetDacTableAddress
+
+Parameters
+
+    pid
+       [in] process id to get the data
+    pAddress
+       [out] pointer to put DAC table address
+    pSize
+       [out] pointer to put DAC table size
+
+Return Values
+   pal errors
+
+--*/
+PALIMPORT
+DWORD
+PALAPI
+PAL_GetDacTableAddress(
+    IN DWORD pid,
+    OUT PVOID *pAddress,
+    OUT PULONG pSize)
+{
+    DWORD ret = NO_ERROR;
+
+    char fileName[100]; 
+    snprintf(fileName, sizeof(fileName), "/tmp/%d_dacTable", pid);
+
+    FILE *file = fopen(fileName, "r");
+    if (file != nullptr) 
+    {
+        char data[100]; 
+        if (fgets(data, sizeof(data), file) != nullptr)
+        {
+            if (sscanf(data, "%p %d\n", pAddress, pSize) != 2)
+            {
+                ret = ERROR_INVALID_DATA;
+            }
+        }
+        else
+        {
+            ret = ERROR_INVALID_DATA;
+        }
+
+        fclose(file);
+    }
+    else
+    {
+        ret = ERROR_FILE_NOT_FOUND;
+    }
+    return ret;
+}
+
+/*++
+Function
+    PAL_CleanupDacTableAddress
+
+Parameters
+    None
+
+Return Values
+   None
+
+--*/
+PALIMPORT
+VOID
+PALAPI
+PAL_CleanupDacTableAddress()
+{
+    //pid_t pid = getpid();
+    pid_t pid = 0;
+    char fileName[100]; 
+    snprintf(fileName, sizeof(fileName), "/tmp/%d_dacTable", pid);
+
+    remove(fileName);
+}
index 66a595f..757fde3 100644 (file)
@@ -1,5 +1,3 @@
-remove_definitions(-DPROFILING_SUPPORTED)
-add_definitions(-DPROFILING_SUPPORTED_DATA)
-add_definitions(-DDACCESS_COMPILE)
+include(${CLR_DIR}/dac.cmake)
 
 add_library(unwinder_dac_amd64 ${UNWINDER_SOURCES})
index 24c86e9..0e96665 100644 (file)
@@ -5162,8 +5162,7 @@ typedef VPTR(class SharedDomain) PTR_SharedDomain;
 
 class SharedDomain : public BaseDomain
 {
-
-    VPTR_VTABLE_CLASS(SharedDomain, BaseDomain)
+    VPTR_VTABLE_CLASS_AND_CTOR(SharedDomain, BaseDomain)
 
 public:
 
index e4f7005..9a6a54f 100644 (file)
@@ -57,6 +57,8 @@ void InnerCoEEShutDownCOM();
 //        how the g_pCEE and related variables are initialized.
 class CExecutionEngine : public IExecutionEngine, public IEEMemoryManager
 {
+    friend struct _DacGlobals;
+
     //***************************************************************************
     // public API:
     //***************************************************************************
index e7ba84b..a28c556 100644 (file)
@@ -390,10 +390,7 @@ class CodeHeap
     VPTR_BASE_VTABLE_CLASS(CodeHeap)
 
 public:
-
-#ifdef DACCESS_COMPILE
     CodeHeap() {}
-#endif
 
     // virtual dtor. Clean up heap
     virtual ~CodeHeap() {}
@@ -1143,6 +1140,7 @@ public:
 class ExecutionManager
 {
     friend class CorExternalDataAccess;
+    friend struct _DacGlobals;
 
 #ifdef DACCESS_COMPILE
     friend class ClrDataAccess;
@@ -1282,7 +1280,7 @@ public:
                           LoaderAllocator *pLoaderAllocator = NULL);
 #endif
 
-private :
+private:
     static RangeSection * FindCodeRangeWithLock(PCODE currentPC);
 
     static BOOL IsManagedCodeWithLock(PCODE currentPC);
index da50066..010cb5f 100644 (file)
@@ -473,11 +473,12 @@ public:
         LIMITED_METHOD_CONTRACT;
     };
 
+#endif
+
     Crst() {
         LIMITED_METHOD_CONTRACT;
     }
 
-#endif
 #endif // CLR_STANDALONE_BINDER
 };
 
index fb3e167..4d55f74 100644 (file)
@@ -28,7 +28,7 @@ typedef void (*FAVORCALLBACK)(void *);
 
 class DebugInterface
 {
-    VPTR_BASE_VTABLE_CLASS(DebugInterface);
+    VPTR_BASE_VTABLE_CLASS_AND_CTOR(DebugInterface);
 
 public:
 
index f300a0f..e6678a8 100644 (file)
@@ -63,7 +63,7 @@ struct DebugOffsetToHandlerInfo
 
 class EEDebugInterface
 {
-    VPTR_BASE_VTABLE_CLASS(EEDebugInterface);
+    VPTR_BASE_VTABLE_CLASS_AND_CTOR(EEDebugInterface);
 
 public:
 
index 5b59f89..f743dd0 100644 (file)
@@ -36,7 +36,7 @@
 
 class EEDbgInterfaceImpl : public EEDebugInterface
 {
-    VPTR_VTABLE_CLASS(EEDbgInterfaceImpl, EEDebugInterface);
+    VPTR_VTABLE_CLASS_AND_CTOR(EEDbgInterfaceImpl, EEDebugInterface);
 
 public:
 
@@ -48,7 +48,7 @@ public:
     static FORCEINLINE void Init(void)
     {
         g_pEEDbgInterfaceImpl = new EEDbgInterfaceImpl(); // new throws on failure
-        }
+    }
 
     //
     // Cleanup any global data used by this interface.
index 4930944..2669a54 100644 (file)
@@ -747,6 +747,7 @@ class ArrayBase : public Object
     friend OBJECTREF FastAllocatePrimitiveArray(MethodTable* arrayType, DWORD cElements, BOOL bAllocateInLargeHeap);
     friend class JIT_TrialAlloc;
     friend class CheckAsmOffsets;
+    friend struct _DacGlobals;
 
 private:
     // This MUST be the first field, so that it directly follows Object.  This is because
index a62ba77..8f8a5f3 100644 (file)
@@ -108,7 +108,6 @@ class PEFile
     // ------------------------------------------------------------
     // SOS support
     // ------------------------------------------------------------
-
     VPTR_BASE_CONCRETE_VTABLE_CLASS(PEFile)
 
 public:
index a2272ea..2497b8c 100644 (file)
@@ -32,6 +32,8 @@
 //
 class RCWWalker
 {
+    friend struct _DacGlobals;
+
 private :
     static VolatilePtr<IJupiterGCManager>  s_pGCManager;            // The one and only GCManager instance
     static BOOL                     s_bGCStarted;                   // Has GC started?    
index 2b9e63c..9331a68 100644 (file)
@@ -246,7 +246,9 @@ namespace Security
 class ISecurityDescriptor
 {
 public:
+#ifndef FEATURE_PAL
     VPTR_BASE_VTABLE_CLASS(ISecurityDescriptor)
+#endif
     virtual ~ISecurityDescriptor() { LIMITED_METHOD_CONTRACT; }
 
     virtual BOOL IsFullyTrusted() = 0;
@@ -274,7 +276,9 @@ public:
 class IApplicationSecurityDescriptor : public ISecurityDescriptor
 {
 public:
+#ifndef FEATURE_PAL
     VPTR_ABSTRACT_VTABLE_CLASS(IApplicationSecurityDescriptor, ISecurityDescriptor)
+#endif
 
 #ifndef DACCESS_COMPILE
 public:
@@ -318,7 +322,9 @@ public:
 class IAssemblySecurityDescriptor : public ISecurityDescriptor
 {
 public:
+#ifndef FEATURE_PAL
     VPTR_ABSTRACT_VTABLE_CLASS(IAssemblySecurityDescriptor, ISecurityDescriptor)
+#endif
 
 #ifndef DACCESS_COMPILE
     virtual SharedSecurityDescriptor *GetSharedSecDesc() = 0;
index 22aecf5..5d52f04 100644 (file)
@@ -139,7 +139,9 @@ template<typename IT>
 class SecurityDescriptorBase : public IT, public SecurityDescriptor
 {
 public:
+#ifndef FEATURE_PAL
     VPTR_ABSTRACT_VTABLE_CLASS(SecurityDescriptorBase, IT) // needed for the DAC
+#endif
 
     inline SecurityDescriptorBase(AppDomain *pAppDomain, DomainAssembly *pAssembly, PEFile* pPEFile, LoaderAllocator *pLoaderAllocator);
 
index d39cf0e..6deab32 100644 (file)
@@ -36,7 +36,9 @@
 class ApplicationSecurityDescriptor : public SecurityDescriptorBase<IApplicationSecurityDescriptor>
 {
 public:
+#ifndef FEATURE_PAL
     VPTR_VTABLE_CLASS(ApplicationSecurityDescriptor, SecurityDescriptorBase<IApplicationSecurityDescriptor>)
+#endif
 
 private:
     // Dependency in managed : System.Security.HostSecurityManager.cs
index 306ac24..3687538 100644 (file)
@@ -57,7 +57,9 @@ void StoreObjectInLazyHandle(LOADERHANDLE& handle, OBJECTREF ref, LoaderAllocato
 class AssemblySecurityDescriptor : public SecurityDescriptorBase<IAssemblySecurityDescriptor>
 {
 public:
+#ifndef FEATURE_PAL
     VPTR_VTABLE_CLASS(AssemblySecurityDescriptor, SecurityDescriptorBase<IAssemblySecurityDescriptor>)
+#endif
 
 private:
     PsetCacheEntry*   m_arrPassedLinktimeDemands[MAX_PASSED_DEMANDS];
index 4566bcd..6363d60 100644 (file)
@@ -163,7 +163,6 @@ public:
 #endif
     }
 
-#ifdef DACCESS_COMPILE
     // Special empty CTOR for DAC. We still need to assign to const fields, but they won't actually be used.
     SimpleRWLock()  
         : m_gcMode(COOPERATIVE_OR_PREEMPTIVE)
@@ -174,7 +173,6 @@ public:
         m_countNoTriggerGC = 0;
 #endif //_DEBUG
     }
-#endif
     
 #ifndef DACCESS_COMPILE
     // Acquire the reader lock.
index f2be145..89829a8 100644 (file)
@@ -199,6 +199,8 @@ static_assert_no_msg(sizeof(StackwalkCacheEntry) == 2 * sizeof(UINT_PTR));
 
 class StackwalkCache 
 {
+    friend struct _DacGlobals;
+
     public:
         BOOL Lookup(UINT_PTR IP);
         void Insert(StackwalkCacheEntry *pCacheEntry);
index 70405dd..00743e2 100644 (file)
@@ -194,6 +194,7 @@ typedef VPTR(class StubManager) PTR_StubManager;
 class StubManager
 {
     friend class StubManagerIterator;
+
     VPTR_BASE_VTABLE_CLASS(StubManager)
     
   public:
@@ -319,7 +320,7 @@ public:
     // This is used by DAC to provide more information on who owns a stub.
     virtual LPCWSTR GetStubManagerName(PCODE addr) = 0;
 #endif
-
 private:
     SPTR_DECL(StubManager, g_pFirstManager);
     PTR_StubManager m_pNextManager;
index 20d2412..22fd6e0 100644 (file)
@@ -104,7 +104,7 @@ class ThreadpoolMgr
     friend class ManagedPerAppDomainTPCount;
     friend class PerAppDomainTPCountList;
     friend class HillClimbing;
-
+    friend struct _DacGlobals;
 
     //
     // UnfairSemaphore is a more scalable semaphore than CLRSemaphore.  It prefers to release threads that have more recently begun waiting,
@@ -1291,8 +1291,8 @@ private:
 
     static LONG Initialization;                         // indicator of whether the threadpool is initialized.
 
-    SVAL_DECL(LONG,MinLimitTotalWorkerThreads);          // same as MinLimitTotalCPThreads
-    SVAL_DECL(LONG,MaxLimitTotalWorkerThreads);        // same as MaxLimitTotalCPThreads
+    SVAL_DECL(LONG,MinLimitTotalWorkerThreads);         // same as MinLimitTotalCPThreads
+    SVAL_DECL(LONG,MaxLimitTotalWorkerThreads);         // same as MaxLimitTotalCPThreads
         
     static Volatile<unsigned int> LastDequeueTime;      // used to determine if work items are getting thread starved 
     
@@ -1306,12 +1306,10 @@ private:
 
     static int ThreadAdjustmentInterval;
 
-    private:
-
     SPTR_DECL(WorkRequest,WorkRequestHead);             // Head of work request queue
     SPTR_DECL(WorkRequest,WorkRequestTail);             // Head of work request queue
 
-    static unsigned int LastCPThreadCreation;              // last time a completion port thread was created
+    static unsigned int LastCPThreadCreation;          // last time a completion port thread was created
     static unsigned int NumberOfProcessors;             // = NumberOfWorkerThreads - no. of blocked threads
 
     static BOOL IsApcPendingOnWaitThread;               // Indicates if an APC is pending on the wait thread
@@ -1323,9 +1321,8 @@ public:
     static CrstStatic WorkerCriticalSection;
 
 private:
-
     static const DWORD WorkerTimeout = 20 * 1000;
-    static const DWORD WorkerTimeoutAppX = 5 * 1000; // shorter timeout to allow threads to exit prior to app suspension
+    static const DWORD WorkerTimeoutAppX = 5 * 1000;    // shorter timeout to allow threads to exit prior to app suspension
 
     SVAL_DECL(ThreadCounter,WorkerCounter);
 
@@ -1361,10 +1358,10 @@ private:
     static BOOL InitCompletionPortThreadpool;           // flag indicating whether completion port threadpool has been initialized
     static HANDLE GlobalCompletionPort;                 // used for binding io completions on file handles
 
-    public:
+public:
     SVAL_DECL(ThreadCounter,CPThreadCounter);
 
-    private:
+private:
     SVAL_DECL(LONG,MaxLimitTotalCPThreads);             // = MaxLimitCPThreadsPerCPU * number of CPUS
     SVAL_DECL(LONG,MinLimitTotalCPThreads);             
     SVAL_DECL(LONG,MaxFreeCPThreads);                   // = MaxFreeCPThreadsPerCPU * Number of CPUS