Skip to content

Commit 7ab01ee

Browse files
committed
Add ePIC relocations and rewrite rules
1 parent 0396206 commit 7ab01ee

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

riscv-elf.adoc

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,16 @@ Description:: Additional information about the relocation
503503
<| S - P
504504
.2+| 65 .2+| TLSDESC_CALL .2+| Static | .2+| Annotate call to TLS descriptor resolver function, `%tlsdesc_call(address of %tlsdesc_hi)`, for relaxation purposes only
505505
<|
506+
507+
.2+| 66 .2+| EPIC_HI20 .2+| Static | _U-Type_ .2+| <<Embedded PIC rewrite rules,Embedded PIC rewrite>> for the high 20 bits of a 32-bit PC- or GP-relative offset, `epic_hi(symbol)`
508+
<| Rewrite
509+
.2+| 67 .2+| EPIC_LO12_I .2+| Static | _I-type_ .2+| <<Embedded PIC rewrite rules,Embedded PIC rewrite>> for the low 12 bits of a 32-bit PC- or GP-relative offset, `epic_low(address of %epic_high)`
510+
<| Rewrite
511+
.2+| 68 .2+| EPIC_LO12_S .2+| Static | _S-Type_ .2+| <<Embedded PIC rewrite rules,Embedded PIC rewrite>> for the low 12 bits of a 32-bit PC- or GP-relative offset, `epic_low(address of %epic_high)`
512+
<| Rewrite
513+
.2+| 69 .2+| EPIC_BASE_ADD .2+| Static | _I-type_ .2+| <<Embedded PIC rewrite rules,Embedded PIC rewrite>> of `gp` addition, `%epic_base_add(symbol)`
514+
<| Rewrite
515+
506516
.2+| 66-191 .2+| *Reserved* .2+| - | .2+| Reserved for future standard use
507517
<|
508518
.2+| 192-255 .2+| *Reserved* .2+| - | .2+| Reserved for nonstandard ABI extensions
@@ -849,6 +859,46 @@ def align(addend):
849859
return ALIGN
850860
----
851861

862+
==== Embedded PIC rewrite rules
863+
864+
The Embedded PIC (ePIC) relocations allow addressing a symbol relative to either the PC or the GP, as appropriate for that symbol.
865+
866+
NOTE: Implementations are permitted to specify their own rules for choosing between GP-relative or PC-relative addressing. A possible rule is:
867+
868+
* If the symbol resides in a writable output section, then GP-relative addressing is used;
869+
* If the symbol does not reside in an output section or the section is not writable, then PC-relative addressing is used instead.
870+
871+
The ePIC relocations are applied to a sequence of instructions that initially address a symbol relative to the GP. When PC-relative addressing should be used instead, the ePIC relocations rewrite the instructions to perform PC-relative addressing and add the appropriate PC-relative relocations. When GP-relative addressing should be used, the instruction rewrites do not occur and GP-relative relocations are added. For correctness, the rewrites must occur even when linker relaxations are disabled. Paired `R_RISCV_RELAX` relocations are preserved during the rewrite process, and will pair with relocations added as part of that rewrite.
872+
873+
===== `R_RISCV_EPIC_HI20` [[rels-epic-hi]]
874+
875+
The `R_RISCV_EPIC_HI20` relocation must apply to an `lui` instruction. Its behavior depends on the residence of the referenced symbol, per the <<Embedded PIC rewrite rules,ePIC rewrite rules>>.
876+
877+
* For PC-relative addressing:
878+
** Rewrites the `lui` instruction into an `auipc` instruction with the same operands, by overwriting the opcode field.
879+
** Adds a `R_RISCV_PCREL_HI20` relocation with the same symbol and addend, at the same offset.
880+
* For GP-relative addressing:
881+
** Adds a `R_RISCV_GPREL_HI20` relocation with the same symbol and addend, at the same offset.
882+
883+
===== `R_RISCV_EPIC_BASE_ADD` [[rels-epic-base]]
884+
885+
The `R_RISCV_EPIC_BASE_ADD` relocation must apply to an `add` or `c.add` instruction. Its behavior depends on the residence of the referenced symbol, per the <<Embedded PIC rewrite rules,ePIC rewrite rules>>.
886+
887+
* For PC-relative addressing, it either:
888+
** Rewrites the addition instruction into a canonical `nop` (`addi x0, x0, 0`) or `c.nop` instruction (if the relocation is being applied to an `add` or `c.add` instruction, respectively), or
889+
** Deletes the `add` or `c.add` instruction.
890+
* For GP-relative addressing:
891+
** Nothing needs to be done.
892+
893+
===== `R_RISCV_EPIC_LO12_*` [[rels-epic-lo]]
894+
895+
The `R_RISCV_EPIC_LO12_I` and `R_RISCV_EPIC_LO12_S` relocations apply to instructions encoded using the `I` and `S` instruction formats, respectively. For both of them, the symbol points to an instruction with a `R_RISCV_EPIC_HI20` relocation. Their behavior depends on the residence of the symbol referenced by the respective `R_RISCV_EPIC_HI20` relocation, per the <<Embedded PIC rewrite rules,ePIC rewrite rules>>.
896+
897+
* For PC-relative addressing, it either:
898+
** Adds a `R_RISCV_PCREL_LO12_I` or `R_RISCV_PCREL_LO12_S` relocation, as appropriate, with the same symbol and addend, at the same offset.
899+
* For GP-relative addressing:
900+
** Adds a `R_RISCV_GPREL_LO12_I` or `R_RISCV_GPREL_LO12_S` relocation, as appropriate, at the same offset. The symbol and addend of the new relocation are those of the corresponding `R_RISCV_EPIC_HI20` relocation.
901+
852902
=== Thread Local Storage
853903

854904
RISC-V adopts the ELF Thread Local Storage Model in which ELF objects define

0 commit comments

Comments
 (0)