diff options
Diffstat (limited to 'llvm/lib/CodeGen')
-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 | 22 | ||||
-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 |
11 files changed, 54 insertions, 19 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/CodeGen/GCStrategy.cpp b/llvm/lib/CodeGen/GCStrategy.cpp new file mode 100644 index 00000000000..554d326942e --- /dev/null +++ b/llvm/lib/CodeGen/GCStrategy.cpp @@ -0,0 +1,22 @@ +//===-- GCStrategy.cpp - Garbage Collector Description --------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements the policy object GCStrategy which describes the +// behavior of a given garbage collector. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/GCStrategy.h" + +using namespace llvm; + +GCStrategy::GCStrategy() + : UseStatepoints(false), NeededSafePoints(0), CustomReadBarriers(false), + CustomWriteBarriers(false), CustomRoots(false), InitRoots(true), + UsesMetadata(false) {} 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" |