blob: f656cf80cf1adde6946b3220020d6988c2cd2cc8 [file] [log] [blame]
NAKAMURA Takumifb3bd712015-05-25 01:43:23 +00001//===-- 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
27using namespace llvm;
28
29namespace {
30class CoreCLRGC : public GCStrategy {
31public:
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 }
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());
46 }
47};
48}
49
50static GCRegistry::Add<CoreCLRGC> X("coreclr",
51 "CoreCLR-compatible GC");
52
53namespace llvm {
54void linkCoreCLRGC() {}
55}