|  | //===-- StatepointDefaultGC.cpp - The default statepoint GC strategy ------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file contains a GCStrategy which serves as an example for the usage | 
|  | // of a statepoint based lowering strategy.  This GCStrategy is intended to | 
|  | // suitable as a default implementation usable with any collector which can | 
|  | // consume the standard stackmap format generated by statepoints, uses the | 
|  | // default addrespace to distinguish between gc managed and non-gc managed | 
|  | // pointers, and has reasonable relocation semantics. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "llvm/CodeGen/GCStrategy.h" | 
|  | #include "llvm/IR/DerivedTypes.h" | 
|  | #include "llvm/IR/Value.h" | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | namespace { | 
|  | class StatepointGC : public GCStrategy { | 
|  | public: | 
|  | StatepointGC() { | 
|  | UseStatepoints = true; | 
|  | // These options are all gc.root specific, we specify them so that the | 
|  | // gc.root lowering code doesn't run. | 
|  | InitRoots = false; | 
|  | NeededSafePoints = 0; | 
|  | UsesMetadata = false; | 
|  | CustomRoots = false; | 
|  | } | 
|  | Optional<bool> isGCManagedPointer(const Value *V) const override { | 
|  | // Method is only valid on pointer typed values. | 
|  | PointerType *PT = cast<PointerType>(V->getType()); | 
|  | // For the sake of this example GC, we arbitrarily pick addrspace(1) as our | 
|  | // GC managed heap.  We know that a pointer into this heap needs to be | 
|  | // updated and that no other pointer does.  Note that addrspace(1) is used | 
|  | // only as an example, it has no special meaning, and is not reserved for | 
|  | // GC usage. | 
|  | return (1 == PT->getAddressSpace()); | 
|  | } | 
|  | }; | 
|  | } | 
|  |  | 
|  | static GCRegistry::Add<StatepointGC> X("statepoint-example", | 
|  | "an example strategy for statepoint"); | 
|  |  | 
|  | namespace llvm { | 
|  | void linkStatepointExampleGC() {} | 
|  | } |