1 //===-- 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 23 using namespace llvm; 24 25 namespace { 26 class StatepointGC : public GCStrategy { 27 public: StatepointGC()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 } isGCManagedPointer(const Value * V) const37 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 50 static GCRegistry::Add<StatepointGC> X("statepoint-example", 51 "an example strategy for statepoint"); 52 53 namespace llvm { linkStatepointExampleGC()54void linkStatepointExampleGC() {} 55 } 56