| Index: src/IceGlobalContext.h
|
| diff --git a/src/IceGlobalContext.h b/src/IceGlobalContext.h
|
| index c8d86af669b4c725751609dc121b60138b0813d0..61eb3e1f6c7a4083f81679db2b82b87565110220 100644
|
| --- a/src/IceGlobalContext.h
|
| +++ b/src/IceGlobalContext.h
|
| @@ -57,6 +57,7 @@ public:
|
| ~LockedPtr() { Lock->unlock(); }
|
| T *operator->() const { return Value; }
|
| T &operator*() const { return *Value; }
|
| + T *get() { return Value; }
|
|
|
| private:
|
| T *Value;
|
| @@ -435,6 +436,18 @@ public:
|
| static ClFlags Flags;
|
| static ClFlagsExtra ExtraFlags;
|
|
|
| + /// DisposeGlobalVariablesAfterLowering controls whether the memory used by
|
| + /// GlobaleVariables can be reclaimed right after they have been lowered.
|
| + /// @{
|
| + bool getDisposeGlobalVariablesAfterLowering() const {
|
| + return DisposeGlobalVariablesAfterLowering;
|
| + }
|
| +
|
| + void setDisposeGlobalVariablesAfterLowering(bool Value) {
|
| + DisposeGlobalVariablesAfterLowering = Value;
|
| + }
|
| + /// @}
|
| +
|
| private:
|
| // Try to ensure mutexes are allocated on separate cache lines.
|
|
|
| @@ -445,6 +458,11 @@ private:
|
| ArenaAllocator Allocator;
|
|
|
| ICE_CACHELINE_BOUNDARY;
|
| + // Managed by getInitializerAllocator()
|
| + GlobalLockType InitAllocLock;
|
| + VariableDeclarationList Globals;
|
| +
|
| + ICE_CACHELINE_BOUNDARY;
|
| // Managed by getDestructors()
|
| using DestructorArray = std::vector<std::function<void()>>;
|
| GlobalLockType DestructorsLock;
|
| @@ -499,13 +517,18 @@ private:
|
| // TODO(jpp): move to EmitterContext.
|
| bool HasSeenCode = false;
|
| // TODO(jpp): move to EmitterContext.
|
| - VariableDeclarationList Globals;
|
| - // TODO(jpp): move to EmitterContext.
|
| - VariableDeclaration *ProfileBlockInfoVarDecl;
|
| + VariableDeclaration *ProfileBlockInfoVarDecl = nullptr;
|
| + std::vector<VariableDeclaration *> ProfileBlockInfos;
|
| + /// Indicates if global variable declarations can be disposed of right after
|
| + /// lowering.
|
| + bool DisposeGlobalVariablesAfterLowering = true;
|
|
|
| LockedPtr<ArenaAllocator> getAllocator() {
|
| return LockedPtr<ArenaAllocator>(&Allocator, &AllocLock);
|
| }
|
| + LockedPtr<VariableDeclarationList> getInitializerAllocator() {
|
| + return LockedPtr<VariableDeclarationList>(&Globals, &InitAllocLock);
|
| + }
|
| LockedPtr<ConstantPool> getConstPool() {
|
| return LockedPtr<ConstantPool>(ConstPool.get(), &ConstPoolLock);
|
| }
|
| @@ -523,8 +546,10 @@ private:
|
| }
|
|
|
| void accumulateGlobals(std::unique_ptr<VariableDeclarationList> Globls) {
|
| - if (Globls != nullptr)
|
| - Globals.insert(Globals.end(), Globls->begin(), Globls->end());
|
| + LockedPtr<VariableDeclarationList> _(&Globals, &InitAllocLock);
|
| + if (Globls != nullptr) {
|
| + Globals.merge(Globls.get());
|
| + }
|
| }
|
|
|
| void lowerGlobalsIfNoCodeHasBeenSeen() {
|
| @@ -535,7 +560,7 @@ private:
|
| HasSeenCode = true;
|
| }
|
|
|
| - void addBlockInfoPtrs(VariableDeclaration *ProfileBlockInfo);
|
| + void saveBlockInfoPtrs();
|
|
|
| llvm::SmallVector<ThreadContext *, 128> AllThreadContexts;
|
| llvm::SmallVector<std::thread, 128> TranslationThreads;
|
|
|