//===-- 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 Value *V) const override { // Method is only valid on pointer typed values. PointerType *PT = cast<PointerType>(V->getType()); // 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() {} }