GP-5211: Fix RISCV 32- and 64-bit compiler specifications and relocation handler

This commit is contained in:
ghintern 2025-07-16 16:38:27 +00:00
parent 5acdc3b522
commit f26d36c6bb
5 changed files with 458 additions and 230 deletions

View file

@ -17,7 +17,7 @@
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<global>
@ -30,73 +30,110 @@
</returnaddress>
<stackpointer register="sp" space="ram"/>
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<pentry minsize="1" maxsize="4">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a1"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a4"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a5"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a6"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a7"/>
</pentry>
<pentry minsize="4" maxsize="4">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa0"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa1"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa2"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa3"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa4"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa5"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa6"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa7"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="ram"/>
</pentry>
</input>
<output>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a1"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a4"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a5"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a6"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a7"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="any"/>
<varargs first="0"/>
<join align="true"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="struct" minsize="9"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="union" minsize="9"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</input>
<output>
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa0"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa1"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a1"/>
</pentry>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="sp"/>
@ -127,6 +164,44 @@
<register name="fs10"/>
<register name="fs11"/>
</unaffected>
<killedbycall>
<register name="ra"/>
<register name="t0"/>
<register name="t1"/>
<register name="t2"/>
<register name="t3"/>
<register name="t4"/>
<register name="t5"/>
<register name="t6"/>
<register name="a0"/>
<register name="a1"/>
<register name="a2"/>
<register name="a3"/>
<register name="a4"/>
<register name="a5"/>
<register name="a6"/>
<register name="a7"/>
<register name="fa0"/>
<register name="fa1"/>
<register name="fa2"/>
<register name="fa3"/>
<register name="fa4"/>
<register name="fa5"/>
<register name="fa6"/>
<register name="fa7"/>
<register name="ft0"/>
<register name="ft1"/>
<register name="ft2"/>
<register name="ft3"/>
<register name="ft4"/>
<register name="ft5"/>
<register name="ft6"/>
<register name="ft7"/>
<register name="ft8"/>
<register name="ft9"/>
<register name="ft10"/>
<register name="ft11"/>
</killedbycall>
</prototype>
</default_proto>
</compiler_spec>

View file

@ -15,7 +15,7 @@
<entry size="1" alignment="1" />
<entry size="2" alignment="2" />
<entry size="4" alignment="4" />
<entry size="8" alignment="4" />
<entry size="8" alignment="8" />
</size_alignment_map>
</data_organization>
<global>
@ -28,43 +28,64 @@
</returnaddress>
<stackpointer register="sp" space="ram"/>
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a1"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a4"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a5"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a6"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a7"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="ram"/>
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="any"/>
<varargs first="0"/>
<join align="true"/>
</rule>
<rule>
<datatype name="struct" minsize="9"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="union" minsize="9"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</input>
<output>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="4">
<pentry minsize="1" maxsize="4" extension="zero">
<register name="a1"/>
</pentry>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="sp"/>
@ -83,6 +104,24 @@
<register name="s10"/>
<register name="s11"/>
</unaffected>
<killedbycall>
<register name="ra"/>
<register name="t0"/>
<register name="t1"/>
<register name="t2"/>
<register name="t3"/>
<register name="t4"/>
<register name="t5"/>
<register name="t6"/>
<register name="a0"/>
<register name="a1"/>
<register name="a2"/>
<register name="a3"/>
<register name="a4"/>
<register name="a5"/>
<register name="a6"/>
<register name="a7"/>
</killedbycall>
</prototype>
</default_proto>
</compiler_spec>

View file

