mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 10:19:23 +02:00
Merge remote-tracking branch 'origin/patch'
This commit is contained in:
commit
7d26a65e31
4 changed files with 305 additions and 29 deletions
|
@ -731,11 +731,16 @@ bool SubvariableFlow::traceBackward(ReplaceVarnode *rvn)
|
||||||
addNewConstant(rop,0,(uintb)0);
|
addNewConstant(rop,0,(uintb)0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if ((newmask<<sa) != rvn->mask)
|
if ((newmask<<sa) == rvn->mask) {
|
||||||
break; // subvariable is truncated by shift
|
|
||||||
rop = createOp(CPUI_COPY,1,rvn);
|
rop = createOp(CPUI_COPY,1,rvn);
|
||||||
if (!createLink(rop,newmask,0,op->getIn(0))) return false;
|
if (!createLink(rop,newmask,0,op->getIn(0))) return false;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
if ((rvn->mask & 1)==0) return false; // Can't assume zeroes are shifted into least sig bits
|
||||||
|
rop = createOp(CPUI_INT_LEFT,2,rvn);
|
||||||
|
if (!createLink(rop,rvn->mask,0,op->getIn(0))) return false;
|
||||||
|
addConstant(rop,calc_mask(op->getIn(1)->getSize()),1,op->getIn(1)); // Preserve the shift amount
|
||||||
|
return true;
|
||||||
case CPUI_INT_RIGHT:
|
case CPUI_INT_RIGHT:
|
||||||
if (!op->getIn(1)->isConstant()) break; // Dynamic shift
|
if (!op->getIn(1)->isConstant()) break; // Dynamic shift
|
||||||
sa = (int4)op->getIn(1)->getOffset();
|
sa = (int4)op->getIn(1)->getOffset();
|
||||||
|
|
|
@ -406,6 +406,11 @@
|
||||||
<optional>
|
<optional>
|
||||||
<attribute name="stackspill"/>
|
<attribute name="stackspill"/>
|
||||||
</optional>
|
</optional>
|
||||||
|
<optional>
|
||||||
|
<attribute name="backfill">
|
||||||
|
<ref name="boolean_type"/>
|
||||||
|
</attribute>
|
||||||
|
</optional>
|
||||||
</element>
|
</element>
|
||||||
<element name="hidden_return">
|
<element name="hidden_return">
|
||||||
<optional>
|
<optional>
|
||||||
|
|
|
@ -58,6 +58,30 @@
|
||||||
<pentry minsize="1" maxsize="4" metatype="float">
|
<pentry minsize="1" maxsize="4" metatype="float">
|
||||||
<register name="s7"/>
|
<register name="s7"/>
|
||||||
</pentry>
|
</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">
|
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||||
<register name="r0"/>
|
<register name="r0"/>
|
||||||
</pentry>
|
</pentry>
|
||||||
|
@ -73,17 +97,92 @@
|
||||||
<pentry minsize="1" maxsize="500" align="4">
|
<pentry minsize="1" maxsize="500" align="4">
|
||||||
<addr offset="0" space="stack"/>
|
<addr offset="0" space="stack"/>
|
||||||
</pentry>
|
</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>
|
</input>
|
||||||
<output>
|
<output>
|
||||||
<pentry minsize="1" maxsize="8" metatype="float">
|
<pentry minsize="1" maxsize="4" metatype="float">
|
||||||
<register name="d0"/>
|
<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>
|
||||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||||
<register name="r0"/>
|
<register name="r0"/>
|
||||||
</pentry>
|
</pentry>
|
||||||
<pentry minsize="5" maxsize="8">
|
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||||
<addr space="join" piece1="r1" piece2="r0"/>
|
<register name="r1"/>
|
||||||
</pentry>
|
</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>
|
</output>
|
||||||
<unaffected>
|
<unaffected>
|
||||||
<register name="r4"/>
|
<register name="r4"/>
|
||||||
|
@ -103,9 +202,15 @@
|
||||||
<register name="d14"/>
|
<register name="d14"/>
|
||||||
<register name="d15"/>
|
<register name="d15"/>
|
||||||
<register name="sp"/>
|
<register name="sp"/>
|
||||||
|
<register name="lr"/>
|
||||||
|
<register name="pc"/>
|
||||||
</unaffected>
|
</unaffected>
|
||||||
<killedbycall>
|
<killedbycall>
|
||||||
|
<register name="r0"/>
|
||||||
<register name="r1"/>
|
<register name="r1"/>
|
||||||
|
<register name="r2"/>
|
||||||
|
<register name="r3"/>
|
||||||
|
<register name="r12"/>
|
||||||
<register name="d0"/>
|
<register name="d0"/>
|
||||||
<register name="d1"/>
|
<register name="d1"/>
|
||||||
<register name="d2"/>
|
<register name="d2"/>
|
||||||
|
@ -117,6 +222,69 @@
|
||||||
</killedbycall>
|
</killedbycall>
|
||||||
</prototype>
|
</prototype>
|
||||||
</default_proto>
|
</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">
|
<prototype name="processEntry" extrapop="0" stackshift="0">
|
||||||
<input pointermax="4">
|
<input pointermax="4">
|
||||||
<pentry minsize="1" maxsize="4">
|
<pentry minsize="1" maxsize="4">
|
||||||
|
|
|
@ -37,7 +37,105 @@
|
||||||
<default_proto>
|
<default_proto>
|
||||||
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
<prototype name="__stdcall" extrapop="0" stackshift="0">
|
||||||
<input>
|
<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">
|
<pentry minsize="1" maxsize="4" metatype="float">
|
||||||
<register name="s0"/>
|
<register name="s0"/>
|
||||||
</pentry>
|
</pentry>
|
||||||
|
@ -68,26 +166,26 @@
|
||||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
<pentry minsize="1" maxsize="4" extension="inttype">
|
||||||
<register name="r1"/>
|
<register name="r1"/>
|
||||||
</pentry>
|
</pentry>
|
||||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
<rule>
|
||||||
<register name="r2"/>
|
<datatype name="homogeneous-float-aggregate"/>
|
||||||
</pentry>
|
<join storage="float"/>
|
||||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
</rule>
|
||||||
<register name="r3"/>
|
<rule>
|
||||||
</pentry>
|
<datatype name="float"/>
|
||||||
<pentry minsize="1" maxsize="500" align="4">
|
<join storage="float"/>
|
||||||
<addr offset="0" space="stack"/>
|
</rule>
|
||||||
</pentry>
|
<rule>
|
||||||
</input>
|
<datatype name="struct" minsize="5"/>
|
||||||
<output>
|
<hidden_return/>
|
||||||
<pentry minsize="1" maxsize="16" metatype="float">
|
</rule>
|
||||||
<register name="q0"/>
|
<rule>
|
||||||
</pentry>
|
<datatype name="union" minsize="5"/>
|
||||||
<pentry minsize="1" maxsize="4" extension="inttype">
|
<hidden_return/>
|
||||||
<register name="r0"/>
|
</rule>
|
||||||
</pentry>
|
<rule>
|
||||||
<pentry minsize="5" maxsize="8">
|
<datatype name="any"/>
|
||||||
<addr space="join" piece1="r1" piece2="r0"/>
|
<join/>
|
||||||
</pentry>
|
</rule>
|
||||||
</output>
|
</output>
|
||||||
<unaffected>
|
<unaffected>
|
||||||
<register name="r4"/>
|
<register name="r4"/>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue