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 isStatepoint(const ImmutableCallSite & CS)22bool 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 } isStatepoint(const Value * inst)31bool 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 } isStatepoint(const Value & inst)38bool llvm::isStatepoint(const Value &inst) { 39 return isStatepoint(&inst); 40 } 41 isGCRelocate(const ImmutableCallSite & CS)42bool llvm::isGCRelocate(const ImmutableCallSite &CS) { 43 if (!CS.getInstruction()) { 44 // This is not a call site 45 return false; 46 } 47 48 return isGCRelocate(CS.getInstruction()); 49 } isGCRelocate(const Value * inst)50bool llvm::isGCRelocate(const Value *inst) { 51 if (const CallInst *call = dyn_cast<CallInst>(inst)) { 52 if (const Function *F = call->getCalledFunction()) { 53 return F->getIntrinsicID() == Intrinsic::experimental_gc_relocate; 54 } 55 } 56 return false; 57 } 58 isGCResult(const ImmutableCallSite & CS)59bool llvm::isGCResult(const ImmutableCallSite &CS) { 60 if (!CS.getInstruction()) { 61 // This is not a call site 62 return false; 63 } 64 65 return isGCResult(CS.getInstruction()); 66 } isGCResult(const Value * inst)67bool llvm::isGCResult(const Value *inst) { 68 if (const CallInst *call = dyn_cast<CallInst>(inst)) { 69 if (Function *F = call->getCalledFunction()) { 70 return (F->getIntrinsicID() == Intrinsic::experimental_gc_result_int || 71 F->getIntrinsicID() == Intrinsic::experimental_gc_result_float || 72 F->getIntrinsicID() == Intrinsic::experimental_gc_result_ptr || 73 F->getIntrinsicID() == Intrinsic::experimental_gc_result); 74 } 75 } 76 return false; 77 } 78