Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Range extension thunks #425

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 50 additions & 0 deletions riscv-elf.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -735,6 +735,56 @@ that can represent an even signed 21-bit offset (-1MiB to +1MiB-2).
Branch (SB-Type) instructions have a `R_RISCV_BRANCH` relocation that
can represent an even signed 13-bit offset (-4096 to +4094).

==== Range Extension Thunks

`R_RISCV_JAL`, `R_RISCV_CALL`, and `R_RISCV_CALL_PLT` relocations to targets in
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would like to exclude R_RISCV_JAL, that relocation are used with j and jal; j is used for jump within function and jal typically is only used when the target is known very close, otherwise should use call or tail (then with R_RISCV_CALL_PLT).

other input sections may be resolved by the linker to point to a range
extension thunk instead of the target symbol. Range extension thunks will
eventually transfer control to the target symbol, and preserve the contents of
memory and all registers except for `t1` and `t2`.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use t1 and t3, avoid use t2 due to landing pad (zicfilp).


[NOTE]
.Suggested forms of range extension thunks
====
20-bit range:

[,asm]
----
jal zero, <offset to target>
----

32-bit range:

[,asm]
----
auipc t2, <high offset to target>
jalr zero, t2, <low offset to target>
----

64-bit range, position dependent:

[,asm]
----
auipc t2, <high offset to literal>
ld t2, <low offset to literal>(t2)
jalr zero, t2, 0 OR c.jr t2
...
.quad 0
----

64-bit range, position independent:

[,asm]
----
auipc t1, <high offset to literal>
ld t2, <low offset to literal>(t1)
add t2, t2, t1 OR c.add t2, t1
jalr zero, t2, 0 OR c.jr t2
...
.quad <offset to target from auipc result>
----
====

==== PC-Relative Symbol Addresses

32-bit PC-relative relocations for symbol addresses on sequences of
Expand Down
Loading