OLD | NEW |
1 //===- subzero/src/IceGlobalContext.cpp - Global context defs -------------===// | 1 //===- subzero/src/IceGlobalContext.cpp - Global context defs -------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file defines aspects of the compilation that persist across | 10 // This file defines aspects of the compilation that persist across |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 } | 113 } |
114 }; | 114 }; |
115 | 115 |
116 // TypePool maps constants of type KeyType (e.g. float) to pointers to | 116 // TypePool maps constants of type KeyType (e.g. float) to pointers to |
117 // type ValueType (e.g. ConstantFloat). | 117 // type ValueType (e.g. ConstantFloat). |
118 template <Type Ty, typename KeyType, typename ValueType> class TypePool { | 118 template <Type Ty, typename KeyType, typename ValueType> class TypePool { |
119 TypePool(const TypePool &) = delete; | 119 TypePool(const TypePool &) = delete; |
120 TypePool &operator=(const TypePool &) = delete; | 120 TypePool &operator=(const TypePool &) = delete; |
121 | 121 |
122 public: | 122 public: |
123 TypePool() : NextPoolID(0) {} | 123 TypePool() = default; |
124 ValueType *getOrAdd(GlobalContext *Ctx, KeyType Key) { | 124 ValueType *getOrAdd(GlobalContext *Ctx, KeyType Key) { |
125 auto Iter = Pool.find(Key); | 125 auto Iter = Pool.find(Key); |
126 if (Iter != Pool.end()) | 126 if (Iter != Pool.end()) |
127 return Iter->second; | 127 return Iter->second; |
128 ValueType *Result = ValueType::create(Ctx, Ty, Key, NextPoolID++); | 128 ValueType *Result = ValueType::create(Ctx, Ty, Key, NextPoolID++); |
129 Pool[Key] = Result; | 129 Pool[Key] = Result; |
130 return Result; | 130 return Result; |
131 } | 131 } |
132 ConstantList getConstantPool() const { | 132 ConstantList getConstantPool() const { |
133 ConstantList Constants; | 133 ConstantList Constants; |
(...skipping 11 matching lines...) Expand all Loading... |
145 // Use the default hash function, and a custom key comparison | 145 // Use the default hash function, and a custom key comparison |
146 // function. The key comparison function for floating point | 146 // function. The key comparison function for floating point |
147 // variables can't use the default == based implementation because | 147 // variables can't use the default == based implementation because |
148 // of special C++ semantics regarding +0.0, -0.0, and NaN | 148 // of special C++ semantics regarding +0.0, -0.0, and NaN |
149 // comparison. However, it's OK to use the default hash for | 149 // comparison. However, it's OK to use the default hash for |
150 // floating point values because KeyCompare is the final source of | 150 // floating point values because KeyCompare is the final source of |
151 // truth - in the worst case a "false" collision must be resolved. | 151 // truth - in the worst case a "false" collision must be resolved. |
152 typedef std::unordered_map<KeyType, ValueType *, std::hash<KeyType>, | 152 typedef std::unordered_map<KeyType, ValueType *, std::hash<KeyType>, |
153 KeyCompare<KeyType>> ContainerType; | 153 KeyCompare<KeyType>> ContainerType; |
154 ContainerType Pool; | 154 ContainerType Pool; |
155 uint32_t NextPoolID; | 155 uint32_t NextPoolID = 0; |
156 }; | 156 }; |
157 | 157 |
158 // UndefPool maps ICE types to the corresponding ConstantUndef values. | 158 // UndefPool maps ICE types to the corresponding ConstantUndef values. |
159 class UndefPool { | 159 class UndefPool { |
160 UndefPool(const UndefPool &) = delete; | 160 UndefPool(const UndefPool &) = delete; |
161 UndefPool &operator=(const UndefPool &) = delete; | 161 UndefPool &operator=(const UndefPool &) = delete; |
162 | 162 |
163 public: | 163 public: |
164 UndefPool() : NextPoolID(0), Pool(IceType_NUM) {} | 164 UndefPool() : Pool(IceType_NUM) {} |
165 | 165 |
166 ConstantUndef *getOrAdd(GlobalContext *Ctx, Type Ty) { | 166 ConstantUndef *getOrAdd(GlobalContext *Ctx, Type Ty) { |
167 if (Pool[Ty] == nullptr) | 167 if (Pool[Ty] == nullptr) |
168 Pool[Ty] = ConstantUndef::create(Ctx, Ty, NextPoolID++); | 168 Pool[Ty] = ConstantUndef::create(Ctx, Ty, NextPoolID++); |
169 return Pool[Ty]; | 169 return Pool[Ty]; |
170 } | 170 } |
171 | 171 |
172 private: | 172 private: |
173 uint32_t NextPoolID; | 173 uint32_t NextPoolID = 0; |
174 std::vector<ConstantUndef *> Pool; | 174 std::vector<ConstantUndef *> Pool; |
175 }; | 175 }; |
176 | 176 |
177 } // end of anonymous namespace | 177 } // end of anonymous namespace |
178 | 178 |
179 // The global constant pool bundles individual pools of each type of | 179 // The global constant pool bundles individual pools of each type of |
180 // interest. | 180 // interest. |
181 class ConstantPool { | 181 class ConstantPool { |
182 ConstantPool(const ConstantPool &) = delete; | 182 ConstantPool(const ConstantPool &) = delete; |
183 ConstantPool &operator=(const ConstantPool &) = delete; | 183 ConstantPool &operator=(const ConstantPool &) = delete; |
184 | 184 |
185 public: | 185 public: |
186 ConstantPool() {} | 186 ConstantPool() = default; |
187 TypePool<IceType_f32, float, ConstantFloat> Floats; | 187 TypePool<IceType_f32, float, ConstantFloat> Floats; |
188 TypePool<IceType_f64, double, ConstantDouble> Doubles; | 188 TypePool<IceType_f64, double, ConstantDouble> Doubles; |
189 TypePool<IceType_i1, int8_t, ConstantInteger32> Integers1; | 189 TypePool<IceType_i1, int8_t, ConstantInteger32> Integers1; |
190 TypePool<IceType_i8, int8_t, ConstantInteger32> Integers8; | 190 TypePool<IceType_i8, int8_t, ConstantInteger32> Integers8; |
191 TypePool<IceType_i16, int16_t, ConstantInteger32> Integers16; | 191 TypePool<IceType_i16, int16_t, ConstantInteger32> Integers16; |
192 TypePool<IceType_i32, int32_t, ConstantInteger32> Integers32; | 192 TypePool<IceType_i32, int32_t, ConstantInteger32> Integers32; |
193 TypePool<IceType_i64, int64_t, ConstantInteger64> Integers64; | 193 TypePool<IceType_i64, int64_t, ConstantInteger64> Integers64; |
194 TypePool<IceType_i32, RelocatableTuple, ConstantRelocatable> Relocatables; | 194 TypePool<IceType_i32, RelocatableTuple, ConstantRelocatable> Relocatables; |
195 TypePool<IceType_i32, RelocatableTuple, ConstantRelocatable> | 195 TypePool<IceType_i32, RelocatableTuple, ConstantRelocatable> |
196 ExternRelocatables; | 196 ExternRelocatables; |
(...skipping 20 matching lines...) Expand all Loading... |
217 GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError, | 217 GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError, |
218 ELFStreamer *ELFStr, const ClFlags &Flags) | 218 ELFStreamer *ELFStr, const ClFlags &Flags) |
219 : ConstPool(new ConstantPool()), ErrorStatus(), StrDump(OsDump), | 219 : ConstPool(new ConstantPool()), ErrorStatus(), StrDump(OsDump), |
220 StrEmit(OsEmit), StrError(OsError), Flags(Flags), | 220 StrEmit(OsEmit), StrError(OsError), Flags(Flags), |
221 RNG(Flags.getRandomSeed()), ObjectWriter(), | 221 RNG(Flags.getRandomSeed()), ObjectWriter(), |
222 OptQ(/*Sequential=*/Flags.isSequential(), | 222 OptQ(/*Sequential=*/Flags.isSequential(), |
223 /*MaxSize=*/Flags.getNumTranslationThreads()), | 223 /*MaxSize=*/Flags.getNumTranslationThreads()), |
224 // EmitQ is allowed unlimited size. | 224 // EmitQ is allowed unlimited size. |
225 EmitQ(/*Sequential=*/Flags.isSequential()), | 225 EmitQ(/*Sequential=*/Flags.isSequential()), |
226 DataLowering(TargetDataLowering::createLowering(this)), | 226 DataLowering(TargetDataLowering::createLowering(this)), |
227 HasSeenCode(false), | 227 ProfileBlockInfoVarDecl(VariableDeclaration::create()) { |
228 ProfileBlockInfoVarDecl(VariableDeclaration::create()), | |
229 RandomizationCookie(0) { | |
230 assert(OsDump && "OsDump is not defined for GlobalContext"); | 228 assert(OsDump && "OsDump is not defined for GlobalContext"); |
231 assert(OsEmit && "OsEmit is not defined for GlobalContext"); | 229 assert(OsEmit && "OsEmit is not defined for GlobalContext"); |
232 assert(OsError && "OsError is not defined for GlobalContext"); | 230 assert(OsError && "OsError is not defined for GlobalContext"); |
233 // Make sure thread_local fields are properly initialized before any | 231 // Make sure thread_local fields are properly initialized before any |
234 // accesses are made. Do this here instead of at the start of | 232 // accesses are made. Do this here instead of at the start of |
235 // main() so that all clients (e.g. unit tests) can benefit for | 233 // main() so that all clients (e.g. unit tests) can benefit for |
236 // free. | 234 // free. |
237 GlobalContext::TlsInit(); | 235 GlobalContext::TlsInit(); |
238 Cfg::TlsInit(); | 236 Cfg::TlsInit(); |
239 // Create a new ThreadContext for the current thread. No need to | 237 // Create a new ThreadContext for the current thread. No need to |
(...skipping 663 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 Ctx = Func->getContext(); | 901 Ctx = Func->getContext(); |
904 Active = | 902 Active = |
905 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled(); | 903 Func->getFocusedTiming() || Ctx->getFlags().getSubzeroTimingEnabled(); |
906 if (Active) | 904 if (Active) |
907 Ctx->pushTimer(ID, StackID); | 905 Ctx->pushTimer(ID, StackID); |
908 } | 906 } |
909 | 907 |
910 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); | 908 ICE_TLS_DEFINE_FIELD(GlobalContext::ThreadContext *, GlobalContext, TLS); |
911 | 909 |
912 } // end of namespace Ice | 910 } // end of namespace Ice |
OLD | NEW |