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: ILInstrumentation.h
6//
7// ===========================================================================
8
9
10
11#ifndef IL_INSTRUMENTATION_H
12#define IL_INSTRUMENTATION_H
13
14// declare an array type of COR_IL_MAP entries
15typedef ArrayDPTR(COR_IL_MAP) ARRAY_PTR_COR_IL_MAP;
16
17//---------------------------------------------------------------------------------------
18//
19// A profiler may instrument a method by changing the IL. This is typically done when the profiler receives
20// a JITCompilationStarted notification. The profiler also has the option to provide the runtime with
21// a mapping between original IL offsets and instrumented IL offsets. This struct is a simple container
22// for storing the mapping information. We store the mapping information on the Module class, where it can
23// be accessed by the debugger from out-of-process.
24//
25
26class InstrumentedILOffsetMapping
27{
28public:
29 InstrumentedILOffsetMapping();
30
31 // Check whether there is any mapping information stored in this object.
32 BOOL IsNull() const;
33
34#if !defined(DACCESS_COMPILE)
35 // Release the memory used by the array of COR_IL_MAPs.
36 void Clear();
37
38 void SetMappingInfo(SIZE_T cMap, COR_IL_MAP * rgMap);
39#endif // !DACCESS_COMPILE
40
41 SIZE_T GetCount() const;
42 ARRAY_PTR_COR_IL_MAP GetOffsets() const;
43
44private:
45 SIZE_T m_cMap; // the number of elements in m_rgMap
46 ARRAY_PTR_COR_IL_MAP m_rgMap; // an array of COR_IL_MAPs
47};
48
49//---------------------------------------------------------------------------------------
50//
51// Hash table entry for storing InstrumentedILOffsetMapping. This is keyed by the MethodDef token.
52//
53
54struct ILOffsetMappingEntry
55{
56 ILOffsetMappingEntry()
57 {
58 LIMITED_METHOD_DAC_CONTRACT;
59
60 m_methodToken = mdMethodDefNil;
61 // No need to initialize m_mapping. The default ctor of InstrumentedILOffsetMapping does the job.
62 }
63
64 ILOffsetMappingEntry(mdMethodDef token, InstrumentedILOffsetMapping mapping)
65 {
66 LIMITED_METHOD_DAC_CONTRACT;
67
68 m_methodToken = token;
69 m_mapping = mapping;
70 }
71
72 mdMethodDef m_methodToken;
73 InstrumentedILOffsetMapping m_mapping;
74};
75
76//---------------------------------------------------------------------------------------
77//
78// This class is used to create the hash table for the instrumented IL offset mapping.
79// It encapsulates the desired behaviour of the templated hash table and implements
80// the various functions needed by the hash table.
81//
82
83class ILOffsetMappingTraits : public NoRemoveSHashTraits<DefaultSHashTraits<ILOffsetMappingEntry> >
84{
85public:
86 typedef mdMethodDef key_t;
87
88 static key_t GetKey(element_t e)
89 {
90 LIMITED_METHOD_DAC_CONTRACT;
91 return e.m_methodToken;
92 }
93 static BOOL Equals(key_t k1, key_t k2)
94 {
95 LIMITED_METHOD_DAC_CONTRACT;
96 return (k1 == k2);
97 }
98 static count_t Hash(key_t k)
99 {
100 LIMITED_METHOD_DAC_CONTRACT;
101 return (count_t)(size_t)k;
102 }
103 static const element_t Null()
104 {
105 LIMITED_METHOD_DAC_CONTRACT;
106 ILOffsetMappingEntry e;
107 return e;
108 }
109 static bool IsNull(const element_t &e) { LIMITED_METHOD_DAC_CONTRACT; return e.m_methodToken == mdMethodDefNil; }
110};
111
112// Hash table of profiler-provided instrumented IL offset mapping, keyed by the MethodDef token
113typedef SHash<ILOffsetMappingTraits> ILOffsetMappingTable;
114typedef DPTR(ILOffsetMappingTable) PTR_ILOffsetMappingTable;
115
116#endif // IL_INSTRUMENTATION_H
117