mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
e80a72c967
Reasons: 1) The existing form was a form of false generality. None of the implemented GCStrategies use anything other than a type. Its becoming more and more clear we're going to need some type of strong GC pointer in the type system and we shouldn't pretend otherwise at this point. 2) The API was awkward when applied to vectors-of-pointers. The old one could have been made to work, but calling isGCManagedPointer(Ty->getScalarType()) is much cleaner than the Value alternatives. 3) The rewriting implementation effectively assumes the type based predicate as well. We should be consistent. llvm-svn: 256312
55 lines
1.8 KiB
C++
55 lines
1.8 KiB
C++
//===-- 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 Type *Ty) const override {
|
|
// Method is only valid on pointer typed values.
|
|
const PointerType *PT = cast<PointerType>(Ty);
|
|
// 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() {}
|
|
}
|