@ -30,73 +30,110 @@
</returnaddress>
<stackpointer register="sp" space="ram"/>
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<pentry minsize="1" maxsize="8">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a1"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a4"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a5"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a6"/>
</pentry>
<pentry minsize="1" maxsize="8">
<register name="a7"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa0"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa1"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa2"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa3"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa4"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa5"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa6"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa7"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="ram"/>
</pentry>
</input>
<output>
<pentry minsize="1" maxsize="8">
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="8">
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a1"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a2"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a3"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a4"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a5"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a6"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a7"/>
</pentry>
<pentry minsize="1" maxsize="500" align="8">
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="any"/>
<varargs first="0"/>
<join align="true"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="struct" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="union" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</input>
<output>
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa0"/>
</pentry>
<pentry minsize="4" maxsize="8">
<pentry minsize="4" maxsize="8" storage="float">
<register name="fa1"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a0"/>
</pentry>
<pentry minsize="1" maxsize="8" extension="zero">
<register name="a1"/>
</pentry>
<rule>
<datatype name="float"/>
<consume storage="float"/>
</rule>
<rule>
<datatype name="homogeneous-float-aggregate" maxprimitives="2"/>
<join_per_primitive storage="float"/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="sp"/>
@ -127,6 +164,44 @@
<register name="fs10"/>
<register name="fs11"/>
</unaffected>
<killedbycall>
<register name="ra"/>
<register name="t0"/>
<register name="t1"/>
<register name="t2"/>
<register name="t3"/>
<register name="t4"/>
<register name="t5"/>
<register name="t6"/>
<register name="a0"/>
<register name="a1"/>
<register name="a2"/>
<register name="a3"/>
<register name="a4"/>
<register name="a5"/>
<register name="a6"/>
<register name="a7"/>
<register name="fa0"/>
<register name="fa1"/>
<register name="fa2"/>
<register name="fa3"/>
<register name="fa4"/>
<register name="fa5"/>
<register name="fa6"/>
<register name="fa7"/>
<register name="ft0"/>
<register name="ft1"/>
<register name="ft2"/>
<register name="ft3"/>
<register name="ft4"/>
<register name="ft5"/>
<register name="ft6"/>
<register name="ft7"/>
<register name="ft8"/>
<register name="ft9"/>
<register name="ft10"/>
<register name="ft11"/>
</killedbycall>
</prototype>
</default_proto>
</compiler_spec>

View file

@ -28,7 +28,7 @@
</returnaddress>
<stackpointer register="sp" space="ram"/>
<default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register">
<prototype name="__stdcall" extrapop="0" stackshift="0">
<input>
<pentry minsize="1" maxsize="8">
<register name="a0"/>
@ -54,9 +54,26 @@
<pentry minsize="1" maxsize="8">
<register name="a7"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="ram"/>
<pentry minsize="1" maxsize="500" align="8">
<addr offset="0" space="stack"/>
</pentry>
<rule>
<datatype name="any"/>
<varargs first="0"/>
<join align="true"/>
</rule>
<rule>
<datatype name="struct" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="union" minsize="17"/>
<convert_to_ptr/>
</rule>
<rule>
<datatype name="any"/>
<join/>
</rule>
</input>
<output>
<pentry minsize="1" maxsize="8">
@ -65,6 +82,10 @@
<pentry minsize="1" maxsize="8">
<register name="a1"/>
</pentry>
<rule>
<datatype name="any"/>
<join/>
</rule>
</output>
<unaffected>
<register name="sp"/>
@ -83,6 +104,24 @@
<register name="s10"/>
<register name="s11"/>
</unaffected>
<killedbycall>
<register name="ra"/>
<register name="t0"/>
<register name="t1"/>
<register name="t2"/>
<register name="t3"/>
<register name="t4"/>
<register name="t5"/>
<register name="t6"/>
<register name="a0"/>
<register name="a1"/>
<register name="a2"/>
<register name="a3"/>
<register name="a4"/>
<register name="a5"/>
<register name="a6"/>
<register name="a7"/>
</killedbycall>
</prototype>
</default_proto>
</compiler_spec>

View file

@ -322,21 +322,21 @@ public class RISCV_ElfRelocationHandler
case R_RISCV_HI20:
// Absolute address %hi(symbol) (U-Type)
value32 = (int) ((symbolValue + 0x800) & 0xfffff000) |
value32 = (int) ((addend + symbolValue + 0x800) & 0xfffff000) |
(memory.getInt(relocationAddress) & 0xfff);
memory.setInt(relocationAddress, value32);
break;
case R_RISCV_LO12_I:
// Absolute address %lo(symbol) (I-Type)
value32 = ((int) (symbolValue & 0x00000fff) << 20) |
value32 = ((int) ((addend + symbolValue) & 0x00000fff) << 20) |
(memory.getInt(relocationAddress) & 0xfffff);
memory.setInt(relocationAddress, value32);
break;
case R_RISCV_LO12_S:
// Absolute address %lo(symbol) (S-Type)
value32 = (int) (symbolValue & 0x00000fff);
value32 = (int) ((addend + symbolValue) & 0x00000fff);
value32 = ((value32 & 0x1f) << 7) | ((value32 & 0xfe0) << 20) |
(memory.getInt(relocationAddress) & 0x1fff07f);
memory.setInt(relocationAddress, value32);