[llvm-commits] [llvm] r72248 - in /llvm/trunk: lib/VMCore/Verifier.cpp test/Assembler/2009-05-22-CC.ll test/Verifier/2009-05-22-CC.ll

Nick Lewycky nicholas at mxc.ca
Fri May 22 21:17:43 PDT 2009


Torok Edwin wrote:
> Author: edwin
> Date: Fri May 22 01:41:43 2009
> New Revision: 72248
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=72248&view=rev
> Log:
> Verify that calling conventions match function prototype.
> This only rejects mismatches between target specific calling convention
> and C/LLVM specific calling convention.
> There are too many fastcc/C, coldcc/cc42 mismatches in the testsuite, these are
> not reject by the verifier.

I see this has already been reverted but I just wanted to reaffirm that 
this is indeed the wrong thing to do.

The issue is that a transformation could accidentally take the program 
from valid to invalid without making any change to the programs 
semantics when run.

If you really want to do this you would need to make the calling 
convention part of the type so that it's really statically checkable 
even in the indirect call case. (Please don't do that, you would just 
end up with extra useless bitcasts to switch calling convention.)

Nick

> 
> Added:
>     llvm/trunk/test/Assembler/2009-05-22-CC.ll
>     llvm/trunk/test/Verifier/2009-05-22-CC.ll
> Modified:
>     llvm/trunk/lib/VMCore/Verifier.cpp
> 
> Modified: llvm/trunk/lib/VMCore/Verifier.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Verifier.cpp?rev=72248&r1=72247&r2=72248&view=diff
> 
> ==============================================================================
> --- llvm/trunk/lib/VMCore/Verifier.cpp (original)
> +++ llvm/trunk/lib/VMCore/Verifier.cpp Fri May 22 01:41:43 2009
> @@ -1024,6 +1024,31 @@
>              "Call parameter type does not match function signature!",
>              CS.getArgument(i), FTy->getParamType(i), I);
>  
> +  Assert2(CS.getType() == FTy->getReturnType(),
> +          "Call return type does not match function signature!",
> +          CS.getInstruction(), FTy->getReturnType());
> +
> +  // Verify calling convention for direct calls
> +  Value *CalledF = CS.getCalledValue()->stripPointerCasts();
> +  if (Function *F = dyn_cast<Function>(CalledF)) {
> +    unsigned CC1 = CS.getCallingConv();
> +    unsigned CC2 = F->getCallingConv();
> +    if(CC1 != CC2) {
> +      // tolerate some mismatch among C prototype and LLVM-specific calling conv
> +      if (CC2 >= CallingConv::FirstTargetCC || 
> +          CC1 >= CallingConv::FirstTargetCC) {
> +        Instruction *I = CS.getInstruction()->clone();
> +        if (CallInst *CI = dyn_cast<CallInst>(I)) {
> +          CI->setCallingConv(F->getCallingConv());
> +        } else
> +          cast<InvokeInst>(I)->setCallingConv(F->getCallingConv());
> +        Assert2(0,"Calling convention does not match function signature!",
> +                CS.getInstruction(), I);
> +        delete I;
> +      }
> +    }
> +  }
> +
>    if (CS.getCalledValue()->getNameLen() < 5 ||
>        strncmp(CS.getCalledValue()->getNameStart(), "llvm.", 5) != 0) {
>      // Verify that none of the arguments are metadata...
> 
> Added: llvm/trunk/test/Assembler/2009-05-22-CC.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Assembler/2009-05-22-CC.ll?rev=72248&view=auto
> 
> ==============================================================================
> --- llvm/trunk/test/Assembler/2009-05-22-CC.ll (added)
> +++ llvm/trunk/test/Assembler/2009-05-22-CC.ll Fri May 22 01:41:43 2009
> @@ -0,0 +1,9 @@
> +; RUN: llvm-as < %s
> +
> +; Verify that calls with correct calling conv are accepted
> +declare x86_stdcallcc i32 @re_string_construct(i8* inreg %pstr, i8* inreg %str, i32 inreg %len, i8* %trans, i32 %icase, i8* %dfa);
> +define void @main() {
> +entry:
> +	%0 = call x86_stdcallcc i32 (...)* bitcast (i32 (i8*, i8*, i32, i8*, i32, i8*)* @re_string_construct to i32 (...)*)(i32 inreg 0, i32 inreg 0, i32 inreg 0, i32 0, i32 0, i8* inttoptr (i32 673194176 to i8*));
> +        ret void
> +}
> 
> Added: llvm/trunk/test/Verifier/2009-05-22-CC.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Verifier/2009-05-22-CC.ll?rev=72248&view=auto
> 
> ==============================================================================
> --- llvm/trunk/test/Verifier/2009-05-22-CC.ll (added)
> +++ llvm/trunk/test/Verifier/2009-05-22-CC.ll Fri May 22 01:41:43 2009
> @@ -0,0 +1,11 @@
> +; RUN: not llvm-as < %s |& grep {Calling convention does not match function signature}
> +; PR 4239
> +
> +; Verify that the calling convention on the call instruction matches the
> +; declared calling convention
> +declare x86_stdcallcc i32 @re_string_construct(i8* inreg %pstr, i8* inreg %str, i32 inreg %len, i8* %trans, i32 %icase, i8* %dfa);
> +define void @main() {
> +entry:
> +	%0 = call i32 (...)* bitcast (i32 (i8*, i8*, i32, i8*, i32, i8*)* @re_string_construct to i32 (...)*)(i32 inreg 0, i32 inreg 0, i32 inreg 0, i32 0, i32 0, i8* inttoptr (i32 673194176 to i8*))
> +        ret void
> +}
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 




More information about the llvm-commits mailing list