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 // 11 //===----------------------------------------------------------------------===// 12 13 #include "llvm/IR/Function.h" 14 #include "llvm/IR/Constant.h" 15 #include "llvm/IR/Constants.h" 16 #include "llvm/IR/Statepoint.h" 17 #include "llvm/Support/CommandLine.h" 18 19 using namespace std; 20 using namespace llvm; 21 22 bool llvm::isStatepoint(const ImmutableCallSite &CS) { 23 if (!CS.getInstruction()) { 24 // This is not a call site 25 return false; 26 } 27 28 const Function *F = CS.getCalledFunction(); 29 return (F && F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint); 30 } 31 bool llvm::isStatepoint(const Value *inst) { 32 if (isa<InvokeInst>(inst) || isa<CallInst>(inst)) { 33 ImmutableCallSite CS(inst); 34 return isStatepoint(CS); 35 } 36 return false; 37 } 38 bool llvm::isStatepoint(const Value &inst) { 39 return isStatepoint(&inst); 40 } 41 42 bool llvm::isGCRelocate(const ImmutableCallSite &CS) { 43 return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction()); 44 } 45 46 bool llvm::isGCResult(const ImmutableCallSite &CS) { 47 if (!CS.getInstruction()) { 48 // This is not a call site 49 return false; 50 } 51 52 return isGCResult(CS.getInstruction()); 53 } 54 bool llvm::isGCResult(const Value *inst) { 55 if (const CallInst *call = dyn_cast<CallInst>(inst)) { 56 if (Function *F = call->getCalledFunction()) { 57 return F->getIntrinsicID() == Intrinsic::experimental_gc_result; 58 } 59 } 60 return false; 61 } 62