| 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 |