blob: 95dfd75018c13b28de77b439106f94301c390c17 [file] [log] [blame]
Philip Reames352fb932015-01-07 19:13:28 +00001//===-- 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
Philip Reames36319532015-01-16 23:16:12 +000015// pointers, and has reasonable relocation semantics.
Philip Reames352fb932015-01-07 19:13:28 +000016//
17//===----------------------------------------------------------------------===//
18
Philip Reames56a03932015-01-26 18:26:35 +000019#include "llvm/CodeGen/GCStrategy.h"
Philip Reames352fb932015-01-07 19:13:28 +000020#include "llvm/IR/DerivedTypes.h"
Chandler Carruthd9903882015-01-14 11:23:27 +000021#include "llvm/IR/Value.h"
Philip Reames352fb932015-01-07 19:13:28 +000022
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;
Philip Reames352fb932015-01-07 19:13:28 +000036 }
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
Philip Reames287987c2015-01-16 23:21:07 +000042 // 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.
Philip Reames352fb932015-01-07 19:13:28 +000045 return (1 == PT->getAddressSpace());
46 }
47};
48}
49
Philip Reames36319532015-01-16 23:16:12 +000050static GCRegistry::Add<StatepointGC> X("statepoint-example",
51 "an example strategy for statepoint");
Philip Reames352fb932015-01-07 19:13:28 +000052
53namespace llvm {
54void linkStatepointExampleGC() {}
55}