Add a GCStrategy for CoreCLR

This change adds a new GC strategy for supporting the CoreCLR runtime.

This strategy is currently identical to Statepoint-example GC, 
but is necessary for several upcoming changes specific to CoreCLR, such as:

1. Base-pointers not explicitly reported for interior pointers
2. Different format for stack-map encoding
3. Location of Safe-point polls: polls are only needed before loop-back edges and before tail-calls (not needed at function-entry)
4. Runtime specific handshake between calls to managed/unmanaged functions.

llvm-svn: 237753
diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt
index 6ce5b13..9fc3e0b 100644
--- a/llvm/lib/CodeGen/CMakeLists.txt
+++ b/llvm/lib/CodeGen/CMakeLists.txt
@@ -9,6 +9,7 @@
   CallingConvLower.cpp
   CodeGen.cpp
   CodeGenPrepare.cpp
+  CoreCLRGC.cpp
   CriticalAntiDepBreaker.cpp
   DFAPacketizer.cpp
   DeadMachineInstructionElim.cpp
diff --git a/llvm/lib/CodeGen/CoreCLRGC.cpp b/llvm/lib/CodeGen/CoreCLRGC.cpp
new file mode 100644
index 0000000..2726180
--- /dev/null
+++ b/llvm/lib/CodeGen/CoreCLRGC.cpp
@@ -0,0 +1,55 @@
+//===-- 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() {}

+}