mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-12 06:06:19 +00:00
6707770d48
Summary: This class is a list of AttributeSetNodes corresponding the function prototype of a call or function declaration. This class used to be called ParamAttrListPtr, then AttrListPtr, then AttributeSet. It is typically accessed by parameter and return value index, so "AttributeList" seems like a more intuitive name. Rename AttributeSetImpl to AttributeListImpl to follow suit. It's useful to rename this class so that we can rename AttributeSetNode to AttributeSet later. AttributeSet is the set of attributes that apply to a single function, argument, or return value. Reviewers: sanjoy, javed.absar, chandlerc, pete Reviewed By: pete Subscribers: pete, jholewinski, arsenm, dschuff, mehdi_amini, jfb, nhaehnle, sbc100, void, llvm-commits Differential Revision: https://reviews.llvm.org/D31102 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298393 91177308-0d34-0410-b5e6-96231b3b80d8
76 lines
2.2 KiB
C++
76 lines
2.2 KiB
C++
//===-- IR/Statepoint.cpp -- gc.statepoint utilities --- -----------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains some utility functions to help recognize gc.statepoint
|
|
// intrinsics.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/IR/Statepoint.h"
|
|
|
|
#include "llvm/IR/Function.h"
|
|
|
|
using namespace llvm;
|
|
|
|
static const Function *getCalledFunction(ImmutableCallSite CS) {
|
|
if (!CS.getInstruction())
|
|
return nullptr;
|
|
return CS.getCalledFunction();
|
|
}
|
|
|
|
bool llvm::isStatepoint(ImmutableCallSite CS) {
|
|
if (auto *F = getCalledFunction(CS))
|
|
return F->getIntrinsicID() == Intrinsic::experimental_gc_statepoint;
|
|
return false;
|
|
}
|
|
|
|
bool llvm::isStatepoint(const Value *V) {
|
|
if (auto CS = ImmutableCallSite(V))
|
|
return isStatepoint(CS);
|
|
return false;
|
|
}
|
|
|
|
bool llvm::isStatepoint(const Value &V) {
|
|
return isStatepoint(&V);
|
|
}
|
|
|
|
bool llvm::isGCRelocate(ImmutableCallSite CS) {
|
|
return CS.getInstruction() && isa<GCRelocateInst>(CS.getInstruction());
|
|
}
|
|
|
|
bool llvm::isGCResult(ImmutableCallSite CS) {
|
|
return CS.getInstruction() && isa<GCResultInst>(CS.getInstruction());
|
|
}
|
|
|
|
bool llvm::isStatepointDirectiveAttr(Attribute Attr) {
|
|
return Attr.hasAttribute("statepoint-id") ||
|
|
Attr.hasAttribute("statepoint-num-patch-bytes");
|
|
}
|
|
|
|
StatepointDirectives
|
|
llvm::parseStatepointDirectivesFromAttrs(AttributeList AS) {
|
|
StatepointDirectives Result;
|
|
|
|
Attribute AttrID =
|
|
AS.getAttribute(AttributeList::FunctionIndex, "statepoint-id");
|
|
uint64_t StatepointID;
|
|
if (AttrID.isStringAttribute())
|
|
if (!AttrID.getValueAsString().getAsInteger(10, StatepointID))
|
|
Result.StatepointID = StatepointID;
|
|
|
|
uint32_t NumPatchBytes;
|
|
Attribute AttrNumPatchBytes = AS.getAttribute(AttributeList::FunctionIndex,
|
|
"statepoint-num-patch-bytes");
|
|
if (AttrNumPatchBytes.isStringAttribute())
|
|
if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes))
|
|
Result.NumPatchBytes = NumPatchBytes;
|
|
|
|
return Result;
|
|
}
|