blob: ed6d0e927f05c754df173e7c1d1c7622fcb3a6e2 [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 Reames2b453952015-01-16 20:07:33 +000019#include "llvm/IR/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
42 // updated and that no other pointer does.
43 return (1 == PT->getAddressSpace());
44 }
45};
46}
47
Philip Reames36319532015-01-16 23:16:12 +000048static GCRegistry::Add<StatepointGC> X("statepoint-example",
49 "an example strategy for statepoint");
Philip Reames352fb932015-01-07 19:13:28 +000050
51namespace llvm {
52void linkStatepointExampleGC() {}
53}