Merge remote-tracking branch 'origin/patch'

This commit is contained in:
Ryan Kurtz 2024-02-23 06:45:15 -05:00
commit 5690528835
3 changed files with 39 additions and 78 deletions

View file

@ -81,8 +81,7 @@ class MemoryBlockSourceInfoDB implements MemoryBlockSourceInfo {
@Override @Override
public long getFileBytesOffset(Address address) { public long getFileBytesOffset(Address address) {
if (subBlock instanceof FileBytesSubMemoryBlock && contains(address)) { if (subBlock instanceof FileBytesSubMemoryBlock && contains(address)) {
long blockOffset = address.subtract(getMinAddress()); long subBlockOffset = address.subtract(getMinAddress());
long subBlockOffset = blockOffset - subBlock.subBlockOffset;
return ((FileBytesSubMemoryBlock) subBlock).getFileBytesOffset() + subBlockOffset; return ((FileBytesSubMemoryBlock) subBlock).getFileBytesOffset() + subBlockOffset;
} }
return -1; return -1;

View file

@ -56,7 +56,7 @@ public class MemBlockDBTest extends AbstractGenericTest {
txID = handle.startTransaction(); txID = handle.startTransaction();
addressFactory = language.getAddressFactory(); addressFactory = language.getAddressFactory();
AddressMapDB addrMap = (AddressMapDB) program.getAddressMap(); AddressMapDB addrMap = program.getAddressMap();
Lock lock = new Lock("Test"); Lock lock = new Lock("Test");
int openMode = DBConstants.CREATE; int openMode = DBConstants.CREATE;
mem = new MemoryMapDB(handle, addrMap, openMode, true, lock); mem = new MemoryMapDB(handle, addrMap, openMode, true, lock);
@ -396,7 +396,7 @@ public class MemBlockDBTest extends AbstractGenericTest {
sourceInfo = sourceInfos.get(1); sourceInfo = sourceInfos.get(1);
assertEquals(fileBytes, sourceInfo.getFileBytes().get()); assertEquals(fileBytes, sourceInfo.getFileBytes().get());
assertEquals(70, sourceInfo.getFileBytesOffset()); assertEquals(70, sourceInfo.getFileBytesOffset(sourceInfo.getMinAddress()));
assertEquals(10, sourceInfo.getLength()); assertEquals(10, sourceInfo.getLength());
} }

View file

@ -33,19 +33,28 @@
</returnaddress> </returnaddress>
<stackpointer register="a10" space="ram"/> <stackpointer register="a10" space="ram"/>
<prefersplit style="inhalf">
<register name="e4"/>
<register name="e6"/>
</prefersplit>
<default_proto> <default_proto>
<prototype name="__stdcall" extrapop="0" stackshift="0" strategy="register"> <prototype name="__stdcall" extrapop="0" stackshift="0">
<input> <input>
<pentry minsize="1" maxsize="4"> <!-- This is the first non pointer --> <pentry minsize="4" maxsize="4" storage="hiddenret">
<register name="a4"/> <register name="a4"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="4"> <pentry minsize="4" maxsize="4" metatype="ptr"> <!-- This is the first pointer -->
<register name="a4"/>
</pentry>
<pentry minsize="4" maxsize="4" metatype="ptr">
<register name="a5"/> <register name="a5"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="4"> <pentry minsize="4" maxsize="4" metatype="ptr">
<register name="a6"/> <register name="a6"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="4"> <pentry minsize="4" maxsize="4" metatype="ptr">
<register name="a7"/> <register name="a7"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="4"> <!-- This is the first non pointer --> <pentry minsize="1" maxsize="4"> <!-- This is the first non pointer -->
@ -54,31 +63,35 @@
<pentry minsize="1" maxsize="4"> <pentry minsize="1" maxsize="4">
<register name="d5"/> <register name="d5"/>
</pentry> </pentry>
<pentry minsize="5" maxsize="8"> <!-- This is the first >4 byte non pointer -->
<register name="e4"/>
</pentry>
<pentry minsize="1" maxsize="4"> <pentry minsize="1" maxsize="4">
<register name="d6"/> <register name="d6"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="4"> <pentry minsize="1" maxsize="4">
<register name="d7"/> <register name="d7"/>
</pentry> </pentry>
<pentry minsize="5" maxsize="8"> <!-- This is the first >4 byte non pointer --> <pentry minsize="5" maxsize="8">
<register name="e4"/> <register name="e6"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="500" align="4"> <pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="ram"/> <addr offset="0" space="stack"/>
</pentry> </pentry>
<rule>
<datatype name="struct" minsize="17"/>
<convert_to_ptr/>
</rule>
</input> </input>
<!-- There are issues with locking in function signatures with multiple possible
return locations. When the signature is committed/locked, Ghidra will apply the
first available location, which is incorrect. The decompiler can figure
out between two variable locations but doesn't currently pass back the
return storage location. A fix is needed, or use custom storage. -->
<output> <output>
<pentry minsize="1" maxsize="4" metatype="ptr"> <pentry minsize="4" maxsize="4" metatype="ptr">
<register name="a2"/> <register name="a2"/>
</pentry> </pentry>
<pentry minsize="1" maxsize="8"> <pentry minsize="1" maxsize="4">
<register name="d2"/>
</pentry>
<pentry minsize="5" maxsize="8">
<register name="e2"/> <register name="e2"/>
</pentry> </pentry>
</output> </output>
@ -91,6 +104,10 @@
<register name="d13"/> <register name="d13"/>
<register name="d14"/> <register name="d14"/>
<register name="d15"/> <register name="d15"/>
<register name="a0"/>
<register name="a1"/>
<register name="a8"/>
<register name="a9"/>
<register name="a10"/> <register name="a10"/>
<register name="a11"/> <register name="a11"/>
<register name="a12"/> <register name="a12"/>
@ -101,64 +118,9 @@
</prototype> </prototype>
</default_proto> </default_proto>
<!-- This will no longer be necessary once fixes are made to support the <!-- __stdcall_data calling convention removed, no longer necessary as decompiler will return
correct choice of storage location when there are multiple return types --> the correct return storage location when there are multiple return location types
-->
<prototype name="__stdcall_data" extrapop="0" stackshift="0" strategy="register">
<input>
<pentry minsize="1" maxsize="4"> <!-- This is the first non pointer -->
<register name="a4"/>
</pentry>
<pentry minsize="1" maxsize="4"> <!-- This is the first non pointer -->
<register name="d4"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="d5"/>
</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="d6"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="a7"/>
</pentry>
<pentry minsize="1" maxsize="4">
<register name="d7"/>
</pentry>
<pentry minsize="5" maxsize="8"> <!-- This is the first >4 byte non pointer -->
<register name="e4"/>
</pentry>
<pentry minsize="1" maxsize="500" align="4">
<addr offset="16" space="ram"/>
</pentry>
</input>
<output>
<pentry minsize="1" maxsize="8">
<register name="e2"/>
</pentry>
</output>
<unaffected>
<register name="d8"/>
<register name="d9"/>
<register name="d10"/>
<register name="d11"/>
<register name="d12"/>
<register name="d13"/>
<register name="d14"/>
<register name="d15"/>
<register name="a10"/>
<register name="a11"/>
<register name="a12"/>
<register name="a13"/>
<register name="a14"/>
<register name="a15"/>
</unaffected>
</prototype>
<callotherfixup targetop="saveCallerState"> <callotherfixup targetop="saveCallerState">
<pcode> <pcode>