[PATCH] D159082: [ELF][RISCV] Implement --emit-relocs with relaxation

Job Noorman via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 7 12:02:24 PDT 2023


jobnoorman added a comment.

In D159082#4639290 <https://reviews.llvm.org/D159082#4639290>, @jrtc27 wrote:

> I think it's still a bit dodgy for R_RISCV_ALIGN specifically, and don't like the divergence from GNU ld -- there should really be consensus between the toolchains there -- but it may be ok.

I definitely see the point here as well, especially about toolchain consensus.

While trying to figure out whether GNU ld's treatment of `R_RISCV_ALIGN` is intentional, I noticed that the behavior of `--emit-relocs --relax` has changed quite a bit since 2.40 (more specifically, since this commit <https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=43025f01a0c99c939e20e90a6e695741c14a925a>). Since then, most `R_RISCV_RELAX` relocations are also changed to `R_RISCV_NONE`. This is the output of GNU ld 2.41 on the test case in this patch:

  $ riscv64-linux-gnu-gcc -c llvm-project/lld/test/ELF/riscv-relax-emit-relocs.s
  $ binutils-gdb/build/ld/ld-new -q -Ttext=0 riscv-relax-emit-relocs.o
  $ riscv64-linux-gnu-objdump -dr a.out
  
  a.out:     file format elf64-littleriscv
  
  
  Disassembly of section .text:
  
  0000000000000000 <_start>:
     0:	008000ef          	jal	ra,8 <f>
  			0: R_RISCV_JAL	f
     4:	004000ef          	jal	ra,8 <f>
  			4: R_RISCV_NONE	*ABS*+0x4
  			4: R_RISCV_JAL	f
  
  0000000000000008 <f>:
     8:	8082                	ret
  			8: R_RISCV_NONE	*ABS*+0x4
  			8: R_RISCV_NONE	*ABS*+0x6

I have the feeling this behavior is not intentional at all but rather an artifact of the implementation of relaxation (metadata about necessary code deletion is encoded in relocations which are later overwritten with `R_RISCV_NONE`).

Given the behavior of the two toolchains has diverged, I think it would make sense to sync with the GNU devs to agree on what the behavior should be. I will start with either opening a bug report or proposing a patch for GNU binutils tomorrow.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D159082



More information about the llvm-commits mailing list