[llvm] r223322 - A few more checks for gc.statepoints in the Verifier

Philip Reames listmail at philipreames.com
Wed Dec 3 16:01:48 PST 2014


Author: reames
Date: Wed Dec  3 18:01:48 2014
New Revision: 223322

URL: http://llvm.org/viewvc/llvm-project?rev=223322&view=rev
Log:
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.


Modified:
    llvm/trunk/lib/IR/Verifier.cpp

Modified: llvm/trunk/lib/IR/Verifier.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Verifier.cpp?rev=223322&r1=223321&r2=223322&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Verifier.cpp (original)
+++ llvm/trunk/lib/IR/Verifier.cpp Wed Dec  3 18:01:48 2014
@@ -2562,12 +2562,21 @@ void Verifier::visitIntrinsicFunctionCal
     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<PointerType>(Target->getType());
     Assert2(PT && PT->getElementType()->isFunctionTy(),
             "gc.statepoint callee must be of function pointer type",
             &CI, Target);
     FunctionType *TargetFuncType = cast<FunctionType>(PT->getElementType());
+    Assert1(!TargetFuncType->isVarArg(),
+            "gc.statepoint support for var arg functions not implemented", &CI);
 
     const Value *NumCallArgsV = CI.getArgOperand(1);
     Assert1(isa<ConstantInt>(NumCallArgsV),
@@ -2577,6 +2586,8 @@ void Verifier::visitIntrinsicFunctionCal
     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<ConstantInt>(Unused) &&





More information about the llvm-commits mailing list