Issue 104853
Summary [RISC-V] Unlinked obj file branches contain a fake infinite-loop destination.
Labels new issue
Assignees
Reporter patrick-rivos
    Using the same input assembly file from:
```c
int x = 0;
int min(int y)
{
	while (x != 192) {
		x += 1;
	}
	return y;
}
int main() {
	min(1);
}
```
gnu-as assembled program looks normal:
```
map-binutils.o: file format elf64-littleriscv

Disassembly of section .text:

0000000000000000 <min>:
       0: 000005b7      lui     a1, 0x0
       4: 0005a683      lw      a3, 0x0(a1)
       8: 0c000613 li      a2, 0xc0
       c: 00c68463      beq     a3, a2, 0x14 <.LBB0_2>
      10: 00c5a023      sw      a2, 0x0(a1)

0000000000000014 <.LBB0_2>:
      14: 8082 ret

0000000000000016 <main>:
      16: 00000537      lui     a0, 0x0
      1a: 00052603      lw      a2, 0x0(a0)
      1e: 0c000593 li      a1, 0xc0
      22: 00b60463      beq     a2, a1, 0x2a <.LBB1_2>
      26: 00b52023      sw      a1, 0x0(a0)

000000000000002a <.LBB1_2>:
      2a: 4501          li a0, 0x0
      2c: 8082          ret
      2e: 0000 unimp
```
But LLVM's obj file looks like: (each branch is an infinite loop)
```
map.o:  file format elf64-littleriscv

Disassembly of section .text:

0000000000000000 <min>:
       0: 000005b7      lui a1, 0x0
       4: 0005a683      lw      a3, 0x0(a1)
       8: 0c000613      li      a2, 0xc0
       c: 00c68063      beq     a3, a2, 0xc <min+0xc>
      10: 00c5a023      sw      a2, 0x0(a1)
      14: 8082 ret

0000000000000016 <main>:
      16: 00000537      lui a0, 0x0
      1a: 00052603      lw      a2, 0x0(a0)
      1e: 0c000593 li      a1, 0xc0
      22: 00b60063      beq     a2, a1, 0x22 <main+0xc>
      26: 00b52023      sw      a1, 0x0(a0)
      2a: 4501 li      a0, 0x0
      2c: 8082          ret
```
gnu-objdump and llvm-objdump agree on this output so it's probably not on the objdump side of things.

When actually linked the offsets are updated to the correct addresses (with both lld/ld):
```
000000000001129e <min>:
 1129e: 000155b7     	lui	a1, 0x15
   112a2: 2f05a683     	lw	a3, 0x2f0(a1)
   112a6: 0c000613     	li	a2, 0xc0
   112aa: 00c68463 	beq	a3, a2, 0x112b2 <min+0x14>
   112ae: 2ec5a823     	sw	a2, 0x2f0(a1)
   112b2: 8082         	ret
```

I think the actual dests in the LLVM obj file are encoded using R_RISCV_BRANCH.

This behavior makes inspecting unlinked object files unintuitive at first glance.
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to