[LLVMbugs] [Bug 10713] New: Frontends consider calls to "XYZ foo()" to be var-args, but this is wrong

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Sat Aug 20 05:15:51 PDT 2011


http://llvm.org/bugs/show_bug.cgi?id=10713

           Summary: Frontends consider calls to "XYZ foo()" to be
                    var-args, but this is wrong
           Product: new-bugs
           Version: unspecified
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: baldrick at free.fr
                CC: llvmbugs at cs.uiuc.edu


Clang/llvm-gcc and dragonegg all consider a call to a function declared without
any parameters to be a var-args function call.  However this gives the wrong
results when using the stdcall calling convention (with stdcall, the callee
pops
arguments except if it is a varargs function; so any mistake in the
"var-argness" of a call is fatal, unlike with the usual C convention where it
doesn't make any difference).

Consider the following testcase.  (The second call to bar is to make the stack
adjustments or lack of them clearer in the assembler):

#define STDCALL __attribute__((__stdcall__))

void STDCALL foo();          // Var-args or not var-args, that is the question!
void STDCALL bar(int);       // Definitely not var-args
void STDCALL varg(int, ...); // Definitely var-args

void g(int x, int y)
{
   foo(x, y);
   bar(x);
   varg(x, y);
   bar(y);
}

GCC assembler snippets (compiled with: gcc -m32 -O2 -S):


    call    foo
    subl    $8, %esp     <= Stack adjust, indicates not var-args!
...
    call    bar
    subl    $4, %esp     <= Stack adjust; not var-args
...
    call    varg
    movl    %ebx, (%esp) <= No stack adjust; var-args
...

Clang etc assembler snippets:

    calll    foo
    movl    %edi, (%esp) <= No stack adjust, indicates var-args; disagrees with
GCC
...
    calll    bar
    subl    $4, %esp     <= Stack adjust; not var-args; agrees with GCC
...
    calll    varg
    movl    %esi, (%esp) <= No stack adjust; var-args; agrees with GCC
...

This difference seems to be the cause of some crashes when running wine
compiled
with LLVM.

Note that using C++ and declaring foo "void foo(...)" doesn't make any
difference: GCC still calls it as if it were not var-args!

Digging into the GCC logic, the var-argness of a function type is determined
by the stdarg_p predicate (which returns true for var-args).  This special
cases function types with no parameters (as produced by the C front-end for
XYZ foo() and by the C++ front-end for XYZ foo(...)) as not being var-args.

-- 
Configure bugmail: http://llvm.org/bugs/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are on the CC list for the bug.



More information about the llvm-bugs mailing list