[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)
commita62b86a3e66f6e328adc88bbd3a0c8b1991d35bb
authorFangrui Song <i@maskray.me>
Wed, 1 Nov 2023 19:10:44 +0000 (1 12:10 -0700)
committerGitHub <noreply@github.com>
Wed, 1 Nov 2023 19:10:44 +0000 (1 12:10 -0700)
tree9a8ed61d8a43214ff91f34d1b4440c38a6721a8a
parent442da60a3f11e644aeefe65f52b14cf82c5d6c8e
[AArch64,ELF] Restrict MOVZ/MOVK to non-PIC large code model (#70178)

There is no PIC support for -mcmodel=large

(https://github.com/ARM-software/abi-aa/blob/main/sysvabi64/sysvabi64.rst)
and Clang recently rejects -mcmodel= with PIC (#70262).

The current backend code assumes that the large code model is non-PIC.
This patch adds `!getTargetMachine().isPositionIndependent()` conditions
to clarify that the support is non-PIC only. In addition, add some tests
as change detectors in case PIC large code model is supported in the
future.

If other front-ends/JITs use the large code model with PIC, they will
get small code model code sequence, instead of potentially-incorrect
MOVZ/MOVK sequence, which is only suitable for non-PIC. The sequence
will cause text relocations using ELF linkers.

(The small code model code sequence is usually sufficient as ADRP+ADD or
ADRP+LDR targets [-2**32,2**32), which has a doubled range of x86-64
R_X86_64_REX_GOTPCRELX/R_X86_64_PC32 [-2**32,2**32).)
llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp
llvm/test/CodeGen/AArch64/GlobalISel/select-blockaddress.mir
llvm/test/CodeGen/AArch64/GlobalISel/select-gv-cmodel-large.mir
llvm/test/CodeGen/AArch64/GlobalISel/select-gv-with-offset.mir
llvm/test/CodeGen/AArch64/blockaddress.ll
llvm/test/CodeGen/AArch64/code-model-large-abs.ll [deleted file]
llvm/test/CodeGen/AArch64/code-model-large.ll [new file with mode: 0644]
llvm/test/CodeGen/AArch64/jump-table.ll