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 CustomSafePoints = false; 37 } isGCManagedPointer(const Value * V) const38 Optional<bool> isGCManagedPointer(const Value *V) const override { 39 // Method is only valid on pointer typed values. 40 PointerType *PT = cast<PointerType>(V->getType()); 41 // For the sake of this example GC, we arbitrarily pick addrspace(1) as our 42 // GC managed heap. We know that a pointer into this heap needs to be 43 // updated and that no other pointer does. 44 return (1 == PT->getAddressSpace()); 45 } 46 }; 47 } 48 49 static GCRegistry::Add<StatepointGC> 50 X("statepoint-example", "an example strategy for statepoint"); 51 52 namespace llvm { linkStatepointExampleGC()53void linkStatepointExampleGC() {} 54 } 55