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

            Bug ID: 19909
           Summary: va_arg fails with __int128
           Product: new-bugs
           Version: trunk
          Hardware: All
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: new bugs
          Assignee: [email protected]
          Reporter: [email protected]
                CC: [email protected]
    Classification: Unclassified

Created attachment 12583
  --> http://llvm.org/bugs/attachment.cgi?id=12583&action=edit
Demonstrate __int128 va_arg failure

The attached example fails on Clang/LLVM trunk (or 3.4 or Apple 3.4) and passes
when compiled with gcc 4.8.2.  The code simple tries to pass multiple __int128
after two ints and a pointer.  I debugged it a bit and it seems that the
"overflow_arg_area" pointer in va_list is wrong by 8 bytes, which might
indicate some alignment problem. 

I also checked how __int128 is passed to the function.  It seems that Clang is
capable of splitting the __int128 where lower part is passed in a register and
upper part on the stack.  GCC does not split __int128 if it does not have 2
registers available.  This might explain the wrong 8 bytes offset for the
"overflow_arg_area" as va_start does not adjust for the split register.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
_______________________________________________
LLVMbugs mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/llvmbugs

Reply via email to