Fix reading Time zone rules using Julian days (#17672)
[platform/upstream/coreclr.git] / src / jit / compilerbitsettraits.h
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 //
21 class CompAllocBitSetTraits
22 {
23 public:
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 //
39 class TrackedVarBitSetTraits : public CompAllocBitSetTraits
40 {
41 public:
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 //
61 class AllVarBitSetTraits : public CompAllocBitSetTraits
62 {
63 public:
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 //
85 class BasicBlockBitSetTraits : public CompAllocBitSetTraits
86 {
87 public:
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 //
103 struct BitVecTraits
104 {
105 private:
106     unsigned  size;
107     Compiler* comp;
108
109 public:
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