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#ifndef CompilerBitSetTraits_DEFINED
6#define CompilerBitSetTraits_DEFINED 1
7
8#include "bitset.h"
9#include "compiler.h"
10#include "bitsetasshortlong.h"
11
12///////////////////////////////////////////////////////////////////////////////
13//
14// CompAllocBitSetTraits: a base class for other BitSet traits classes.
15//
16// The classes in this file define "BitSetTraits" arguments to the "BitSetOps" type, ones that assume that
17// Compiler* is the "Env" type.
18//
19// This class just wraps the compiler's allocator.
20//
21class CompAllocBitSetTraits
22{
23public:
24 static inline void* Alloc(Compiler* comp, size_t byteSize);
25
26#ifdef DEBUG
27 static inline void* DebugAlloc(Compiler* comp, size_t byteSize);
28#endif // DEBUG
29};
30
31///////////////////////////////////////////////////////////////////////////////
32//
33// TrackedVarBitSetTraits
34//
35// This class is customizes the bit set to represent sets of tracked local vars.
36// The size of the bitset is determined by the # of tracked locals (up to some internal
37// maximum), and the Compiler* tracks the tracked local epochs.
38//
39class TrackedVarBitSetTraits : public CompAllocBitSetTraits
40{
41public:
42 static inline unsigned GetSize(Compiler* comp);
43
44 static inline unsigned GetArrSize(Compiler* comp, unsigned elemSize);
45
46 static inline unsigned GetEpoch(class Compiler* comp);
47
48 static inline BitSetSupport::BitSetOpCounter* GetOpCounter(Compiler* comp);
49};
50
51///////////////////////////////////////////////////////////////////////////////
52//
53// AllVarBitSetTraits
54//
55// This class is customizes the bit set to represent sets of all local vars (tracked or not) --
56// at least up to some maximum index. (This index is private to the Compiler, and it is
57// the responsibility of the compiler not to use indices >= this maximum.)
58// We rely on the fact that variables are never deleted, and therefore use the
59// total # of locals as the epoch number (up to the maximum).
60//
61class AllVarBitSetTraits : public CompAllocBitSetTraits
62{
63public:
64 static inline unsigned GetSize(Compiler* comp);
65
66 static inline unsigned GetArrSize(Compiler* comp, unsigned elemSize);
67
68 static inline unsigned GetEpoch(class Compiler* comp);
69
70 static inline BitSetSupport::BitSetOpCounter* GetOpCounter(Compiler* comp);
71};
72
73///////////////////////////////////////////////////////////////////////////////
74//
75// BasicBlockBitSetTraits
76//
77// This class is customizes the bit set to represent sets of BasicBlocks.
78// The size of the bitset is determined by maximum assigned BasicBlock number
79// (Compiler::fgBBNumMax) (Note that fgBBcount is not equal to this during inlining,
80// when fgBBcount is the number of blocks in the inlined function, but the assigned
81// block numbers are higher than the inliner function. fgBBNumMax counts both.
82// Thus, if you only care about the inlinee, during inlining, this bit set will waste
83// the lower numbered block bits.) The Compiler* tracks the BasicBlock epochs.
84//
85class BasicBlockBitSetTraits : public CompAllocBitSetTraits
86{
87public:
88 static inline unsigned GetSize(Compiler* comp);
89
90 static inline unsigned GetArrSize(Compiler* comp, unsigned elemSize);
91
92 static inline unsigned GetEpoch(class Compiler* comp);
93
94 static inline BitSetSupport::BitSetOpCounter* GetOpCounter(Compiler* comp);
95};
96
97///////////////////////////////////////////////////////////////////////////////
98//
99// BitVecTraits
100//
101// This class simplifies creation and usage of "ShortLong" bitsets.
102//
103struct BitVecTraits
104{
105private:
106 unsigned size;
107 Compiler* comp;
108
109public:
110 BitVecTraits(unsigned size, Compiler* comp) : size(size), comp(comp)
111 {
112 }
113
114 static inline void* Alloc(BitVecTraits* b, size_t byteSize);
115
116#ifdef DEBUG
117 static inline void* DebugAlloc(BitVecTraits* b, size_t byteSize);
118#endif // DEBUG
119
120 static inline unsigned GetSize(BitVecTraits* b);
121
122 static inline unsigned GetArrSize(BitVecTraits* b, unsigned elemSize);
123
124 static inline unsigned GetEpoch(BitVecTraits* b);
125
126 static inline BitSetSupport::BitSetOpCounter* GetOpCounter(BitVecTraits* b);
127};
128
129#endif // CompilerBitSetTraits_DEFINED
130