forked from OSchip/llvm-project
[Statepoints] Separate out logic for statepoint directives; NFC
This splits out the logic that maps the `"statepoint-id"` attribute into the actual statepoint ID, and the `"statepoint-num-patch-bytes"` attribute into the number of patchable bytes the statpeoint is lowered into. The new home of this logic is in IR/Statepoint.cpp, and this refactoring will support similar functionality when lowering calls with deopt operand bundles in the future. llvm-svn: 263685
This commit is contained in:
parent
c291e1fd4f
commit
312038872d
|
@ -8,8 +8,9 @@
|
|||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file contains utility functions and a wrapper class analogous to
|
||||
// CallSite for accessing the fields of gc.statepoint, gc.relocate, and
|
||||
// gc.result intrinsics
|
||||
// CallSite for accessing the fields of gc.statepoint, gc.relocate,
|
||||
// gc.result intrinsics; and some general utilities helpful when dealing with
|
||||
// gc.statepoint.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
|
@ -17,6 +18,7 @@
|
|||
#define LLVM_IR_STATEPOINT_H
|
||||
|
||||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/ADT/Optional.h"
|
||||
#include "llvm/IR/BasicBlock.h"
|
||||
#include "llvm/IR/CallSite.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
|
@ -399,6 +401,23 @@ StatepointBase<FunTy, InstructionTy, ValueTy, CallSiteTy>::getRelocates()
|
|||
}
|
||||
return Result;
|
||||
}
|
||||
|
||||
/// Call sites that get wrapped by a gc.statepoint (currently only in
|
||||
/// RewriteStatepointsForGC and potentially in other passes in the future) can
|
||||
/// have attributes that describe properties of gc.statepoint call they will be
|
||||
/// eventually be wrapped in. This struct is used represent such directives.
|
||||
struct StatepointDirectives {
|
||||
Optional<uint32_t> NumPatchBytes;
|
||||
Optional<uint64_t> StatepointID;
|
||||
};
|
||||
|
||||
/// Parse out statepoint directives from the function attributes present in \p
|
||||
/// AS.
|
||||
StatepointDirectives parseStatepointDirectivesFromAttrs(AttributeSet AS);
|
||||
|
||||
/// Return \c true if the the \p Attr is an attribute that is a statepoint
|
||||
/// directive.
|
||||
bool isStatepointDirectiveAttr(Attribute Attr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -53,3 +53,28 @@ bool llvm::isGCResult(ImmutableCallSite CS) {
|
|||
bool llvm::isGCResult(const Value *V) {
|
||||
return isGCResult(ImmutableCallSite(V));
|
||||
}
|
||||
|
||||
bool llvm::isStatepointDirectiveAttr(Attribute Attr) {
|
||||
return Attr.hasAttribute("statepoint-id") ||
|
||||
Attr.hasAttribute("statepoint-num-patch-bytes");
|
||||
}
|
||||
|
||||
StatepointDirectives llvm::parseStatepointDirectivesFromAttrs(AttributeSet AS) {
|
||||
StatepointDirectives Result;
|
||||
|
||||
Attribute AttrID =
|
||||
AS.getAttribute(AttributeSet::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(AttributeSet::FunctionIndex,
|
||||
"statepoint-num-patch-bytes");
|
||||
if (AttrNumPatchBytes.isStringAttribute())
|
||||
if (!AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes))
|
||||
Result.NumPatchBytes = NumPatchBytes;
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
|
|
@ -1187,8 +1187,7 @@ static AttributeSet legalizeCallAttributes(AttributeSet AS) {
|
|||
// These attributes control the generation of the gc.statepoint call /
|
||||
// invoke itself; and once the gc.statepoint is in place, they're of no
|
||||
// use.
|
||||
if (Attr.hasAttribute("statepoint-num-patch-bytes") ||
|
||||
Attr.hasAttribute("statepoint-id"))
|
||||
if (isStatepointDirectiveAttr(Attr))
|
||||
continue;
|
||||
|
||||
Ret = Ret.addAttributes(
|
||||
|
@ -1332,17 +1331,14 @@ makeStatepointExplicitImpl(const CallSite CS, /* to replace */
|
|||
TransitionArgs = TransitionBundle->Inputs;
|
||||
}
|
||||
|
||||
Value *CallTarget = CS.getCalledValue();
|
||||
AttributeSet OriginalAttrs = CS.getAttributes();
|
||||
Attribute AttrID = OriginalAttrs.getAttribute(AttributeSet::FunctionIndex,
|
||||
"statepoint-id");
|
||||
if (AttrID.isStringAttribute())
|
||||
AttrID.getValueAsString().getAsInteger(10, StatepointID);
|
||||
StatepointDirectives SD =
|
||||
parseStatepointDirectivesFromAttrs(CS.getAttributes());
|
||||
if (SD.NumPatchBytes)
|
||||
NumPatchBytes = *SD.NumPatchBytes;
|
||||
if (SD.StatepointID)
|
||||
StatepointID = *SD.StatepointID;
|
||||
|
||||
Attribute AttrNumPatchBytes = OriginalAttrs.getAttribute(
|
||||
AttributeSet::FunctionIndex, "statepoint-num-patch-bytes");
|
||||
if (AttrNumPatchBytes.isStringAttribute())
|
||||
AttrNumPatchBytes.getValueAsString().getAsInteger(10, NumPatchBytes);
|
||||
Value *CallTarget = CS.getCalledValue();
|
||||
|
||||
// Create the statepoint given all the arguments
|
||||
Instruction *Token = nullptr;
|
||||
|
|
Loading…
Reference in New Issue