mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 01:39:21 +02:00
GP-5211: Fix RISCV 32- and 64-bit compiler specifications and relocation handler
This commit is contained in:
parent
5acdc3b522
commit
f26d36c6bb
5 changed files with 458 additions and 230 deletions
|
@ -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,103 +30,178 @@
|
|||
</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">
|
||||
<register name="fa0"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa1"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa2"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa3"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa4"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa5"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa6"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
</pentry>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a1"/>
|
||||
</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" storage="float">
|
||||
<register name="fa2"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa3"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa4"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa5"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa6"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<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" 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"/>
|
||||
<register name="gp"/>
|
||||
<register name="tp"/>
|
||||
<register name="s0"/>
|
||||
<register name="gp"/>
|
||||
<register name="tp"/>
|
||||
<register name="s0"/>
|
||||
<register name="s1"/>
|
||||
<register name="s2"/>
|
||||
<register name="s3"/>
|
||||
<register name="s4"/>
|
||||
<register name="s5"/>
|
||||
<register name="s6"/>
|
||||
<register name="s7"/>
|
||||
<register name="s8"/>
|
||||
<register name="s9"/>
|
||||
<register name="s10"/>
|
||||
<register name="s11"/>
|
||||
<register name="fs0"/>
|
||||
<register name="fs1"/>
|
||||
<register name="fs2"/>
|
||||
<register name="fs3"/>
|
||||
<register name="fs4"/>
|
||||
<register name="fs5"/>
|
||||
<register name="fs6"/>
|
||||
<register name="fs7"/>
|
||||
<register name="fs8"/>
|
||||
<register name="fs9"/>
|
||||
<register name="fs10"/>
|
||||
<register name="fs11"/>
|
||||
<register name="s2"/>
|
||||
<register name="s3"/>
|
||||
<register name="s4"/>
|
||||
<register name="s5"/>
|
||||
<register name="s6"/>
|
||||
<register name="s7"/>
|
||||
<register name="s8"/>
|
||||
<register name="s9"/>
|
||||
<register name="s10"/>
|
||||
<register name="s11"/>
|
||||
<register name="fs0"/>
|
||||
<register name="fs1"/>
|
||||
<register name="fs2"/>
|
||||
<register name="fs3"/>
|
||||
<register name="fs4"/>
|
||||
<register name="fs5"/>
|
||||
<register name="fs6"/>
|
||||
<register name="fs7"/>
|
||||
<register name="fs8"/>
|
||||
<register name="fs9"/>
|
||||
<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>
|
||||
|
|
|
@ -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">
|
||||
<register name="a0"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a1"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a2"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a3"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a4"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a5"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a6"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="a7"/>
|
||||
<pentry minsize="1" maxsize="4" extension="zero">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
</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="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>
|
||||
|
|
|
@ -30,103 +30,178 @@
|
|||
</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">
|
||||
<register name="fa0"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa1"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa2"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa3"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa4"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa5"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa6"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8">
|
||||
<register name="fa7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
</pentry>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a1"/>
|
||||
</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" storage="float">
|
||||
<register name="fa2"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa3"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa4"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa5"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa6"/>
|
||||
</pentry>
|
||||
<pentry minsize="4" maxsize="8" storage="float">
|
||||
<register name="fa7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8" extension="zero">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<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" 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"/>
|
||||
<register name="gp"/>
|
||||
<register name="tp"/>
|
||||
<register name="gp"/>
|
||||
<register name="tp"/>
|
||||
<register name="s0"/>
|
||||
<register name="s1"/>
|
||||
<register name="s2"/>
|
||||
<register name="s3"/>
|
||||
<register name="s4"/>
|
||||
<register name="s5"/>
|
||||
<register name="s6"/>
|
||||
<register name="s7"/>
|
||||
<register name="s8"/>
|
||||
<register name="s9"/>
|
||||
<register name="s10"/>
|
||||
<register name="s11"/>
|
||||
<register name="fs0"/>
|
||||
<register name="fs1"/>
|
||||
<register name="fs2"/>
|
||||
<register name="fs3"/>
|
||||
<register name="fs4"/>
|
||||
<register name="fs5"/>
|
||||
<register name="fs6"/>
|
||||
<register name="fs7"/>
|
||||
<register name="fs8"/>
|
||||
<register name="fs9"/>
|
||||
<register name="fs10"/>
|
||||
<register name="fs11"/>
|
||||
<register name="s2"/>
|
||||
<register name="s3"/>
|
||||
<register name="s4"/>
|
||||
<register name="s5"/>
|
||||
<register name="s6"/>
|
||||
<register name="s7"/>
|
||||
<register name="s8"/>
|
||||
<register name="s9"/>
|
||||
<register name="s10"/>
|
||||
<register name="s11"/>
|
||||
<register name="fs0"/>
|
||||
<register name="fs1"/>
|
||||
<register name="fs2"/>
|
||||
<register name="fs3"/>
|
||||
<register name="fs4"/>
|
||||
<register name="fs5"/>
|
||||
<register name="fs6"/>
|
||||
<register name="fs7"/>
|
||||
<register name="fs8"/>
|
||||
<register name="fs9"/>
|
||||
<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>
|
||||
|
|
|
@ -28,35 +28,52 @@
|
|||
</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 minsize="1" maxsize="8">
|
||||
<register name="a0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a1"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a2"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a3"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a4"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a5"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a6"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a7"/>
|
||||
<pentry minsize="1" maxsize="8">
|
||||
<register name="a7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="16" space="ram"/>
|
||||
</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="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>
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
|
@ -154,7 +154,7 @@ public class RISCV_ElfRelocationHandler
|
|||
long base = elfRelocationContext.getImageBaseWordAdjustmentOffset();
|
||||
|
||||
int symbolIndex = relocation.getSymbolIndex();
|
||||
|
||||
|
||||
long value64 = 0;
|
||||
int value32 = 0;
|
||||
short value16 = 0;
|
||||
|
@ -162,7 +162,7 @@ public class RISCV_ElfRelocationHandler
|
|||
int target = 0;
|
||||
|
||||
int byteLength = 4; // most relocations affect 4-bytes (change if different)
|
||||
|
||||
|
||||
// Handle relative relocations that do not require symbolAddr or symbolValue
|
||||
switch (type) {
|
||||
|
||||
|
@ -178,7 +178,7 @@ public class RISCV_ElfRelocationHandler
|
|||
byteLength = 8;
|
||||
}
|
||||
return new RelocationResult(Status.APPLIED, byteLength);
|
||||
|
||||
|
||||
case R_RISCV_PCREL_LO12_S:
|
||||
// PC-relative reference %pcrel_lo(symbol) (S-Type)
|
||||
// S-type immediates split the 12 bit value into separate 7 bit and 5 bit fields.
|
||||
|
@ -194,7 +194,7 @@ public class RISCV_ElfRelocationHandler
|
|||
(memory.getInt(relocationAddress) & 0x1fff07f);
|
||||
memory.setInt(relocationAddress, value32);
|
||||
return new RelocationResult(Status.APPLIED, byteLength);
|
||||
|
||||
|
||||
case R_RISCV_PCREL_LO12_I:
|
||||
// PC-relative reference %pcrel_lo(symbol) (I-Type), relative to the cited pc_rel_hi20
|
||||
target = getSymbolValueIndirect(elfRelocationContext, sym,
|
||||
|
@ -208,21 +208,21 @@ public class RISCV_ElfRelocationHandler
|
|||
((target & 0x00000fff) << 20) | (memory.getInt(relocationAddress) & 0xfffff);
|
||||
memory.setInt(relocationAddress, value32);
|
||||
return new RelocationResult(Status.APPLIED, byteLength);
|
||||
|
||||
|
||||
case R_RISCV_COPY:
|
||||
// Runtime relocation must be in executable. not allowed in shared library
|
||||
markAsUnsupportedCopy(program, relocationAddress, type, symbolName, symbolIndex,
|
||||
sym.getSize(), elfRelocationContext.getLog());
|
||||
return RelocationResult.UNSUPPORTED;
|
||||
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// Check for unresolved symbolAddr and symbolValue required by remaining relocation types handled below
|
||||
if (handleUnresolvedSymbol(elfRelocationContext, relocation, relocationAddress)) {
|
||||
return RelocationResult.FAILURE;
|
||||
}
|
||||
}
|
||||
|
||||
switch (type) {
|
||||
case R_RISCV_32:
|
||||
|
@ -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);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue