mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-03 17:59:46 +02:00
Merge remote-tracking branch
'origin/GP-4989_ghintern_arm_fix_aapcs--SQUASHED' into patch (Closes #6958)
This commit is contained in:
commit
7d76ab5e9b
3 changed files with 296 additions and 25 deletions
|
@ -405,6 +405,11 @@
|
|||
<optional>
|
||||
<attribute name="stackspill"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name="backfill">
|
||||
<ref name="boolean_type"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
</element>
|
||||
<element name="hidden_return">
|
||||
<optional>
|
||||
|
|
|
@ -58,6 +58,30 @@
|
|||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s8"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s9"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s10"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s11"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s12"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s13"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s14"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s15"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r0"/>
|
||||
</pentry>
|
||||
|
@ -73,17 +97,92 @@
|
|||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<!-- Variadic calls do not use floating-point registers -->
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<varargs/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<!-- Homogeneous float aggregates become regular structs in variadic calls -->
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<varargs/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<join storage="float" align="true" stackspill="false"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<goto_stack/> <!-- Don't consume general purpose registers -->
|
||||
<consume_extra storage="float"/> <!-- Once the stack has been used, don't go back to registers -->
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<join storage="float" align="true" backfill="true" stackspill="false"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<goto_stack/> <!-- Don't consume general purpose registers -->
|
||||
<consume_extra storage="float"/> <!-- Once the stack has been used, don't go back to registers -->
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join align="true"/> <!-- Chunk from general purpose registers -->
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="8" metatype="float">
|
||||
<register name="d0"/>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r0"/>
|
||||
</pentry>
|
||||
<pentry minsize="5" maxsize="8">
|
||||
<addr space="join" piece1="r1" piece2="r0"/>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r1"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<join storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<join storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="5"/>
|
||||
<hidden_return/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="5"/>
|
||||
<hidden_return/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="r4"/>
|
||||
|
@ -103,9 +202,15 @@
|
|||
<register name="d14"/>
|
||||
<register name="d15"/>
|
||||
<register name="sp"/>
|
||||
<register name="lr"/>
|
||||
<register name="pc"/>
|
||||
</unaffected>
|
||||
<killedbycall>
|
||||
<register name="r0"/>
|
||||
<register name="r1"/>
|
||||
<register name="r2"/>
|
||||
<register name="r3"/>
|
||||
<register name="r12"/>
|
||||
<register name="d0"/>
|
||||
<register name="d1"/>
|
||||
<register name="d2"/>
|
||||
|
@ -117,6 +222,69 @@
|
|||
</killedbycall>
|
||||
</prototype>
|
||||
</default_proto>
|
||||
<prototype name="__stdcall_softfp" extrapop="0" stackshift="0">
|
||||
<!-- For binaries without hardware floating-point support (-mfloat-abi=soft),
|
||||
or binaries with soft-float compatible interfaces (-mfloat-abi=softfp) -->
|
||||
<input>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="r0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="r1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="r2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4">
|
||||
<register name="r3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join align="true"/> <!-- Chunk from general purpose registers -->
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r1"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="5"/>
|
||||
<hidden_return/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="5"/>
|
||||
<hidden_return/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="r4"/>
|
||||
<register name="r5"/>
|
||||
<register name="r6"/>
|
||||
<register name="r7"/>
|
||||
<register name="r8"/>
|
||||
<register name="r9"/>
|
||||
<register name="r10"/>
|
||||
<register name="r11"/>
|
||||
<register name="sp"/>
|
||||
</unaffected>
|
||||
<killedbycall>
|
||||
<register name="r0"/>
|
||||
<register name="r1"/>
|
||||
<register name="r2"/>
|
||||
<register name="r3"/>
|
||||
<register name="r12"/>
|
||||
</killedbycall>
|
||||
</prototype>
|
||||
<prototype name="processEntry" extrapop="0" stackshift="0">
|
||||
<input pointermax="4">
|
||||
<pentry minsize="1" maxsize="4">
|
||||
|
|
|
@ -37,7 +37,105 @@
|
|||
<default_proto>
|
||||
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
||||
<input>
|
||||
<!-- we cannot accurately model the allocation scheme when parameters are larger than 4 bytes -->
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s4"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s5"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s6"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s7"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s8"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s9"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s10"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s11"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s12"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s13"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s14"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s15"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
<!-- Variadic functions do not use floating-point registers -->
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<varargs/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<!-- Homogeneous float aggregates become regular structs in variadic calls -->
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<varargs/>
|
||||
<join align="true"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<join storage="float" align="true" stackspill="false"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<goto_stack/> <!-- Don't consume general purpose registers -->
|
||||
<consume_extra storage="float"/> <!-- Once the stack has been used, don't go back to registers -->
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<join storage="float" align="true" backfill="true" stackspill="false"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<goto_stack/> <!-- Don't consume general purpose registers -->
|
||||
<consume_extra storage="float"/> <!-- Once the stack has been used, don't go back to registers -->
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join align="true"/> <!-- Chunk from general purpose registers -->
|
||||
</rule>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="4" metatype="float">
|
||||
<register name="s0"/>
|
||||
</pentry>
|
||||
|
@ -68,26 +166,26 @@
|
|||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r1"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r2"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r3"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="500" align="4">
|
||||
<addr offset="0" space="stack"/>
|
||||
</pentry>
|
||||
</input>
|
||||
<output>
|
||||
<pentry minsize="1" maxsize="16" metatype="float">
|
||||
<register name="q0"/>
|
||||
</pentry>
|
||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||
<register name="r0"/>
|
||||
</pentry>
|
||||
<pentry minsize="5" maxsize="8">
|
||||
<addr space="join" piece1="r1" piece2="r0"/>
|
||||
</pentry>
|
||||
<rule>
|
||||
<datatype name="homogeneous-float-aggregate"/>
|
||||
<join storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="float"/>
|
||||
<join storage="float"/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="struct" minsize="5"/>
|
||||
<hidden_return/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="union" minsize="5"/>
|
||||
<hidden_return/>
|
||||
</rule>
|
||||
<rule>
|
||||
<datatype name="any"/>
|
||||
<join/>
|
||||
</rule>
|
||||
</output>
|
||||
<unaffected>
|
||||
<register name="r4"/>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue