[LLVMbugs] [Bug 9791] New: x86-64 Linux structure calling convention is wrong

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Mon Apr 25 01:15:46 PDT 2011


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

           Summary: x86-64 Linux structure calling convention is wrong
           Product: libraries
           Version: 2.9
          Platform: PC
        OS/Version: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: Backend: X86
        AssignedTo: unassignedbugs at nondot.org
        ReportedBy: edsrzf at gmail.com
                CC: llvmbugs at cs.uiuc.edu


Code generated by the X86-64 backend does not follow the Linux calling
convention for structure passing. Consider this structure:

struct s {
  int* a;
  int b, c;
};

Clang and GCC both correctly pass the struct in two registers: one for the
pointer and one for the other two fields. Here's an example:

C function:

int foo(struct s x) {
  return x.b + x.c;
}

Assembly (with -O2):

foo:
        movq    %rsi, %rax
        shrq    $32, %rax
        addl    %esi, %eax
        ret

This is the IR for the equivalent function:

%struct = type { i32*, i32, i32 }

define i32 @foo(%struct %x) {
  %b = extractvalue %slice %x, 1
  %c = extractvalue %slice %x, 2
  %sum = add i32 %b, %c
  ret i32 %sum
}

When this is assembled with llvm-as and has the standard compile optimizations
run on it, it compiles to this assembly, which passes the struct in three
registers:

foo:
    leal    (%rsi,%rdx), %eax
    ret

It looks like there's a problem in the backend that Clang's somehow working
around.

-- 
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