diff options
Diffstat (limited to 'llvm/lib/IR/Verifier.cpp')
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 16 |
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!", |