aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineFunction.cpp
diff options
context:
space:
mode:
authorFangrui Song <i@maskray.me>2025-08-12 22:38:17 -0700
committerFangrui Song <i@maskray.me>2025-08-12 22:38:17 -0700
commit94655dc8aec2f4e4b287e4c6ac829263f93e9740 (patch)
treef2505e9168bd4e9dc973a71c10a379bbf76caa0a /llvm/lib/CodeGen/MachineFunction.cpp
parent136c5586bdcdb0c8df1da004dabb34758f20ec7d (diff)
downloadllvm-94655dc8aec2f4e4b287e4c6ac829263f93e9740.zip
llvm-94655dc8aec2f4e4b287e4c6ac829263f93e9740.tar.gz
llvm-94655dc8aec2f4e4b287e4c6ac829263f93e9740.tar.bz2
[ELF] -r: Synthesize R_RISCV_ALIGN at input section start" (#151639)
Clear `synthesizedAligns` to prevent stray relocations to an unrelated text section. Enhance the test to check llvm-readelf -r output. --- Without linker relaxation enabled for a particular relocatable file or section (e.g., using .option norelax), the assembler will not generate R_RISCV_ALIGN relocations for alignment directives. This becomes problematic in a two-stage linking process: ``` ld -r a.o b.o -o ab.o // b.o is norelax. Its alignment information is lost in ab.o. ld ab.o -o ab ``` When ab.o is linked into an executable, the preceding relaxed section (a.o's content) might shrink. Since there's no R_RISCV_ALIGN relocation in b.o for the linker to act upon, the `.word 0x3a393837` data in b.o may end up unaligned in the final executable. To address the issue, this patch inserts NOP bytes and synthesizes an R_RISCV_ALIGN relocation at the beginning of a text section when the alignment >= 4. For simplicity, when RVC is disabled, we synthesize an ALIGN relocation (addend: 2) for a 4-byte aligned section, allowing the linker to trim the excess 2 bytes. See also https://sourceware.org/bugzilla/show_bug.cgi?id=33236
Diffstat (limited to 'llvm/lib/CodeGen/MachineFunction.cpp')
0 files changed, 0 insertions, 0 deletions