1 //===-- CoreCLRGC.cpp - CoreCLR Runtime GC Strategy -----------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file contains a GCStrategy for the CoreCLR Runtime.
11 // The strategy is similar to Statepoint-example GC, but differs from it in
12 // certain aspects, such as:
13 // 1) Base-pointers need not be explicitly tracked and reported for
15 // 2) Uses a different format for encoding stack-maps
16 // 3) Location of Safe-point polls: polls are only needed before loop-back edges
17 // and before tail-calls (not needed at function-entry)
19 // The above differences in behavior are to be implemented in upcoming checkins.
21 //===----------------------------------------------------------------------===//
23 #include "llvm/CodeGen/GCStrategy.h"
24 #include "llvm/IR/DerivedTypes.h"
25 #include "llvm/IR/Value.h"
30 class CoreCLRGC : public GCStrategy {
33 UseStatepoints = true;
34 // These options are all gc.root specific, we specify them so that the
35 // gc.root lowering code doesn't run.
41 Optional<bool> isGCManagedPointer(const Value *V) const override {
42 // Method is only valid on pointer typed values.
43 PointerType *PT = cast<PointerType>(V->getType());
44 // We pick addrspace(1) as our GC managed heap.
45 return (1 == PT->getAddressSpace());
50 static GCRegistry::Add<CoreCLRGC> X("coreclr", "CoreCLR-compatible GC");
53 void linkCoreCLRGC() {}