1 //===-- CoreCLRGC.cpp - CoreCLR Runtime GC Strategy -----------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
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
14 //    interior pointers
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)
18 //
19 // The above differences in behavior are to be implemented in upcoming checkins.
20 //
21 //===----------------------------------------------------------------------===//
22 
23 #include "llvm/CodeGen/GCStrategy.h"
24 #include "llvm/IR/DerivedTypes.h"
25 #include "llvm/IR/Value.h"
26 
27 using namespace llvm;
28 
29 namespace {
30 class CoreCLRGC : public GCStrategy {
31 public:
CoreCLRGC()32   CoreCLRGC() {
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.
36     InitRoots = false;
37     NeededSafePoints = 0;
38     UsesMetadata = false;
39     CustomRoots = false;
40   }
isGCManagedPointer(const Value * V) const41   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());
46   }
47 };
48 }
49 
50 static GCRegistry::Add<CoreCLRGC> X("coreclr", "CoreCLR-compatible GC");
51 
52 namespace llvm {
linkCoreCLRGC()53 void linkCoreCLRGC() {}
54 }
55