diff options
author | Philip Reames <listmail@philipreames.com> | 2016-01-19 03:57:18 +0000 |
---|---|---|
committer | Philip Reames <listmail@philipreames.com> | 2016-01-19 03:57:18 +0000 |
commit | 31955002975b5ae9e4130d0fbeb954bbeb0f95f0 (patch) | |
tree | 3e04060270c70ddd2ec9d4dc2062006ea8174940 /llvm/lib/CodeGen | |
parent | e708747129f89eb8ff4500f6284c420c63f77302 (diff) | |
download | bcm5719-llvm-31955002975b5ae9e4130d0fbeb954bbeb0f95f0.tar.gz bcm5719-llvm-31955002975b5ae9e4130d0fbeb954bbeb0f95f0.zip |
[GC] Consolidate all built in GCs into a single file [NFC]
Combine a bunch of small files into a single, still rather small, file. The primary purpose of this is to get all of the static initializers into a single file so as to have a well defined order of initialization.
llvm-svn: 258109
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/BuiltinGCs.cpp | 139 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CMakeLists.txt | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/CoreCLRGC.cpp | 54 | ||||
-rw-r--r-- | llvm/lib/CodeGen/ErlangGC.cpp | 46 | ||||
-rw-r--r-- | llvm/lib/CodeGen/OcamlGC.cpp | 36 | ||||
-rw-r--r-- | llvm/lib/CodeGen/ShadowStackGC.cpp | 55 | ||||
-rw-r--r-- | llvm/lib/CodeGen/ShadowStackGCLowering.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/StatepointExampleGC.cpp | 55 |
8 files changed, 145 insertions, 252 deletions
diff --git a/llvm/lib/CodeGen/BuiltinGCs.cpp b/llvm/lib/CodeGen/BuiltinGCs.cpp new file mode 100644 index 00000000000..ff7c99de042 --- /dev/null +++ b/llvm/lib/CodeGen/BuiltinGCs.cpp @@ -0,0 +1,139 @@ +//===-- BuiltinGCs.cpp - Boilerplate for our built in GC types --*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains the boilerplate required to define our various built in +// gc lowering strategies. +// +//===----------------------------------------------------------------------===// + +#include "llvm/CodeGen/GCs.h" +#include "llvm/CodeGen/GCStrategy.h" + +using namespace llvm; + +namespace { + +/// An example GC which attempts to be compatibile with Erlang/OTP garbage +/// collector. +/// +/// The frametable emitter is in ErlangGCPrinter.cpp. +class ErlangGC : public GCStrategy { +public: + ErlangGC() { + InitRoots = false; + NeededSafePoints = 1 << GC::PostCall; + UsesMetadata = true; + CustomRoots = false; + } +}; + +/// An example GC which attempts to be compatible with Objective Caml 3.10.0 +/// +/// The frametable emitter is in OcamlGCPrinter.cpp. +class OcamlGC : public GCStrategy { +public: + OcamlGC() { + NeededSafePoints = 1 << GC::PostCall; + UsesMetadata = true; + } +}; + +/// A GC strategy for uncooperative targets. This implements lowering for the +/// llvm.gc* intrinsics for targets that do not natively support them (which +/// includes the C backend). Note that the code generated is not quite as +/// efficient as algorithms which generate stack maps to identify roots. +/// +/// In order to support this particular transformation, all stack roots are +/// coallocated in the stack. This allows a fully target-independent stack map +/// while introducing only minor runtime overhead. +class ShadowStackGC : public GCStrategy { +public: + ShadowStackGC() { + InitRoots = true; + CustomRoots = true; + } +}; + +/// A GCStrategy which serves as an example for the usage of a statepoint based +/// lowering strategy. This GCStrategy is intended to suitable as a default +/// implementation usable with any collector which can consume the standard +/// stackmap format generated by statepoints, uses the default addrespace to +/// distinguish between gc managed and non-gc managed pointers, and has +/// reasonable relocation semantics. +class StatepointGC : public GCStrategy { +public: + StatepointGC() { + UseStatepoints = true; + // These options are all gc.root specific, we specify them so that the + // gc.root lowering code doesn't run. + InitRoots = false; + NeededSafePoints = 0; + UsesMetadata = false; + CustomRoots = false; + } + Optional<bool> isGCManagedPointer(const Type *Ty) const override { + // Method is only valid on pointer typed values. + const PointerType *PT = cast<PointerType>(Ty); + // For the sake of this example GC, we arbitrarily pick addrspace(1) as our + // GC managed heap. We know that a pointer into this heap needs to be + // updated and that no other pointer does. Note that addrspace(1) is used + // only as an example, it has no special meaning, and is not reserved for + // GC usage. + return (1 == PT->getAddressSpace()); + } +}; + +/// A GCStrategy for the CoreCLR Runtime. The strategy is similar to +/// Statepoint-example GC, but differs from it in certain aspects, such as: +/// 1) Base-pointers need not be explicitly tracked and reported for +/// interior pointers +/// 2) Uses a different format for encoding stack-maps +/// 3) Location of Safe-point polls: polls are only needed before loop-back +/// edges and before tail-calls (not needed at function-entry) +/// +/// The above differences in behavior are to be implemented in upcoming +/// checkins. +class CoreCLRGC : public GCStrategy { +public: + CoreCLRGC() { + UseStatepoints = true; + // These options are all gc.root specific, we specify them so that the + // gc.root lowering code doesn't run. + InitRoots = false; + NeededSafePoints = 0; + UsesMetadata = false; + CustomRoots = false; + } + Optional<bool> isGCManagedPointer(const Type *Ty) const override { + // Method is only valid on pointer typed values. + const PointerType *PT = cast<PointerType>(Ty); + // We pick addrspace(1) as our GC managed heap. + return (1 == PT->getAddressSpace()); + } +}; +} + +// Register all the above so that they can be found at runtime. Note that +// these static initializers are important since the registration list is +// constructed from their storage. +static GCRegistry::Add<ErlangGC> A("erlang", + "erlang-compatible garbage collector"); +static GCRegistry::Add<OcamlGC> B("ocaml", "ocaml 3.10-compatible GC"); +static GCRegistry::Add<ShadowStackGC> + C("shadow-stack", "Very portable GC for uncooperative code generators"); +static GCRegistry::Add<StatepointGC> D("statepoint-example", + "an example strategy for statepoint"); +static GCRegistry::Add<CoreCLRGC> E("coreclr", "CoreCLR-compatible GC"); + +// Provide hooks to ensure the containing library is fully loaded. +void llvm::linkErlangGC() {} +void llvm::linkOcamlGC() {} +void llvm::linkShadowStackGC() {} +void llvm::linkStatepointExampleGC() {} +void llvm::linkCoreCLRGC() {} diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 358a49f55f5..b7c1bd32d38 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -10,18 +10,17 @@ add_llvm_library(LLVMCodeGen AtomicExpandPass.cpp BasicTargetTransformInfo.cpp BranchFolding.cpp + BuiltinGCs.cpp CalcSpillWeights.cpp CallingConvLower.cpp CodeGen.cpp CodeGenPrepare.cpp - CoreCLRGC.cpp CriticalAntiDepBreaker.cpp DFAPacketizer.cpp DeadMachineInstructionElim.cpp DwarfEHPrepare.cpp EarlyIfConversion.cpp EdgeBundles.cpp - ErlangGC.cpp ExecutionDepsFix.cpp ExpandISelPseudos.cpp ExpandPostRAPseudos.cpp @@ -84,7 +83,6 @@ add_llvm_library(LLVMCodeGen MachineVerifier.cpp MIRPrinter.cpp MIRPrintingPass.cpp - OcamlGC.cpp OptimizePHIs.cpp PHIElimination.cpp PHIEliminationUtils.cpp @@ -109,7 +107,6 @@ add_llvm_library(LLVMCodeGen ScheduleDAGPrinter.cpp ScoreboardHazardRecognizer.cpp ShrinkWrap.cpp - ShadowStackGC.cpp ShadowStackGCLowering.cpp SjLjEHPrepare.cpp SlotIndexes.cpp @@ -120,7 +117,6 @@ add_llvm_library(LLVMCodeGen StackSlotColoring.cpp StackMapLivenessAnalysis.cpp StackMaps.cpp - StatepointExampleGC.cpp TailDuplication.cpp TargetFrameLoweringImpl.cpp TargetInstrInfo.cpp diff --git a/llvm/lib/CodeGen/CoreCLRGC.cpp b/llvm/lib/CodeGen/CoreCLRGC.cpp deleted file mode 100644 index ff7c0d5dc0a..00000000000 --- a/llvm/lib/CodeGen/CoreCLRGC.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//===-- CoreCLRGC.cpp - CoreCLR Runtime GC Strategy -----------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains a GCStrategy for the CoreCLR Runtime. -// The strategy is similar to Statepoint-example GC, but differs from it in -// certain aspects, such as: -// 1) Base-pointers need not be explicitly tracked and reported for -// interior pointers -// 2) Uses a different format for encoding stack-maps -// 3) Location of Safe-point polls: polls are only needed before loop-back edges -// and before tail-calls (not needed at function-entry) -// -// The above differences in behavior are to be implemented in upcoming checkins. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/GCStrategy.h" -#include "llvm/IR/DerivedTypes.h" -#include "llvm/IR/Value.h" - -using namespace llvm; - -namespace { -class CoreCLRGC : public GCStrategy { -public: - CoreCLRGC() { - UseStatepoints = true; - // These options are all gc.root specific, we specify them so that the - // gc.root lowering code doesn't run. - InitRoots = false; - NeededSafePoints = 0; - UsesMetadata = false; - CustomRoots = false; - } - Optional<bool> isGCManagedPointer(const Type *Ty) const override { - // Method is only valid on pointer typed values. - const PointerType *PT = cast<PointerType>(Ty); - // We pick addrspace(1) as our GC managed heap. - return (1 == PT->getAddressSpace()); - } -}; -} - -static GCRegistry::Add<CoreCLRGC> X("coreclr", "CoreCLR-compatible GC"); - -namespace llvm { -void linkCoreCLRGC() {} -} diff --git a/llvm/lib/CodeGen/ErlangGC.cpp b/llvm/lib/CodeGen/ErlangGC.cpp deleted file mode 100644 index 024946d1436..00000000000 --- a/llvm/lib/CodeGen/ErlangGC.cpp +++ /dev/null @@ -1,46 +0,0 @@ -//===-- ErlangGC.cpp - Erlang/OTP GC strategy -------------------*- C++ -*-===// -// -// 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 Erlang/OTP runtime-compatible garbage collector -// (e.g. defines safe points, root initialization etc.) -// -// The frametable emitter is in ErlangGCPrinter.cpp. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/GCs.h" -#include "llvm/CodeGen/GCStrategy.h" -#include "llvm/CodeGen/MachineInstrBuilder.h" -#include "llvm/MC/MCContext.h" -#include "llvm/MC/MCSymbol.h" -#include "llvm/Target/TargetInstrInfo.h" -#include "llvm/Target/TargetMachine.h" -#include "llvm/Target/TargetSubtargetInfo.h" - -using namespace llvm; - -namespace { - -class ErlangGC : public GCStrategy { -public: - ErlangGC(); -}; -} - -static GCRegistry::Add<ErlangGC> X("erlang", - "erlang-compatible garbage collector"); - -void llvm::linkErlangGC() {} - -ErlangGC::ErlangGC() { - InitRoots = false; - NeededSafePoints = 1 << GC::PostCall; - UsesMetadata = true; - CustomRoots = false; -} diff --git a/llvm/lib/CodeGen/OcamlGC.cpp b/llvm/lib/CodeGen/OcamlGC.cpp deleted file mode 100644 index 17654a6ac3a..00000000000 --- a/llvm/lib/CodeGen/OcamlGC.cpp +++ /dev/null @@ -1,36 +0,0 @@ -//===-- OcamlGC.cpp - Ocaml frametable GC strategy ------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements lowering for the llvm.gc* intrinsics compatible with -// Objective Caml 3.10.0, which uses a liveness-accurate static stack map. -// -// The frametable emitter is in OcamlGCPrinter.cpp. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/GCs.h" -#include "llvm/CodeGen/GCStrategy.h" - -using namespace llvm; - -namespace { -class OcamlGC : public GCStrategy { -public: - OcamlGC(); -}; -} - -static GCRegistry::Add<OcamlGC> X("ocaml", "ocaml 3.10-compatible GC"); - -void llvm::linkOcamlGC() {} - -OcamlGC::OcamlGC() { - NeededSafePoints = 1 << GC::PostCall; - UsesMetadata = true; -} diff --git a/llvm/lib/CodeGen/ShadowStackGC.cpp b/llvm/lib/CodeGen/ShadowStackGC.cpp deleted file mode 100644 index b12e943eb35..00000000000 --- a/llvm/lib/CodeGen/ShadowStackGC.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//===-- ShadowStackGC.cpp - GC support for uncooperative targets ----------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file implements lowering for the llvm.gc* intrinsics for targets that do -// not natively support them (which includes the C backend). Note that the code -// generated is not quite as efficient as algorithms which generate stack maps -// to identify roots. -// -// This pass implements the code transformation described in this paper: -// "Accurate Garbage Collection in an Uncooperative Environment" -// Fergus Henderson, ISMM, 2002 -// -// In runtime/GC/SemiSpace.cpp is a prototype runtime which is compatible with -// ShadowStackGC. -// -// In order to support this particular transformation, all stack roots are -// coallocated in the stack. This allows a fully target-independent stack map -// while introducing only minor runtime overhead. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/GCs.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/CodeGen/GCStrategy.h" -#include "llvm/IR/CallSite.h" -#include "llvm/IR/IRBuilder.h" -#include "llvm/IR/IntrinsicInst.h" -#include "llvm/IR/Module.h" - -using namespace llvm; - -#define DEBUG_TYPE "shadowstackgc" - -namespace { -class ShadowStackGC : public GCStrategy { -public: - ShadowStackGC(); -}; -} - -static GCRegistry::Add<ShadowStackGC> - X("shadow-stack", "Very portable GC for uncooperative code generators"); - -void llvm::linkShadowStackGC() {} - -ShadowStackGC::ShadowStackGC() { - InitRoots = true; - CustomRoots = true; -} diff --git a/llvm/lib/CodeGen/ShadowStackGCLowering.cpp b/llvm/lib/CodeGen/ShadowStackGCLowering.cpp index 878eeeed0f6..1efc440cd70 100644 --- a/llvm/lib/CodeGen/ShadowStackGCLowering.cpp +++ b/llvm/lib/CodeGen/ShadowStackGCLowering.cpp @@ -8,7 +8,11 @@ //===----------------------------------------------------------------------===// // // This file contains the custom lowering code required by the shadow-stack GC -// strategy. +// strategy. +// +// This pass implements the code transformation described in this paper: +// "Accurate Garbage Collection in an Uncooperative Environment" +// Fergus Henderson, ISMM, 2002 // //===----------------------------------------------------------------------===// diff --git a/llvm/lib/CodeGen/StatepointExampleGC.cpp b/llvm/lib/CodeGen/StatepointExampleGC.cpp deleted file mode 100644 index 3f60e18fafa..00000000000 --- a/llvm/lib/CodeGen/StatepointExampleGC.cpp +++ /dev/null @@ -1,55 +0,0 @@ -//===-- StatepointDefaultGC.cpp - The default statepoint GC strategy ------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file contains a GCStrategy which serves as an example for the usage -// of a statepoint based lowering strategy. This GCStrategy is intended to -// suitable as a default implementation usable with any collector which can -// consume the standard stackmap format generated by statepoints, uses the -// default addrespace to distinguish between gc managed and non-gc managed -// pointers, and has reasonable relocation semantics. -// -//===----------------------------------------------------------------------===// - -#include "llvm/CodeGen/GCStrategy.h" -#include "llvm/IR/DerivedTypes.h" -#include "llvm/IR/Value.h" - -using namespace llvm; - -namespace { -class StatepointGC : public GCStrategy { -public: - StatepointGC() { - UseStatepoints = true; - // These options are all gc.root specific, we specify them so that the - // gc.root lowering code doesn't run. - InitRoots = false; - NeededSafePoints = 0; - UsesMetadata = false; - CustomRoots = false; - } - Optional<bool> isGCManagedPointer(const Type *Ty) const override { - // Method is only valid on pointer typed values. - const PointerType *PT = cast<PointerType>(Ty); - // For the sake of this example GC, we arbitrarily pick addrspace(1) as our - // GC managed heap. We know that a pointer into this heap needs to be - // updated and that no other pointer does. Note that addrspace(1) is used - // only as an example, it has no special meaning, and is not reserved for - // GC usage. - return (1 == PT->getAddressSpace()); - } -}; -} - -static GCRegistry::Add<StatepointGC> X("statepoint-example", - "an example strategy for statepoint"); - -namespace llvm { -void linkStatepointExampleGC() {} -} |