diff options
author | Peter Lafreniere <peter@n8pjl.ca> | 2024-05-03 11:14:56 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-03 23:14:56 +0800 |
commit | ebbc5de7db45b2fc81564a6c870a57f4b95d0477 (patch) | |
tree | d907b05be0e5b154fd23ecd7e7e756bb82247516 /clang/lib/CodeGen/CodeGenFunction.cpp | |
parent | 56b8bd77445f2f7cc15c294c9089b73ca8f9ecdd (diff) | |
download | llvm-ebbc5de7db45b2fc81564a6c870a57f4b95d0477.zip llvm-ebbc5de7db45b2fc81564a6c870a57f4b95d0477.tar.gz llvm-ebbc5de7db45b2fc81564a6c870a57f4b95d0477.tar.bz2 |
[M68k] Correctly emit non-pic relocations (#89863)
The m68k backend will always emit external calls (including libcalls)
with
PC-relative PLT relocations, even when in non-pic mode or -fno-plt is
used.
This is unexpected, as other function calls are emitted with absolute
addressing, and a static code modes suggests that there is no PLT. It
also
leads to a miscompilation where the call instruction emitted expects an
immediate address, while the relocation emitted for that instruction is
PC-relative.
This miscompilation can even be seen in the default C function in
godbolt:
https://godbolt.org/z/zEoazovzo
Fix the issue by classifying external function references based upon the
pic
mode. This triggers a change in the static code model, making it more in
line
with the expected behaviour and allowing use of this backend in more
bare-metal
situations where a PLT does not exist.
The change avoids the issue where we emit a PLT32 relocation for an
absolute
call, and makes libcalls and other external calls use absolute
addressing modes
when a static code model is desired.
Further work should be done in instruction lowering and validation to
ensure
that miscompilations of the same type don't occur.
Diffstat (limited to 'clang/lib/CodeGen/CodeGenFunction.cpp')
0 files changed, 0 insertions, 0 deletions