139d628a0SDimitry Andric //===-- IR/Statepoint.cpp -- gc.statepoint utilities --- -----------------===// 239d628a0SDimitry Andric // 339d628a0SDimitry Andric // The LLVM Compiler Infrastructure 439d628a0SDimitry Andric // 539d628a0SDimitry Andric // This file is distributed under the University of Illinois Open Source 639d628a0SDimitry Andric // License. See LICENSE.TXT for details. 739d628a0SDimitry Andric // 839d628a0SDimitry Andric //===----------------------------------------------------------------------===// 939d628a0SDimitry Andric // 103ca95b02SDimitry Andric // This file contains some utility functions to help recognize gc.statepoint 113ca95b02SDimitry Andric // intrinsics. 1239d628a0SDimitry Andric // 1339d628a0SDimitry Andric //===----------------------------------------------------------------------===// 1439d628a0SDimitry Andric 1539d628a0SDimitry Andric #include "llvm/IR/Statepoint.h" 1639d628a0SDimitry Andric 173ca95b02SDimitry Andric #include "llvm/IR/Function.h" 183ca95b02SDimitry Andric 1939d628a0SDimitry Andric using namespace llvm; 2039d628a0SDimitry Andric getCalledFunction(ImmutableCallSite CS)213ca95b02SDimitry Andricstatic const Function *getCalledFunction(ImmutableCallSite CS) { 223ca95b02SDimitry Andric if (!CS.getInstruction()) 233ca95b02SDimitry Andric return nullptr; 243ca95b02SDimitry Andric return CS.getCalledFunction(); 253ca95b02SDimitry Andric } 263ca95b02SDimitry Andric isStatepoint(ImmutableCallSite CS)273ca95b02SDimitry Andricbool llvm::isStatepoint(ImmutableCallSite CS) { 283ca95b02SDimitry Andric if (auto *F = getCalledFunction(CS)) 293ca95b02SDimitry Andric return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint; 30ff0cc061SDimitry Andric return false; 31ff0cc061SDimitry Andric } 32ff0cc061SDimitry Andric isStatepoint(const Value * V)333ca95b02SDimitry Andricbool llvm::isStatepoint(const Value *V) { 343ca95b02SDimitry Andric if (auto CS = ImmutableCallSite(V)) 3539d628a0SDimitry Andric return isStatepoint(CS); 3639d628a0SDimitry Andric return false; 3739d628a0SDimitry Andric } 383ca95b02SDimitry Andric isStatepoint(const Value & V)393ca95b02SDimitry Andricbool llvm::isStatepoint(const Value &V) { 403ca95b02SDimitry Andric return isStatepoint(&V); 4139d628a0SDimitry Andric } 4239d628a0SDimitry Andric isGCRelocate(ImmutableCallSite CS)433ca95b02SDimitry Andricbool llvm::isGCRelocate(ImmutableCallSite CS) { 444d0b32cdSDimitry Andric return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction()); 4539d628a0SDimitry Andric } 4639d628a0SDimitry Andric isGCRelocate(const Value * V)47*edd7eaddSDimitry Andricbool llvm::isGCRelocate(const Value *V) { 48*edd7eaddSDimitry Andric if (auto CS = ImmutableCallSite(V)) 49*edd7eaddSDimitry Andric return isGCRelocate(CS); 50*edd7eaddSDimitry Andric return false; 51*edd7eaddSDimitry Andric } 52*edd7eaddSDimitry Andric isGCResult(ImmutableCallSite CS)533ca95b02SDimitry Andricbool llvm::isGCResult(ImmutableCallSite CS) { 543ca95b02SDimitry Andric return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction()); 55ff0cc061SDimitry Andric } 56ff0cc061SDimitry Andric isGCResult(const Value * V)57*edd7eaddSDimitry Andricbool llvm::isGCResult(const Value *V) { 58*edd7eaddSDimitry Andric if (auto CS = ImmutableCallSite(V)) 59*edd7eaddSDimitry Andric return isGCResult(CS); 60*edd7eaddSDimitry Andric return false; 61*edd7eaddSDimitry Andric } 62*edd7eaddSDimitry Andric isStatepointDirectiveAttr(Attribute Attr)633ca95b02SDimitry Andricbool llvm::isStatepointDirectiveAttr(Attribute Attr) { 643ca95b02SDimitry Andric return Attr.hasAttribute("statepoint-id") || 653ca95b02SDimitry Andric Attr.hasAttribute("statepoint-num-patch-bytes"); 6639d628a0SDimitry Andric } 673ca95b02SDimitry Andric 687a7e6055SDimitry Andric StatepointDirectives parseStatepointDirectivesFromAttrs(AttributeList AS)697a7e6055SDimitry Andricllvm::parseStatepointDirectivesFromAttrs(AttributeList AS) { 703ca95b02SDimitry Andric StatepointDirectives Result; 713ca95b02SDimitry Andric 723ca95b02SDimitry Andric Attribute AttrID = 737a7e6055SDimitry Andric AS.getAttribute(AttributeList::FunctionIndex, "statepoint-id"); 743ca95b02SDimitry Andric uint64_t StatepointID; 753ca95b02SDimitry Andric if (AttrID.isStringAttribute()) 763ca95b02SDimitry Andric if (!AttrID.getValueAsString().getAsInteger(10, StatepointID)) 773ca95b02SDimitry Andric Result.StatepointID = StatepointID; 783ca95b02SDimitry Andric 793ca95b02SDimitry Andric uint32_t NumPatchBytes; 807a7e6055SDimitry Andric Attribute AttrNumPatchBytes = AS.getAttribute(AttributeList::FunctionIndex, 813ca95b02SDimitry Andric "statepoint-num-patch-bytes"); 823ca95b02SDimitry Andric if (AttrNumPatchBytes.isStringAttribute()) 833ca95b02SDimitry Andric if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes)) 843ca95b02SDimitry Andric Result.NumPatchBytes = NumPatchBytes; 853ca95b02SDimitry Andric 863ca95b02SDimitry Andric return Result; 8739d628a0SDimitry Andric } 88