You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: riscv-elf.adoc
+50Lines changed: 50 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -503,6 +503,16 @@ Description:: Additional information about the relocation
503
503
<| S - P
504
504
.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
505
505
<|
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)`
.2+| 66-191 .2+| *Reserved* .2+| - | .2+| Reserved for future standard use
507
517
<|
508
518
.2+| 192-255 .2+| *Reserved* .2+| - | .2+| Reserved for nonstandard ABI extensions
@@ -849,6 +859,46 @@ def align(addend):
849
859
return ALIGN
850
860
----
851
861
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
+
852
902
=== Thread Local Storage
853
903
854
904
RISC-V adopts the ELF Thread Local Storage Model in which ELF objects define
0 commit comments