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