GP-4285 Compressed SLEIGH

This commit is contained in:
caheckman 2024-01-10 22:53:12 +00:00
parent b380fd5fa6
commit 8fbd171cdf
207 changed files with 15233 additions and 6055 deletions

View file

@ -15,13 +15,15 @@
*/
package ghidra.app.plugin.assembler.sleigh;
import static ghidra.pcode.utils.SlaFormat.*;
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.Test;
import org.xml.sax.SAXException;
import ghidra.GhidraApplicationLayout;
import ghidra.app.plugin.assembler.sleigh.expr.*;
@ -37,9 +39,8 @@ import ghidra.app.plugin.processors.sleigh.template.HandleTpl;
import ghidra.framework.Application;
import ghidra.framework.ApplicationConfiguration;
import ghidra.program.model.lang.LanguageID;
import ghidra.program.model.pcode.*;
import ghidra.util.Msg;
import ghidra.xml.XmlPullParser;
import ghidra.xml.XmlPullParserFactory;
public class SolverTest {
static final DefaultAssemblyResolutionFactory FACTORY = new DefaultAssemblyResolutionFactory();
@ -164,24 +165,54 @@ public class SolverTest {
}
@Test
public void testCatOrSolver() throws SAXException, NeedsBackfillException {
XmlPullParser parser = XmlPullParserFactory.create("""
<or_exp>
<lshift_exp>
<tokenfield bigendian='false' signbit='false' bitstart='0' bitend='3'
bytestart='0' byteend='0' shift='0'/>
<intb val='4'/>
</lshift_exp>
<tokenfield bigendian='false' signbit='false' bitstart='8' bitend='11'
bytestart='1' byteend='1' shift='0'/>
</or_exp>
""",
"Test", null, true);
PatternExpression exp = PatternExpression.restoreExpression(parser, null);
public void testCatOrSolver() throws NeedsBackfillException, DecoderException, IOException {
PatchPackedEncode encode = new PatchPackedEncode();
encode.clear();
encode.openElement(ELEM_OR_EXP);
encode.openElement(ELEM_LSHIFT_EXP);
encode.openElement(ELEM_TOKENFIELD);
encode.writeBool(ATTRIB_BIGENDIAN, false);
encode.writeBool(ATTRIB_SIGNBIT, false);
encode.writeSignedInteger(ATTRIB_STARTBIT, 0);
encode.writeSignedInteger(ATTRIB_ENDBIT, 3);
encode.writeSignedInteger(ATTRIB_STARTBYTE, 0);
encode.writeSignedInteger(ATTRIB_ENDBYTE, 0);
encode.writeSignedInteger(ATTRIB_SHIFT, 0);
encode.closeElement(ELEM_TOKENFIELD);
encode.openElement(ELEM_INTB);
encode.writeSignedInteger(ATTRIB_VAL, 4);
encode.closeElement(ELEM_INTB);
encode.closeElement(ELEM_LSHIFT_EXP);
encode.openElement(ELEM_TOKENFIELD);
encode.writeBool(ATTRIB_BIGENDIAN, false);
encode.writeBool(ATTRIB_SIGNBIT, false);
encode.writeSignedInteger(ATTRIB_STARTBIT, 0);
encode.writeSignedInteger(ATTRIB_ENDBIT, 11);
encode.writeSignedInteger(ATTRIB_STARTBYTE, 1);
encode.writeSignedInteger(ATTRIB_ENDBYTE, 1);
encode.writeSignedInteger(ATTRIB_SHIFT, 0);
encode.closeElement(ELEM_TOKENFIELD);
encode.closeElement(ELEM_OR_EXP);
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
encode.writeTo(outStream);
byte[] bytes = outStream.toByteArray();
PackedDecode decoder = new PackedDecode();
decoder.open(1024, "Test");
decoder.ingestBytes(bytes, 0, bytes.length);
decoder.endIngest();
// <or_exp>
// <lshift_exp>
// <tokenfield bigendian='false' signbit='false' bitstart='0' bitend='3'
// bytestart='0' byteend='0' shift='0'/>
// <intb val='4'/>
// </lshift_exp>
// <tokenfield bigendian='false' signbit='false' bitstart='8' bitend='11'
// bytestart='1' byteend='1' shift='0'/>
// </or_exp>
PatternExpression exp = PatternExpression.decodeExpression(decoder, null);
RecursiveDescentSolver solver = RecursiveDescentSolver.getSolver();
AssemblyResolution res =
solver.solve(FACTORY, exp, MaskedLong.fromLong(0x78), Collections.emptyMap(),
FACTORY.nop("NOP"), "Test");
AssemblyResolution res = solver.solve(FACTORY, exp, MaskedLong.fromLong(0x78),
Collections.emptyMap(), FACTORY.nop("NOP"), "Test");
AssemblyResolution e = FACTORY.fromString("ins:X7:X8", "Test", null);
assertEquals(e, res);
}

View file

@ -31,7 +31,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
private AddressFactory addrFactory;
private void testSignedAttributes(Encoder encoder, Decoder decoder)
private void testSignedAttributes(CachedEncoder encoder, Decoder decoder)
throws DecoderException, IOException
{
@ -50,7 +50,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testSignedAttributes");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el = decoder.openElement(ELEM_ADDR);
int flags = 0;
@ -109,7 +109,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
assertEquals(flags, 0x1ff);
}
private void testUnsignedAttributes(Encoder encoder, Decoder decoder)
private void testUnsignedAttributes(CachedEncoder encoder, Decoder decoder)
throws DecoderException, IOException
{
@ -129,7 +129,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testUnsignedAttributes");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el = decoder.openElement(ELEM_ADDR);
long val = decoder.readUnsignedInteger(ATTRIB_ALIGN);
@ -155,7 +155,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
decoder.closeElement(el);
}
private void testMixedAttributes(Encoder encoder, Decoder decoder)
private void testMixedAttributes(CachedEncoder encoder, Decoder decoder)
throws DecoderException, IOException {
encoder.openElement(ELEM_ADDR);
encoder.writeSignedInteger(ATTRIB_ALIGN, 456);
@ -165,7 +165,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testMixedAttributes");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int alignVal = -1;
int extrapopVal = -1;
@ -187,7 +187,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
assertEquals(extrapopVal, 800);
}
private void testAttributes(Encoder encoder, Decoder decoder)
private void testAttributes(CachedEncoder encoder, Decoder decoder)
throws DecoderException, IOException
{
@ -209,7 +209,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testAttributes");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el = decoder.openElement(ELEM_DATA);
boolean bval = decoder.readBool(ATTRIB_ALIGN);
@ -229,7 +229,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
decoder.closeElement(el);
}
private void testHierarchy(Encoder encoder, Decoder decoder)
private void testHierarchy(CachedEncoder encoder, Decoder decoder)
throws IOException, DecoderException
{
@ -273,7 +273,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testHierarchy");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el1 = decoder.openElement(ELEM_DATA);
// Skip over the bool
@ -303,7 +303,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
decoder.closeElementSkipping(el1);
}
private void testUnexpectedEof(Encoder encoder, Decoder decoder) throws IOException
private void testUnexpectedEof(CachedEncoder encoder, Decoder decoder) throws IOException
{
encoder.openElement(ELEM_DATA);
@ -316,7 +316,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testAttributes");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el1 = decoder.openElement(ELEM_DATA);
int el2 = decoder.openElement(ELEM_INPUT);
@ -329,7 +329,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
assertTrue(sawUnexpectedError);
}
public void testNoremaining(Encoder encoder, Decoder decoder)
public void testNoremaining(CachedEncoder encoder, Decoder decoder)
throws IOException, DecoderException
{
@ -341,7 +341,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testNoremaining");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
decoder.openElement(ELEM_INPUT);
int el2 = decoder.openElement(ELEM_OFF);
@ -356,7 +356,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
assertTrue(sawNoRemaining);
}
private void testOpenmismatch(Encoder encoder, Decoder decoder)
private void testOpenmismatch(CachedEncoder encoder, Decoder decoder)
throws IOException, DecoderException
{
@ -368,7 +368,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testOpenmismatch");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
decoder.openElement(ELEM_INPUT);
boolean sawOpenMismatch = false;
@ -381,7 +381,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
assertTrue(sawOpenMismatch);
}
private void testClosemismatch(Encoder encoder, Decoder decoder)
private void testClosemismatch(CachedEncoder encoder, Decoder decoder)
throws IOException, DecoderException
{
@ -393,7 +393,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
encoder.writeTo(outStream);
ByteArrayInputStream inStream = new ByteArrayInputStream(outStream.toByteArray());
decoder.open(1 << 20, "testClosemismatch");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el1 = decoder.openElement(ELEM_INPUT);
boolean sawCloseMismatch = false;
@ -419,7 +419,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void testMarshalSignedPacked() throws DecoderException, IOException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testSignedAttributes(encoder, decoder);
@ -427,7 +427,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalUnsignedPacked() throws DecoderException, IOException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testUnsignedAttributes(encoder, decoder);
@ -435,7 +435,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalMixedPacked() throws DecoderException, IOException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testMixedAttributes(encoder, decoder);
@ -443,7 +443,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalAttribsPacked() throws DecoderException, IOException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testAttributes(encoder, decoder);
@ -451,7 +451,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalHierarchyPacked() throws DecoderException, IOException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testHierarchy(encoder, decoder);
@ -459,7 +459,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalUnexpectedPacked() throws IOException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testUnexpectedEof(encoder, decoder);
@ -467,7 +467,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalNoremainingPacked() throws IOException, DecoderException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testNoremaining(encoder, decoder);
@ -475,7 +475,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalOpenmismatchPacked() throws IOException, DecoderException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testOpenmismatch(encoder, decoder);
@ -483,7 +483,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalClosemismatchPacked() throws IOException, DecoderException {
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
PackedDecode decoder = new PackedDecode(addrFactory);
testClosemismatch(encoder, decoder);
@ -492,7 +492,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
@Test
public void marshalBufferpad() throws IOException, DecoderException {
assertEquals(LinkedByteBuffer.BUFFER_SIZE, 1024);
PackedEncode encoder = new PackedEncode();
PatchPackedEncode encoder = new PatchPackedEncode();
encoder.clear();
encoder.openElement(ELEM_INPUT); // 1-byte
for (int i = 0; i < 511; ++i) {
@ -506,7 +506,7 @@ public class EncodeDecodeTest extends AbstractGenericTest {
ByteArrayInputStream inStream = new ByteArrayInputStream(bytesOut);
PackedDecode decoder = new PackedDecode(addrFactory);
decoder.open(1 << 20, "marshalBufferpad");
decoder.ingestStream(inStream);
decoder.ingestStreamToNextTerminator(inStream);
decoder.endIngest();
int el = decoder.openElement(ELEM_INPUT);
for (int i = 0; i < 511; ++i) {