[PATCH] D60456: [RISCV] Hard float ABI support
Alex Bradbury via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 8 06:56:33 PDT 2019
asb marked an inline comment as done.
asb added inline comments.
================
Comment at: clang/lib/CodeGen/TargetInfo.cpp:9352
+ return false;
+ // As a quirk of the ABI, zero-width bitfields aren't ignored for fp+fp
+ // or int+fp structs, but are ignored for a struct with an fp field and
----------------
rogfer01 wrote:
> I found some mismatch in behaviour between gcc and g++ that we may want to address in the psABI first.
>
> For instance, given the following struct (I'm using gcc 8.3.0)
>
> ```lang=cpp
> // t.c
> struct A
> {
> int :0;
> double d;
> int :0;
> long x;
> int :0;
> };
>
> extern void bar(struct A);
> void foo(struct A a)
> {
> a.d =- a.d;
> a.x += 1;
> return bar(a);
> }
> ```
>
> we are emitting this
>
> ```
> $ clang --target=riscv64 -march=rv64gc -mabi=lp64d -S -o- t.c -O2
> ...
> foo: # @foo
> # %bb.0: # %entry
> addi a2, zero, -1
> slli a2, a2, 63
> xor a0, a0, a2
> addi a1, a1, 1
> tail bar
> ```
>
> which matches with what g++ does (i.e in both cases `a0` is `a.d` and `a1` is `a.x`)
>
> ```
> $ ./riscv64-unknown-linux-gnu-g++ -S -O2 -o- -x c test.cc
> ...
> foo:
> fmv.d.x fa5,a0
> addi sp,sp,-16
> fneg.d fa5,fa5
> addi a1,a1,1
> addi sp,sp,16
> fmv.x.d a0,fa5
> tail bar
> ```
>
> But I found a mismatch while using C++. Clang emits the same for C and C++ (modulo `.cfi` stuff)
>
> ```
> $ clang --target=riscv64 -march=rv64gc -mabi=lp64d -S -o- -x c++ t.c -O2
> _Z3foo1A: # @_Z3foo1A
> .cfi_startproc
> # %bb.0: # %entry
> addi a2, zero, -1
> slli a2, a2, 63
> xor a0, a0, a2
> addi a1, a1, 1
> .cfi_def_cfa_offset 0
> tail _Z3bar1A
> ```
>
> But g++ seems to ignore the zero-width bitfields: `fa0` is `a.d` and `a0` is `a.x`
>
> ```
> $ riscv64-unknown-linux-gnu-g++ -S -O2 -x c++ t.c -o-
> ...
> _Z3foo1A:
> .LFB0:
> .cfi_startproc
> fneg.d fa0,fa0
> addi sp,sp,-16
> .cfi_def_cfa_offset 16
> addi a0,a0,1
> addi sp,sp,16
> .cfi_def_cfa_offset 0
> tail _Z3bar1A
> .cfi_endproc
> ```
>
> This is a bit worrying as it might complicate interoperability between C and C++ (I tried wrapping everything inside an `extern "C"` just in case but it didn't change g++'s behaviour).
>
> Do you mind to confirm this issue?
Thanks, I'm seeing this in GCC 9.1.0 as well. I left[ a comment](https://github.com/riscv/riscv-elf-psabi-doc/issues/99#issuecomment-509233798) on the relevant psABI issue. It seems there is a GCC bug here, but hopefully someone can confirm what the "correct" behaviour is.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D60456/new/
https://reviews.llvm.org/D60456
More information about the cfe-commits
mailing list