<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/108469>108469</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[feature][riscv] handle target address calculation in llvm-objdump disassembly for riscv
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
PiJoules
</td>
</tr>
</table>
<pre>
(Copied from fxbug.dev/42083016)
llvm-objdump for riscv has some deficiencies compared to binutils, mostly concerning multi instruction sequences in riscv to calculate an address or a constant.
Here is a simple test assembly file to generate what seems to be all of the obvious test cases and the results below
```
.text
test:
la a0, gdata
lla a0, gdata
lla a0, gdata
lw a0, gdata
lla a0, ldata
call func
tail func
li a0, 0x12345678
li a0, 0x1234567890abcdef
li a0, 0x10000
li a0, 0xfffff
.skip 0x100000
func:
ret
ldata:
.int 0
.data
gdata:
.int 0
```
Compiled with
```
clang -target fuchsia-elf-riscv64 test.S -nostdlib -o test
disassembled with
llvm-objdump -d test
and
riscv64-elf-objdump -d test
```
The llvm-objdump output is
```
0000000000001000 <test>:
1000: 17 15 10 00 auipc a0, 257
1004: 03 35 85 00 ld a0, 8(a0)
1008: 17 25 10 00 auipc a0, 258
100c: 13 05 85 ff addi a0, a0, -8
1010: 17 25 10 00 auipc a0, 258
1014: 13 05 05 ff addi a0, a0, -16
1018: 17 25 10 00 auipc a0, 258
101c: 03 25 85 fe lw a0, -24(a0)
1020: 17 05 10 00 auipc a0, 256
1024: 13 05 45 04 addi a0, a0, 68
1028: 97 00 10 00 auipc ra, 256
102c: e7 80 a0 03 jalr 58(ra)
1030: 17 03 10 00 auipc t1, 256
1034: 67 00 23 03 jr 50(t1)
1038: 37 55 34 12 lui a0, 74565
103c: 1b 05 85 67 addiw a0, a0, 1656
1040: 37 75 24 00 lui a0, 583
1044: 1b 05 d5 8a addiw a0, a0, -1875
1048: 3e 05 slli a0, a0, 15
104a: 13 05 15 89 addi a0, a0, -1903
104e: 32 05 slli a0, a0, 12
1050: 13 05 d5 ab addi a0, a0, -1347
1054: 32 05 slli a0, a0, 12
1056: 13 05 f5 de addi a0, a0, -529
105a: 41 65 lui a0, 16
105c: 37 05 10 00 lui a0, 256
1060: 7d 35 addiw a0, a0, -1
...
0000000000101062 <func>:
101062: 82 80 ret
0000000000101064 <ldata>:
101064: 00 00 unimp
101066: 00 00 unimp
```
whereas binutils is
```
0000000000001000 <test>:
1000: 00101517 auipc a0,0x101
1004: 00853503 ld a0,8(a0) # 102008 <ldata+0xfa4>
1008: 00102517 auipc a0,0x102
100c: ff850513 add a0,a0,-8 # 103000 <gdata>
1010: 00102517 auipc a0,0x102
1014: ff050513 add a0,a0,-16 # 103000 <gdata>
1018: 00102517 auipc a0,0x102
101c: fe852503 lw a0,-24(a0) # 103000 <gdata>
1020: 00100517 auipc a0,0x100
1024: 04450513 add a0,a0,68 # 101064 <ldata>
1028: 00100097 auipc ra,0x100
102c: 03a080e7 jalr 58(ra) # 101062 <func>
1030: 00100317 auipc t1,0x100
1034: 03230067 jr 50(t1) # 101062 <func>
1038: 12345537 lui a0,0x12345
103c: 6785051b addw a0,a0,1656 # 12345678 <gdata+0x12242678>
1040: 00247537 lui a0,0x247
1044: 8ad5051b addw a0,a0,-1875 # 2468ad <gdata+0x1438ad>
1048: 053e sll a0,a0,0xf
104a: 89150513 add a0,a0,-1903
104e: 0532 sll a0,a0,0xc
1050: abd50513 add a0,a0,-1347
1054: 0532 sll a0,a0,0xc
1056: def50513 add a0,a0,-529
105a: 6541 lui a0,0x10
105c: 00100537 lui a0,0x100
1060: 357d addw a0,a0,-1 # fffff <test+0xfefff>
...
0000000000101062 <func>:
101062: 8082 ret
0000000000101064 <ldata>:
101064: 0000 unimp
...
```
The obvious deltas are the calculation of the target address for
a) auipc + an instruction that provides the signed 12 bit address (ld, lw, add, jalr, jr)
b) lui + instructions that provide additional immediate data. Note that for large constants a variety of instruction sequences may be emitted and binutils only seems to handle lui + addw. Dealing with more elaborate sequences may be nice.
Looking through disassembly of a large C++ binary generated by clang, it seems that in all cases the auipc/lui sequence is always back to back, and not interleaved with other instructions, so probably just detecting a back to back instruction sequence is all that's needed and seems to be all that binutils does.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJysWN2OozoSfhr6ppTIGAzkIhdnpre1Wq1WK-2-gMFF4hmDs9gk3W-_soGAA-np0TlWK52Ay99XP1QVxY2RpxbxGLFvEXt94b096-74b_kP3Ss0L6UWH8eIFt_1RaKAutMN1O9lf9oLvEb0LaWkSEicRfQQkdeI_DF8KnVtdrr8IfrmArXuoJOmusKZGzC6QRBYy0piW0k0UOnmwjsUYDWUsu2tVCai36HRxqoPqHRbYdfK9gRNr6wE2Rrb9ZWVugWD_-uxrdCAbEcQq6HiquoVtwi8BS5Eh8aA7oC7w4zlrd0v2f4dOwRpgIORzUUhWDQWuDHYlOoDaukuaThhi5079HbmFgxiYzxlBK4U6BrsGUGXV6l7MxxRcYMGeCv8rQ5Nr6yBEpW-jfgZGf_8z73Fdzt8dfJRMhIEUBw4cUY5CW75_ervXb59vlnNl6ebldOs7ttqumC5XF64HyLHM8h7TJOUZXnxya0D4WUlsN7aQgghG9drt0LMvfkpL5PIKOOZzVbr0AZR6RWcb-9la4Esd-xnE5w-2xy6bfj8rpuLVCjgJu15c1-leHuCneXdCS3UfXU2ku9Q1TsfuVnqo2b_H9i12lihZAk77a8N8kKaMSgDlOBh24mFAG_F8GU832Nt7tzU6L9nhOBw3dtLb0GaTSGyWM4pECXfhzD-28KOAO5elPwBcQ4xg5gAIQDAe3mpRn9TlgfbU7edJJAwKNiwXQnwaxAoIlq4b4dArBhR6CMK3HGKQKDyAgkQj1PXbqMQcsYZPneTVExi8psYcTpjkM8w4iwQ-11d4mq0GR10Qff4Lyy2o-mWzeikD3mOExCjC31SBiR9ok8WsKNenUPuAB5hOr4F49XBHAoCnDi9AH5w1bm7zHnfSQWaJHdNkhFiArDxBkDi9cg8I5qMAN1gMUYiWjipEMDrkOTAGCQpxNRFZS8XNs5TlrFAZAiwcgywLB-NdXswVpzdycUkJSNOzoCmY_QHOKxIlihpOqMIBgV_grKLizyglw4aoROcllFq5cs4lOJzBMQMisPTiD6QkCd6OPpLOHq3BSMzlmDAy6dYSRqkEJY-wdoEGkSyGatmIPAZFgvjgnl7pDFkM1Tor_DRZtXo38UjF-6ni2jIvAVy4XLhtLadO4rs90Gvs0zRMcmoS9JD1Vwm6eGeQyqoe-QeCunDIak7ZCyuq1OG3D3qNay-lc1lkUKz7NM9m7XpdsYOubk3jH9VURqWV4zFeZj7XK8RrwvTJFKwhPm8ESwlBuF7iYKIJj7TkmK2G_1G3mueOlarCjZTopuU6LqGDauuC0ZYvKLEhZijy3_sipFVMproNHlzWVLIBpvHo-cqvqIWp0tq5KvU4uwr3LYs9TvclmbDgtEtTy4L6KJ-foEefTAd-TU9sq6yo3yaftF02eTV1TO6KsULauTwhNpYmpfkpsI8iiecFARX4utCPfMKEtB0aPJoruSZucZqvjJYMraMNCEkWxNaFfZPCS3KvX-FYcnqxCBhj28668o_rCz3j2XpPHYLPeYK_0BlfFWaA8pliJjSlLp3q5Da0CEQQtP819RoWBjTRWQVXDwj5nsFz4ymWcHFA680Kbh4ZLUMLJagq7cPAUre63UnMXI5xEOUb2WEzUbijkQfLQBDsQ-Aq6AEL-KNl-LLmWluMqYO49ckHi1QrXsOgfVXKWz2HmOYsTRexSVZdx4jZZ-VtqNnOydlC6MlLBdbCm8Fko8i_z5_r8W--qF7w1-GkFt_tnshxaYj_nw_s2hVFmvZ2aw0ePaKPY2MBCrLDfAO_bhoGmJJ3U7DpXFyME20at2N7_kugw0JMaLfgLfBjMyeuYVLp69SoPHn-JmfcK8spZyPi2ihhB8E3XwfKfwPl7z9_-7-_lM6OBcYDmyBZAIo35a6y1yBbBoUklsEZ9U9_EtbHDbXugPl1LqP5gxwuPJOov1wem9P-xr-ASUCNtJaFH7Edu8Edas-5vHcmbdC4Z2ui8g9vCJXsj35IQo0ukNAxUvtp3srkFZWGEThP7X-6aTtudP96QzzXMYz5qNC3yP6zUGWsuXdx318KKD8AD8KcmaV90mis4Zs_SxxmBs6T3mnRvTN0Z-I-VGluvEPAyWvfvoZJK9-ep-1AlrtzrHYKeTXcVAE2p6xC3zlthvtnFVyR_xHbywItFhZpxsPzt70wsBDeeYRzQ20iGJ0xuN01Gt395DQaPYv4piIQ3LgL3iMc5rFBU3i_OV8zEUsirIsE4o0z5KkIhnJiypJ8rSoirR4kUdKaEoOMaWJ66T2WZofeJkcDnlZM1ZhlBJsuFR7pa7NXnenF2lMj8eYFGl2eFG8RGX8yJvSFm_g70aURuz1pTv6kVfZn0yUEiWNNfMxVlrlZ-U1ctt3GLHXiH3z07WIvU6x9vCYLh9k2YYTtWXo3OfkL32njmdrL8YlH_oW0beTtOe-3Fe6ccGgrtO_3aXTP7CyEX3zSpiIvo1aXo_0_wEAAP__IJ8KoQ">