123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- //===-- 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() {}
- }
|