[llvm-bugs] [Bug 44228] New: clang assumes zero-extension of 8-bit arguments in x86, causing interop issues with gcc

via llvm-bugs llvm-bugs at lists.llvm.org
Thu Dec 5 05:26:57 PST 2019


https://bugs.llvm.org/show_bug.cgi?id=44228

            Bug ID: 44228
           Summary: clang assumes zero-extension of 8-bit arguments in
                    x86, causing interop issues with gcc
           Product: clang
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: enhancement
          Priority: P
         Component: LLVM Codegen
          Assignee: unassignedclangbugs at nondot.org
          Reporter: emilio at crisal.io
                CC: llvm-bugs at lists.llvm.org, neeilans at live.com,
                    richard-llvm at metafoo.co.uk

Created attachment 22899
  --> https://bugs.llvm.org/attachment.cgi?id=22899&action=edit
test-case

When receiving 8-bit-wide arguments in extern function, clang seems to assume
the argument has been zero-extended by the caller.

According to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92821#c2:

> I believe it is a LLVM bug.
> At least, reading https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-1.0.pdf, I can't find in the Parameter Passing section anything that would say that arguments smaller than 64-bit are passed sign or zero extended to 64-bit like some other psABIs require.  The only related thing is
> "When a value of type _Bool is returned or passed in a register or on the stack, bit 0 contains the truth value and bits 1 to 7 shall be zero."
> with a footnote:
> "Other bits are left unspecified, hence the consumer side of those values can rely on it being 0 or 1 when truncated to 8 bit."
> which says that _Bool has only significant low 8 bits and the rest is unspecified.

https://godbolt.org/z/BNHxEY has a comparison of clang and gcc output for the
attached test-case. GCC correctly does an 8-bit load, disregarding the rest of
the bits in the register.

This causes real problems when gcc-built functions call into llvm-built
functions. See https://bugzilla.mozilla.org/show_bug.cgi?id=1600735 for an
example that happens on Firefox. GCC may not always sign-extend in the caller.

In the Firefox case the LLVM-built function is Rust code, but per the above
godbolt link it also seems to reproduce with C / C++.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20191205/268e304f/attachment-0001.html>


More information about the llvm-bugs mailing list