GP-1650: Introduce Reason for reading state. Fix spurrious uninit warnings.

This commit is contained in:
Dan 2022-09-22 14:47:08 -04:00
parent 45165ea167
commit dcd54c6695
44 changed files with 224 additions and 151 deletions

View file

@ -41,14 +41,14 @@ public abstract class AbstractCheckedTraceCachedWriteBytesPcodeExecutorStatePiec
}
@Override
public byte[] read(long offset, int size) {
public byte[] read(long offset, int size, Reason reason) {
RangeSet<UnsignedLong> uninitialized =
bytes.getUninitialized(offset, offset + size - 1);
if (!uninitialized.isEmpty()) {
size = checkUninitialized(backing, space.getAddress(offset), size,
addrSet(uninitialized));
}
return super.read(offset, size);
return super.read(offset, size, reason);
}
}

View file

@ -99,7 +99,7 @@ public class DirectBytesTracePcodeExecutorStatePiece
}
@Override
protected byte[] getUnique(long offset, int size) {
protected byte[] getUnique(long offset, int size, Reason reason) {
byte[] data = new byte[size];
unique.getData(offset, data);
return data;
@ -120,7 +120,7 @@ public class DirectBytesTracePcodeExecutorStatePiece
}
@Override
protected byte[] getFromSpace(AddressSpace space, long offset, int size) {
protected byte[] getFromSpace(AddressSpace space, long offset, int size, Reason reason) {
ByteBuffer buf = ByteBuffer.allocate(size);
int read = data.getBytes(space.getAddress(offset), buf);
if (read != size) {

View file

@ -78,7 +78,7 @@ public class TraceMemoryStatePcodeExecutorStatePiece extends
}
@Override
protected TraceMemoryState getUnique(long offset, int size) {
protected TraceMemoryState getUnique(long offset, int size, Reason reason) {
RangeSet<UnsignedLong> remains = TreeRangeSet.create();
Range<UnsignedLong> range = range(offset, size);
remains.add(range);
@ -106,12 +106,13 @@ public class TraceMemoryStatePcodeExecutorStatePiece extends
}
@Override
protected TraceMemoryState getFromSpace(AddressSpace space, long offset, int size) {
protected TraceMemoryState getFromSpace(AddressSpace space, long offset, int size,
Reason reason) {
return data.getViewportState(range(space, offset, size));
}
@Override
protected TraceMemoryState getFromNullSpace(int size) {
protected TraceMemoryState getFromNullSpace(int size, Reason reason) {
return TraceMemoryState.UNKNOWN;
}

View file

@ -23,6 +23,7 @@ import org.apache.commons.lang3.tuple.Pair;
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.pcode.exec.*;
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
import ghidra.pcode.utils.Utils;
import ghidra.program.model.address.AddressRange;
import ghidra.program.model.address.AddressSpace;
@ -61,7 +62,7 @@ public enum TraceSleighUtils {
throw new IllegalArgumentException("TracePlatform must use a SLEIGH language");
}
return new PcodeExecutor<>((SleighLanguage) language,
BytesPcodeArithmetic.forLanguage(language), state);
BytesPcodeArithmetic.forLanguage(language), state, Reason.INSPECT);
}
/**
@ -102,7 +103,7 @@ public enum TraceSleighUtils {
}
return new PcodeExecutor<>((SleighLanguage) language, new PairedPcodeArithmetic<>(
BytesPcodeArithmetic.forLanguage(language), TraceMemoryStatePcodeArithmetic.INSTANCE),
paired);
paired, Reason.INSPECT);
}
/**

View file

@ -29,13 +29,12 @@ import com.google.common.collect.Range;
import ghidra.app.plugin.assembler.*;
import ghidra.app.plugin.assembler.sleigh.sem.AssemblyPatternBlock;
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.dbg.target.schema.SchemaContext;
import ghidra.dbg.target.schema.TargetObjectSchema.SchemaName;
import ghidra.dbg.target.schema.XmlSchemaContext;
import ghidra.lifecycle.Unfinished;
import ghidra.pcode.emu.PcodeThread;
import ghidra.pcode.exec.*;
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
import ghidra.pcode.exec.trace.data.PcodeTraceDataAccess;
import ghidra.program.model.address.Address;
import ghidra.program.model.address.AddressRangeImpl;
@ -158,7 +157,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
assertEquals(tb.addr(0x00400007), emuThread.getCounter());
assertArrayEquals(tb.arr(0x07, 0, 0x40, 0, 0, 0, 0, 0),
emuThread.getState().getVar(pc));
emuThread.getState().getVar(pc, Reason.INSPECT));
emuThread.stepInstruction();
@ -220,11 +219,11 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
assertEquals(tb.addr(0x00401000), emuThread.getCounter());
assertArrayEquals(tb.arr(0, 0x10, 0x40, 0),
emuThread.getState().getVar(pc));
emuThread.getState().getVar(pc, Reason.INSPECT));
assertEquals(new RegisterValue(ctxreg, BigInteger.valueOf(0x8000_0000_0000_0000L)),
emuThread.getContext());
assertArrayEquals(tb.arr(0x80, 0, 0, 0, 0, 0, 0, 0),
emuThread.getState().getVar(ctxreg));
emuThread.getState().getVar(ctxreg, Reason.INSPECT));
emuThread.stepInstruction();
@ -610,7 +609,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
assertEquals(tb.addr(0x00400007), emuThread.getCounter());
assertArrayEquals(tb.arr(0x07, 0, 0x40, 0, 0, 0, 0, 0),
emuThread.getState().getVar(pc));
emuThread.getState().getVar(pc, Reason.INSPECT));
try (UndoableTransaction tid = tb.startTransaction()) {
emu.writeDown(tb.host, 1, 1);
@ -647,7 +646,7 @@ public class BytesTracePcodeEmulatorTest extends AbstractTracePcodeEmulatorTest
assertEquals(tb.addr(0x00400002), emuThread.getCounter());
assertArrayEquals(tb.arr(0x02, 0, 0x40, 0, 0, 0, 0, 0),
emuThread.getState().getVar(pc));
emuThread.getState().getVar(pc, Reason.INSPECT));
try (UndoableTransaction tid = tb.startTransaction()) {
emu.writeDown(tb.host, 1, 1);

View file

@ -26,6 +26,7 @@ import org.junit.Test;
import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.pcode.exec.*;
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
import ghidra.program.model.lang.*;
import ghidra.program.util.DefaultLanguageService;
import ghidra.test.AbstractGhidraHeadlessIntegrationTest;
@ -220,7 +221,8 @@ public class TraceSleighUtilsTest extends AbstractGhidraHeadlessIntegrationTest
PcodeExecutor<byte[]> executor =
new PcodeExecutor<>(sp.getLanguage(),
BytesPcodeArithmetic.forLanguage(b.language),
new DirectBytesTracePcodeExecutorState(b.host, 0, thread, 0));
new DirectBytesTracePcodeExecutorState(b.host, 0, thread, 0),
Reason.EXECUTE);
sp.execute(executor, PcodeUseropLibrary.nil());
}

View file

@ -19,6 +19,7 @@ import ghidra.app.plugin.processors.sleigh.SleighLanguage;
import ghidra.pcode.emu.PcodeThread;
import ghidra.pcode.emu.ThreadPcodeExecutorState;
import ghidra.pcode.exec.*;
import ghidra.pcode.exec.PcodeExecutorStatePiece.Reason;
import ghidra.program.model.address.Address;
import ghidra.program.model.lang.RegisterValue;
import ghidra.program.model.listing.Instruction;
@ -61,7 +62,7 @@ class TestThread implements PcodeThread<Void> {
@Override
public PcodeExecutor<Void> getExecutor() {
return new PcodeExecutor<>(TraceScheduleTest.TOY_BE_64_LANG, machine.getArithmetic(),
getState()) {
getState(), Reason.EXECUTE) {
public PcodeFrame execute(PcodeProgram program, PcodeUseropLibrary<Void> library) {
machine.record.add("x:" + name);
// TODO: Verify the actual effect