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 getCalledFunction(ImmutableCallSite CS)21static const Function *getCalledFunction(ImmutableCallSite CS) { 22 if (!CS.getInstruction()) 23 return nullptr; 24 return CS.getCalledFunction(); 25 } 26 isStatepoint(ImmutableCallSite CS)27bool llvm::isStatepoint(ImmutableCallSite CS) { 28 if (auto *F = getCalledFunction(CS)) 29 return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint; 30 return false; 31 } 32 isStatepoint(const Value * V)33bool llvm::isStatepoint(const Value *V) { 34 if (auto CS = ImmutableCallSite(V)) 35 return isStatepoint(CS); 36 return false; 37 } 38 isStatepoint(const Value & V)39bool llvm::isStatepoint(const Value &V) { 40 return isStatepoint(&V); 41 } 42 isGCRelocate(ImmutableCallSite CS)43bool llvm::isGCRelocate(ImmutableCallSite CS) { 44 return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction()); 45 } 46 isGCResult(ImmutableCallSite CS)47bool llvm::isGCResult(ImmutableCallSite CS) { 48 return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction()); 49 } 50 isStatepointDirectiveAttr(Attribute Attr)51bool llvm::isStatepointDirectiveAttr(Attribute Attr) { 52 return Attr.hasAttribute("statepoint-id") || 53 Attr.hasAttribute("statepoint-num-patch-bytes"); 54 } 55 parseStatepointDirectivesFromAttrs(AttributeSet AS)56StatepointDirectives 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