summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/Verifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r--llvm/lib/IR/Verifier.cpp16
1 files changed, 14 insertions, 2 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index 899534dd10f..bc2e10c049a 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -1930,6 +1930,7 @@ void Verifier::verifyStatepoint(ImmutableCallSite CS) {
// Verify that the types of the call parameter arguments match
// the type of the wrapped callee.
+ AttributeList Attrs = CS.getAttributes();
for (int i = 0; i < NumParams; i++) {
Type *ParamType = TargetFuncType->getParamType(i);
Type *ArgType = CS.getArgument(5 + i)->getType();
@@ -1937,6 +1938,12 @@ void Verifier::verifyStatepoint(ImmutableCallSite CS) {
"gc.statepoint call argument does not match wrapped "
"function type",
&CI);
+
+ if (TargetFuncType->isVarArg()) {
+ AttributeSet ArgAttrs = Attrs.getParamAttributes(5 + i);
+ Assert(!ArgAttrs.hasAttribute(Attribute::StructRet),
+ "Attribute 'sret' cannot be used for vararg call arguments!", &CI);
+ }
}
const int EndCallArgsInx = 4 + NumCallArgs;
@@ -2814,8 +2821,13 @@ void Verifier::verifyCallSite(CallSite CS) {
SawReturned = true;
}
- Assert(!ArgAttrs.hasAttribute(Attribute::StructRet),
- "Attribute 'sret' cannot be used for vararg call arguments!", I);
+ // Statepoint intrinsic is vararg but the wrapped function may be not.
+ // Allow sret here and check the wrapped function in verifyStatepoint.
+ if (CS.getCalledFunction() == nullptr ||
+ CS.getCalledFunction()->getIntrinsicID() !=
+ Intrinsic::experimental_gc_statepoint)
+ Assert(!ArgAttrs.hasAttribute(Attribute::StructRet),
+ "Attribute 'sret' cannot be used for vararg call arguments!", I);
if (ArgAttrs.hasAttribute(Attribute::InAlloca))
Assert(Idx == CS.arg_size() - 1, "inalloca isn't on the last argument!",
OpenPOWER on IntegriCloud