tmgross added a comment.

In D86310#4516911 <https://reviews.llvm.org/D86310#4516911>, @hvdijk wrote:

> In D86310#4516876 <https://reviews.llvm.org/D86310#4516876>, @pengfei wrote:
>
>> Just FYI. There are a few reports about the compatibility issues, e.g., 
>> #41784 <https://github.com/llvm/llvm-project/issues/41784>.
>
> Thanks. This is a case where clang breaks up `__int128` into 2x `i64` before 
> it gets to LLVM. It is therefore not affected by this patch. Your other link 
> also references #20283 <https://github.com/llvm/llvm-project/issues/20283>, 
> which is the same issue of clang breaking `__int128` into 2x `i64`.
>
> Although this patch will not fix those issues, it may make it easier to fix 
> them later on: it will give clang the ability to use LLVM's `i128` type 
> rather than trying to emulate it.>

Does this happen on the clang side or the LLVM side? I built rustc against LLVM 
with your patch ([link to 
source](llvm.org/docs/LangRef.html#floating-point-types)) and it makes rustc 
compatible with clang (progress!) but it still seems not compatible with GCC. 
That is, after the patch rustc now seems to have an identical calling behavior 
to clang, so I'm thinking that maybe this behavior lies somewhere in LLVM and 
not the frontend?

Quick ABI check that demonstrates this 
https://github.com/tgross35/quick-abi-check, the outputs of note (clang-new is 
built with this patch):

  # all caller-foo-callee-samefoo work fine
  
  + ./bins/caller-gcc-callee-gcc
  caller cc: gcc 11.3.0
  caller align i128 16
  caller arg0 244
  caller argval 0xf0e0d0c0b0a09080706050403020100
  caller arg15 123456.125000
  callee cc: gcc 11.3.0
  callee arg0 244
  callee arg1 0xf0e0d0c0b0a09080706050403020100
  callee arg2 0xf0e0d0c0b0a09080706050403020100
  callee arg3 0xf0e0d0c0b0a09080706050403020100
  callee arg4 0xf0e0d0c0b0a09080706050403020100
  callee arg15 123456.125000
  
  # between clang and gcc arg3+ seem to flip he word order?
  + ./bins/caller-gcc-callee-clang-old
  caller cc: gcc 11.3.0
  caller align i128 16
  caller arg0 244
  caller argval 0xf0e0d0c0b0a09080706050403020100
  caller arg15 123456.125000
  callee cc: clang 14.0.0 
  callee arg0 244
  callee arg1 0xf0e0d0c0b0a09080706050403020100
  callee arg2 0xf0e0d0c0b0a09080706050403020100
  callee arg3 0x7060504030201000000000000000000
  callee arg4 0x7060504030201000f0e0d0c0b0a0908
  callee arg15 123456.125000
  
  + ./bins/caller-gcc-callee-clang-new
  caller cc: gcc 11.3.0
  caller align i128 16
  caller arg0 244
  caller argval 0xf0e0d0c0b0a09080706050403020100
  caller arg15 123456.125000
  callee cc: clang 17.0.0 (g...@github.com:tgross35/llvm-project.git 
1733d949633a61cd0213f63e22d461a39e798946)
  callee arg0 244
  callee arg1 0xf0e0d0c0b0a09080706050403020100
  callee arg2 0xf0e0d0c0b0a09080706050403020100
  callee arg3 0x7060504030201000000000000000000
  callee arg4 0x7060504030201000f0e0d0c0b0a0908
  callee arg15 123456.125000

I think this patch can stand on its own even if it doesn't fix the above, but 
I'm just trying to get a better idea of where it's coming from if anyone knows 
more details.

>> There's also concern about the alignment difference between `_BitInt(128)` 
>> and `__int128`, see #60925 
>> <https://github.com/llvm/llvm-project/issues/60925>
>
> That references https://gitlab.com/x86-psABIs/x86-64-ABI/-/issues/11, where 
> the answer four months ago was basically "it's probably already too late for 
> that" with a suggestion to try and post on the mailing list to try and 
> convince others that this was important enough to do. Nothing was posted to 
> the mailing list, and by now GCC has started implementing what the ABI 
> specifies (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102989). I think we 
> would need an extraordinary rationale if we want to convince others that the 
> ABI should be changed.

I reached out to the person who authored that. We will follow up with the 
mailing list to at least make a mild push for `_BitInt(128)` to take the 
alignment of `__int128` (imagine the stackoverflow confusion if they aren't the 
same). However, I'm in agreement with the above comment - that is a separate 
concern from the behavior here since LLVM already complies with the bitint spec.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D86310/new/

https://reviews.llvm.org/D86310

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to