diff options
author | Philip Reames <listmail@philipreames.com> | 2015-01-26 18:26:35 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2015-01-26 18:26:35 +0000 |
commit | 56a03938f7a536dc2cef3c42ed67b3f218a1c758 (patch) | |
tree | e999a35203421bc8cc440c5f607197ae265219be /llvm/lib | |
parent | 39571b37a38d289f0895ca060eb1d6f579300af6 (diff) | |
download | bcm5719-llvm-56a03938f7a536dc2cef3c42ed67b3f218a1c758.tar.gz bcm5719-llvm-56a03938f7a536dc2cef3c42ed67b3f218a1c758.zip |
Revert GCStrategy ownership changes
This change reverts the interesting parts of 226311 (and 227046). This change introduced two problems, and I've been convinced that an alternate approach is preferrable anyways.
The bugs were:
- Registery appears to require all users be within the same linkage unit. After this change, asking for "statepoint-example" in Transform/ would sometimes get you nullptr, whereas asking the same question in CodeGen would return the right GCStrategy. The correct long term fix is to get rid of the utter hack which is Registry, but I don't have time for that right now. 227046 appears to have been an attempt to fix this, but I don't believe it does so completely.
- GCMetadataPrinter::finishAssembly was being called more than once per GCStrategy. Each Strategy was being added to the GCModuleInfo multiple times.
Once I get time again, I'm going to split GCModuleInfo into the gc.root specific part and a GCStrategy owning Analysis pass. I'm probably also going to kill off the Registry. Once that's done, I'll move the new GCStrategyAnalysis and all built in GCStrategies into Analysis. (As original suggested by Chandler.) This will accomplish my original goal of being able to access GCStrategy from Transform/ without adding all of the builtin GCs to IR/.
llvm-svn: 227109
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/CodeGen/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/ErlangGC.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GCMetadata.cpp | 34 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GCRootLowering.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/GCStrategy.cpp (renamed from llvm/lib/IR/GCStrategy.cpp) | 4 | ||||
-rw-r--r-- | llvm/lib/CodeGen/OcamlGC.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/ShadowStackGC.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/StatepointExampleGC.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/IR/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/lib/IR/Function.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/IR/LLVMContextImpl.cpp | 23 | ||||
-rw-r--r-- | llvm/lib/IR/LLVMContextImpl.h | 11 |
15 files changed, 33 insertions, 63 deletions
diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 7f7f5225180..f0b2dfe365b 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -23,6 +23,7 @@ add_llvm_library(LLVMCodeGen GCMetadata.cpp GCMetadataPrinter.cpp GCRootLowering.cpp + GCStrategy.cpp GlobalMerge.cpp IfConversion.cpp InlineSpiller.cpp diff --git a/llvm/lib/CodeGen/ErlangGC.cpp b/llvm/lib/CodeGen/ErlangGC.cpp index 30af07f1214..a40bbb5052a 100644 --- a/llvm/lib/CodeGen/ErlangGC.cpp +++ b/llvm/lib/CodeGen/ErlangGC.cpp @@ -16,7 +16,7 @@ #include "llvm/CodeGen/GCs.h" #include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Target/TargetInstrInfo.h" diff --git a/llvm/lib/CodeGen/GCMetadata.cpp b/llvm/lib/CodeGen/GCMetadata.cpp index 7a61d61e7d0..ab8383a45c4 100644 --- a/llvm/lib/CodeGen/GCMetadata.cpp +++ b/llvm/lib/CodeGen/GCMetadata.cpp @@ -14,8 +14,8 @@ #include "llvm/CodeGen/GCMetadata.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Pass.h" #include "llvm/Support/Debug.h" @@ -66,15 +66,7 @@ GCFunctionInfo &GCModuleInfo::getFunctionInfo(const Function &F) { if (I != FInfoMap.end()) return *I->second; - GCStrategy *S = F.getGCStrategy(); - if (!S) { - std::string error = std::string("unsupported GC: ") + F.getGC(); - report_fatal_error(error); - } - // Save the fact this strategy is associated with this module. Note that - // these are non-owning references, the GCStrategy remains owned by the - // Context. - StrategyList.push_back(S); + GCStrategy *S = getGCStrategy(F.getGC()); Functions.push_back(make_unique<GCFunctionInfo>(F, *S)); GCFunctionInfo *GFI = Functions.back().get(); FInfoMap[&F] = GFI; @@ -84,7 +76,7 @@ GCFunctionInfo &GCModuleInfo::getFunctionInfo(const Function &F) { void GCModuleInfo::clear() { Functions.clear(); FInfoMap.clear(); - StrategyList.clear(); + GCStrategyList.clear(); } // ----------------------------------------------------------------------------- @@ -159,3 +151,23 @@ bool Printer::doFinalization(Module &M) { GMI->clear(); return false; } + + +GCStrategy *GCModuleInfo::getGCStrategy(const StringRef Name) { + // TODO: Arguably, just doing a linear search would be faster for small N + auto NMI = GCStrategyMap.find(Name); + if (NMI != GCStrategyMap.end()) + return NMI->getValue(); + + for (auto& Entry : GCRegistry::entries()) { + if (Name == Entry.getName()) { + std::unique_ptr<GCStrategy> S = Entry.instantiate(); + S->Name = Name; + GCStrategyMap[Name] = S.get(); + GCStrategyList.push_back(std::move(S)); + return GCStrategyList.back().get(); + } + } + + report_fatal_error(std::string("unsupported GC: ") + Name); +} diff --git a/llvm/lib/CodeGen/GCRootLowering.cpp b/llvm/lib/CodeGen/GCRootLowering.cpp index 7cb459874ef..ee89ac4e614 100644 --- a/llvm/lib/CodeGen/GCRootLowering.cpp +++ b/llvm/lib/CodeGen/GCRootLowering.cpp @@ -16,9 +16,9 @@ #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineModuleInfo.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/Passes.h" #include "llvm/IR/Dominators.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Module.h" #include "llvm/Support/Debug.h" diff --git a/llvm/lib/IR/GCStrategy.cpp b/llvm/lib/CodeGen/GCStrategy.cpp index b451310f7f0..554d326942e 100644 --- a/llvm/lib/IR/GCStrategy.cpp +++ b/llvm/lib/CodeGen/GCStrategy.cpp @@ -12,9 +12,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/IR/GCStrategy.h" - -template class llvm::Registry<llvm::GCStrategy>; +#include "llvm/CodeGen/GCStrategy.h" using namespace llvm; diff --git a/llvm/lib/CodeGen/OcamlGC.cpp b/llvm/lib/CodeGen/OcamlGC.cpp index 164e3700909..17654a6ac3a 100644 --- a/llvm/lib/CodeGen/OcamlGC.cpp +++ b/llvm/lib/CodeGen/OcamlGC.cpp @@ -15,7 +15,7 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GCs.h" -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" using namespace llvm; diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index 8c25783f4ea..699e2bbff6a 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -26,6 +26,7 @@ #include "llvm/CodeGen/FastISel.h" #include "llvm/CodeGen/FunctionLoweringInfo.h" #include "llvm/CodeGen/GCMetadata.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" @@ -40,7 +41,6 @@ #include "llvm/IR/DebugInfo.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index c56973a44fa..63f3d5eb407 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -11,6 +11,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/SelectionDAGISel.h" #include "ScheduleDAGSDNodes.h" #include "SelectionDAGBuilder.h" @@ -35,7 +36,6 @@ #include "llvm/IR/Constants.h" #include "llvm/IR/DebugInfo.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" diff --git a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp index 94f09bdc2f9..d3090a96845 100644 --- a/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/StatepointLowering.cpp @@ -18,10 +18,10 @@ #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/GCMetadata.h" #include "llvm/CodeGen/FunctionLoweringInfo.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/StackMaps.h" #include "llvm/IR/CallingConv.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Intrinsics.h" diff --git a/llvm/lib/CodeGen/ShadowStackGC.cpp b/llvm/lib/CodeGen/ShadowStackGC.cpp index 163d0efc07a..e4a389195ee 100644 --- a/llvm/lib/CodeGen/ShadowStackGC.cpp +++ b/llvm/lib/CodeGen/ShadowStackGC.cpp @@ -26,9 +26,9 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GCs.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/ADT/StringExtras.h" #include "llvm/IR/CallSite.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Module.h" diff --git a/llvm/lib/CodeGen/StatepointExampleGC.cpp b/llvm/lib/CodeGen/StatepointExampleGC.cpp index 67f40c826fa..95dfd75018c 100644 --- a/llvm/lib/CodeGen/StatepointExampleGC.cpp +++ b/llvm/lib/CodeGen/StatepointExampleGC.cpp @@ -16,7 +16,7 @@ // //===----------------------------------------------------------------------===// -#include "llvm/IR/GCStrategy.h" +#include "llvm/CodeGen/GCStrategy.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Value.h" diff --git a/llvm/lib/IR/CMakeLists.txt b/llvm/lib/IR/CMakeLists.txt index 621c7ca9224..1a210e05827 100644 --- a/llvm/lib/IR/CMakeLists.txt +++ b/llvm/lib/IR/CMakeLists.txt @@ -17,7 +17,6 @@ add_llvm_library(LLVMCore Dominators.cpp Function.cpp GCOV.cpp - GCStrategy.cpp GVMaterializer.cpp Globals.cpp IRBuilder.cpp diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index ddfbaf7a187..070513edef2 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -386,12 +386,6 @@ void Function::clearGC() { } } -GCStrategy *Function::getGCStrategy() const { - // Lookup the GCStrategy (which is owned by the Context), given the name of - // the GC in question. - return getContext().pImpl->getGCStrategy(getGC()); -} - /// copyAttributesFrom - copy all additional attributes (those not needed to /// create a Function) from the Function Src to this one. void Function::copyAttributesFrom(const GlobalValue *Src) { diff --git a/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp index 3370bdb0f88..d717b92d9fe 100644 --- a/llvm/lib/IR/LLVMContextImpl.cpp +++ b/llvm/lib/IR/LLVMContextImpl.cpp @@ -15,7 +15,6 @@ #include "llvm/ADT/STLExtras.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/DiagnosticInfo.h" -#include "llvm/IR/GCStrategy.h" #include "llvm/IR/Module.h" #include <algorithm> using namespace llvm; @@ -239,25 +238,3 @@ void GetElementPtrConstantExpr::anchor() { } void CompareConstantExpr::anchor() { } -GCStrategy *LLVMContextImpl::getGCStrategy(const StringRef Name) { - // TODO: Arguably, just doing a linear search would be faster for small N - auto NMI = GCStrategyMap.find(Name); - if (NMI != GCStrategyMap.end()) - return NMI->getValue(); - - for (auto& Entry : GCRegistry::entries()) { - if (Name == Entry.getName()) { - std::unique_ptr<GCStrategy> S = Entry.instantiate(); - S->Name = Name; - GCStrategyMap[Name] = S.get(); - GCStrategyList.push_back(std::move(S)); - return GCStrategyList.back().get(); - } - } - - // No GCStrategy found for that name, error reporting is the job of our - // callers. - return nullptr; -} - - diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h index 12b150741dd..e4e9f8f2a45 100644 --- a/llvm/lib/IR/LLVMContextImpl.h +++ b/llvm/lib/IR/LLVMContextImpl.h @@ -457,17 +457,6 @@ public: int getOrAddScopeRecordIdxEntry(MDNode *N, int ExistingIdx); int getOrAddScopeInlinedAtIdxEntry(MDNode *Scope, MDNode *IA,int ExistingIdx); - /// An owning list of all GCStrategies which have been created - SmallVector<std::unique_ptr<GCStrategy>, 1> GCStrategyList; - /// A helper map to speedup lookups into the above list - StringMap<GCStrategy*> GCStrategyMap; - - /// Lookup the GCStrategy object associated with the given gc name. If one - /// can't be found, returns nullptr. The lifetime of the returned objects - /// is dictated by the lifetime of the associated context. No caller should - /// attempt to delete the returned objects. - GCStrategy *getGCStrategy(const StringRef Name); - LLVMContextImpl(LLVMContext &C); ~LLVMContextImpl(); |