blob: 95dfd75018c13b28de77b439106f94301c390c17 [file] [log] [blame]
Stephen Hinesebe69fe2015-03-23 12:10:34 -07001//===-- StatepointDefaultGC.cpp - The default statepoint 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 which serves as an example for the usage
11// of a statepoint based lowering strategy. This GCStrategy is intended to
12// suitable as a default implementation usable with any collector which can
13// consume the standard stackmap format generated by statepoints, uses the
14// default addrespace to distinguish between gc managed and non-gc managed
15// pointers, and has reasonable relocation semantics.
16//
17//===----------------------------------------------------------------------===//
18
19#include "llvm/CodeGen/GCStrategy.h"
20#include "llvm/IR/DerivedTypes.h"
21#include "llvm/IR/Value.h"
22
23using namespace llvm;
24
25namespace {
26class StatepointGC : public GCStrategy {
27public:
28 StatepointGC() {
29 UseStatepoints = true;
30 // These options are all gc.root specific, we specify them so that the
31 // gc.root lowering code doesn't run.
32 InitRoots = false;
33 NeededSafePoints = 0;
34 UsesMetadata = false;
35 CustomRoots = false;
36 }
37 Optional<bool> isGCManagedPointer(const Value *V) const override {
38 // Method is only valid on pointer typed values.
39 PointerType *PT = cast<PointerType>(V->getType());
40 // For the sake of this example GC, we arbitrarily pick addrspace(1) as our
41 // GC managed heap. We know that a pointer into this heap needs to be
42 // updated and that no other pointer does. Note that addrspace(1) is used
43 // only as an example, it has no special meaning, and is not reserved for
44 // GC usage.
45 return (1 == PT->getAddressSpace());
46 }
47};
48}
49
50static GCRegistry::Add<StatepointGC> X("statepoint-example",
51 "an example strategy for statepoint");
52
53namespace llvm {
54void linkStatepointExampleGC() {}
55}