aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CodeGenFunction.cpp
diff options
context:
space:
mode:
authorPeter Lafreniere <peter@n8pjl.ca>2024-05-03 11:14:56 -0400
committerGitHub <noreply@github.com>2024-05-03 23:14:56 +0800
commitebbc5de7db45b2fc81564a6c870a57f4b95d0477 (patch)
treed907b05be0e5b154fd23ecd7e7e756bb82247516 /clang/lib/CodeGen/CodeGenFunction.cpp
parent56b8bd77445f2f7cc15c294c9089b73ca8f9ecdd (diff)
downloadllvm-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