1// Licensed to the .NET Foundation under one or more agreements.
2// The .NET Foundation licenses this file to you under the MIT license.
3// See the LICENSE file in the project root for more information.
4//*****************************************************************************
5// File: dacglobals.cpp
6//
7
8//
9// The DAC global pointer table
10//
11//*****************************************************************************
12
13#include "stdafx.h"
14#include <daccess.h>
15
16// This header include will need to be rmeoved as part of GitHub#12170.
17// The only reason it's here now is that this file references the GC-private
18// variable g_HandleTableMap.
19#include "../../gc/objecthandle.h"
20#include "../../vm/virtualcallstub.h"
21#include "../../vm/win32threadpool.h"
22#include "../../vm/hillclimbing.h"
23#include "../../vm/codeman.h"
24#include "../../vm/eedbginterfaceimpl.h"
25#include "../../vm/common.h"
26#include "../../vm/gcenv.h"
27#include "../../vm/ecall.h"
28#include "../../vm/rcwwalker.h"
29
30#ifdef DEBUGGING_SUPPORTED
31
32extern PTR_ECHash gFCallMethods;
33extern TADDR gLowestFCall;
34extern TADDR gHighestFCall;
35extern PCODE g_FCDynamicallyAssignedImplementations;
36extern DWORD gThreadTLSIndex;
37extern DWORD gAppDomainTLSIndex;
38
39#ifdef FEATURE_APPX
40extern BOOL g_fAppX;
41#endif // FEATURE_APPX
42
43DacGlobals g_dacTable;
44
45// DAC global pointer table initialization
46void DacGlobals::Initialize()
47{
48 TADDR baseAddress = PTR_TO_TADDR(PAL_GetSymbolModuleBase((void *)DacGlobals::Initialize));
49 g_dacTable.InitializeEntries(baseAddress);
50}
51
52// Initializes the non-SVR table entries
53void DacGlobals::InitializeEntries(TADDR baseAddress)
54{
55#define DEFINE_DACVAR(id_type, size, id, var) id = PTR_TO_TADDR(&var) - baseAddress;
56#define DEFINE_DACVAR_NO_DUMP(id_type, size, id, var) id = PTR_TO_TADDR(&var) - baseAddress;
57#include "dacvars.h"
58
59#define VPTR_CLASS(name) \
60 { \
61 void *pBuf = _alloca(sizeof(name)); \
62 name *dummy = new (pBuf) name(0); \
63 name##__vtAddr = PTR_TO_TADDR(*((PVOID*)dummy)) - baseAddress; \
64 }
65#define VPTR_MULTI_CLASS(name, keyBase) \
66 { \
67 void *pBuf = _alloca(sizeof(name)); \
68 name *dummy = new (pBuf) name(0); \
69 name##__##keyBase##__mvtAddr = PTR_TO_TADDR(*((PVOID*)dummy)) - baseAddress; \
70 }
71#include <vptr_list.h>
72#undef VPTR_CLASS
73#undef VPTR_MULTI_CLASS
74}
75
76#endif // DEBUGGER_SUPPORTED
77