12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- //===-- 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() {}
- }
|