Chromium Code Reviews| Index: src/IceGlobalContext.cpp |
| diff --git a/src/IceGlobalContext.cpp b/src/IceGlobalContext.cpp |
| index 88519d138d1a54aa2829a8f164b03d82e7d55516..6dd03754705d5eab402cbbb383ffd80d8fe7189b 100644 |
| --- a/src/IceGlobalContext.cpp |
| +++ b/src/IceGlobalContext.cpp |
| @@ -48,14 +48,13 @@ template <> struct hash<Ice::RelocatableTuple> { |
| return hash<Ice::IceString>()(Key.EmitString); |
| } |
| - assert(!Key.OffsetExpr.empty()); |
| - if (Key.OffsetExpr[0]->hasOffset()) { |
| - return hash<Ice::IceString>()(Key.Name) + |
| - hash<Ice::RelocOffsetT>()(Key.OffsetExpr[0]->getOffset()); |
| - } |
| - |
| + // If there's no emit string, then we use the relocatable's name, plus the |
| + // hash of a combination of the number of OffsetExprs and the known, fixed |
| + // offset for the reloc. We left shift the known relocatable by 5 trying to |
| + // minimize the interation between the bits in OffsetExpr.size() and |
|
Jim Stichnoth
2016/02/24 23:23:32
interaction
John
2016/02/24 23:46:05
Done.
|
| + // Key.Offset. |
| return hash<Ice::IceString>()(Key.Name) + |
| - hash<std::size_t>()(Key.OffsetExpr.size()); |
| + hash<std::size_t>()(Key.OffsetExpr.size() + (Key.Offset << 5)); |
| } |
| }; |
| } // end of namespace std |
| @@ -293,7 +292,7 @@ GlobalContext::GlobalContext(Ostream *OsDump, Ostream *OsEmit, Ostream *OsError, |
| void GlobalContext::translateFunctions() { |
| while (std::unique_ptr<Cfg> Func = optQueueBlockingPop()) { |
| // Install Func in TLS for Cfg-specific container allocators. |
| - Cfg::setCurrentCfg(Func.get()); |
| + CfgLocalAllocatorScope _(Func.get()); |
| // Reset per-function stats being accumulated in TLS. |
| resetStats(); |
| // Set verbose level to none if the current function does NOT |
| @@ -309,7 +308,6 @@ void GlobalContext::translateFunctions() { |
| !matchSymbolName(Func->getFunctionName(), |
| getFlags().getTranslateOnly())) { |
| Func->dump(); |
| - Cfg::setCurrentCfg(nullptr); |
| continue; // Func goes out of scope and gets deleted |
| } |
| @@ -348,7 +346,6 @@ void GlobalContext::translateFunctions() { |
| break; |
| } |
| } |
| - Cfg::setCurrentCfg(nullptr); |
| assert(Item); |
| emitQueueBlockingPush(Item); |
| // The Cfg now gets deleted as Func goes out of scope. |
| @@ -557,9 +554,8 @@ void GlobalContext::emitItems() { |
| // Unfortunately, we have to temporarily install the Cfg in TLS |
| // because Variable::asType() uses the allocator to create the |
| // differently-typed copy. |
| - Cfg::setCurrentCfg(Func.get()); |
| + CfgLocalAllocatorScope _(Func.get()); |
| Func->emit(); |
| - Cfg::setCurrentCfg(nullptr); |
| dumpStats(Func->getFunctionNameAndSize()); |
| } break; |
| } |
| @@ -795,28 +791,28 @@ Constant *GlobalContext::getConstantDouble(double ConstantDouble) { |
| return getConstPool()->Doubles.getOrAdd(this, ConstantDouble); |
| } |
| -Constant *GlobalContext::getConstantSym(const RelocOffsetArray &Offset, |
| +Constant *GlobalContext::getConstantSym(const RelocOffsetT Offset, |
| + const RelocOffsetArray &OffsetExpr, |
| const IceString &Name, |
| const IceString &EmitString, |
| bool SuppressMangling) { |
| return getConstPool()->Relocatables.getOrAdd( |
| - this, RelocatableTuple(Offset, Name, EmitString, SuppressMangling)); |
| + this, |
| + RelocatableTuple(Offset, OffsetExpr, Name, EmitString, SuppressMangling)); |
| } |
| Constant *GlobalContext::getConstantSym(RelocOffsetT Offset, |
| const IceString &Name, |
| bool SuppressMangling) { |
| constexpr char EmptyEmitString[] = ""; |
| - return getConstantSym({RelocOffset::create(this, Offset)}, Name, |
| - EmptyEmitString, SuppressMangling); |
| + return getConstantSym(Offset, {}, Name, EmptyEmitString, SuppressMangling); |
| } |
| Constant *GlobalContext::getConstantExternSym(const IceString &Name) { |
| constexpr RelocOffsetT Offset = 0; |
| constexpr bool SuppressMangling = true; |
| return getConstPool()->ExternRelocatables.getOrAdd( |
| - this, RelocatableTuple({RelocOffset::create(this, Offset)}, Name, |
| - SuppressMangling)); |
| + this, RelocatableTuple(Offset, {}, Name, SuppressMangling)); |
| } |
| Constant *GlobalContext::getConstantUndef(Type Ty) { |