Home | History | Annotate | Download | only in IR
      1 //===-- IR/Statepoint.cpp -- gc.statepoint utilities ---  -----------------===//
      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 some utility functions to help recognize gc.statepoint
     11 // intrinsics.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/IR/Statepoint.h"
     16 
     17 #include "llvm/IR/Function.h"
     18 
     19 using namespace llvm;
     20 
     21 static const Function *getCalledFunction(ImmutableCallSite CS) {
     22   if (!CS.getInstruction())
     23     return nullptr;
     24   return CS.getCalledFunction();
     25 }
     26 
     27 bool llvm::isStatepoint(ImmutableCallSite CS) {
     28   if (auto *F = getCalledFunction(CS))
     29     return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint;
     30   return false;
     31 }
     32 
     33 bool llvm::isStatepoint(const Value *V) {
     34   if (auto CS = ImmutableCallSite(V))
     35     return isStatepoint(CS);
     36   return false;
     37 }
     38 
     39 bool llvm::isStatepoint(const Value &V) {
     40   return isStatepoint(&V);
     41 }
     42 
     43 bool llvm::isGCRelocate(ImmutableCallSite CS) {
     44   return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction());
     45 }
     46 
     47 bool llvm::isGCResult(ImmutableCallSite CS) {
     48   return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction());
     49 }
     50 
     51 bool llvm::isStatepointDirectiveAttr(Attribute Attr) {
     52   return Attr.hasAttribute("statepoint-id") ||
     53          Attr.hasAttribute("statepoint-num-patch-bytes");
     54 }
     55 
     56 StatepointDirectives llvm::parseStatepointDirectivesFromAttrs(AttributeSet AS) {
     57   StatepointDirectives Result;
     58 
     59   Attribute AttrID =
     60       AS.getAttribute(AttributeSet::FunctionIndex, "statepoint-id");
     61   uint64_t StatepointID;
     62   if (AttrID.isStringAttribute())
     63     if (!AttrID.getValueAsString().getAsInteger(10, StatepointID))
     64       Result.StatepointID = StatepointID;
     65 
     66   uint32_t NumPatchBytes;
     67   Attribute AttrNumPatchBytes = AS.getAttribute(AttributeSet::FunctionIndex,
     68                                                 "statepoint-num-patch-bytes");
     69   if (AttrNumPatchBytes.isStringAttribute())
     70     if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes))
     71       Result.NumPatchBytes = NumPatchBytes;
     72 
     73   return Result;
     74 }
     75