From 5862c2af3ed76e13fbd401e99b50fbc45caaba80 Mon Sep 17 00:00:00 2001 From: Philip Reames Date: Thu, 4 Dec 2014 00:01:48 +0000 Subject: [PATCH] A few more checks for gc.statepoints in the Verifier This is simply a grab bag of unrelated checks: - A statepoint call can't be marked readonly or readnone - We don't currently support inline asm or varadic target functions. Both could be supported, but don't currently work. - I forgot to check that the number of call arguments actually matched the wrapped callee in my previous change. Included here. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223322 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/Verifier.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/IR/Verifier.cpp b/lib/IR/Verifier.cpp index d5b54f237d0..976786d047c 100644 --- a/lib/IR/Verifier.cpp +++ b/lib/IR/Verifier.cpp @@ -2562,12 +2562,21 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { break; case Intrinsic::experimental_gc_statepoint: { + Assert1(!CI.doesNotAccessMemory() && + !CI.onlyReadsMemory(), + "gc.statepoint must read and write memory to preserve " + "reordering restrictions required by safepoint semantics", &CI); + Assert1(!CI.isInlineAsm(), + "gc.statepoint support for inline assembly unimplemented", &CI); + const Value *Target = CI.getArgOperand(0); const PointerType *PT = dyn_cast(Target->getType()); Assert2(PT && PT->getElementType()->isFunctionTy(), "gc.statepoint callee must be of function pointer type", &CI, Target); FunctionType *TargetFuncType = cast(PT->getElementType()); + Assert1(!TargetFuncType->isVarArg(), + "gc.statepoint support for var arg functions not implemented", &CI); const Value *NumCallArgsV = CI.getArgOperand(1); Assert1(isa(NumCallArgsV), @@ -2577,6 +2586,8 @@ void Verifier::visitIntrinsicFunctionCall(Intrinsic::ID ID, CallInst &CI) { Assert1(NumCallArgs >= 0, "gc.statepoint number of arguments to underlying call " "must be positive", &CI); + Assert1(NumCallArgs == (int)TargetFuncType->getNumParams(), + "gc.statepoint mismatch in number of call args", &CI); const Value *Unused = CI.getArgOperand(2); Assert1(isa(Unused) &&