GP-0: Fix timing issue in emulator service and p-code stepper test.

This commit is contained in:
Dan
2022-03-02 11:15:04 -05:00
parent 2d09b7513d
commit b1ca07ded5
2 changed files with 14 additions and 9 deletions
@@ -90,16 +90,18 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
traceManager.openTrace(tb.trace); traceManager.openTrace(tb.trace);
traceManager.activateThread(thread); traceManager.activateThread(thread);
traceManager.activateTime(schedule1); traceManager.activateTime(schedule1);
waitForPass(() -> assertEquals(schedule1, pcodeProvider.current.getTime()));
DebuggerTracePcodeEmulator emu =
waitForValue(() -> emuService.getCachedEmulator(tb.trace, schedule1));
assertNotNull(emu);
// P-code step to decode already done. One for each op. One to retire. // P-code step to decode already done. One for each op. One to retire.
TraceSchedule schedule2 = TraceSchedule schedule2 =
schedule1.steppedPcodeForward(thread, imm1234.getPcode().length + 1); schedule1.steppedPcodeForward(thread, imm1234.getPcode().length + 1);
PcodeThread<byte[]> et = emu.getThread(thread.getPath(), false);
traceManager.activateTime(schedule2); traceManager.activateTime(schedule2);
waitForPass(() -> assertEquals(schedule2, pcodeProvider.current.getTime()));
DebuggerTracePcodeEmulator emu =
waitForValue(() -> emuService.getCachedEmulator(tb.trace, schedule2));
assertNotNull(emu);
PcodeThread<byte[]> et = emu.getThread(thread.getPath(), false);
waitForPass(() -> assertNull(et.getFrame())); waitForPass(() -> assertNull(et.getFrame()));
/** /**
@@ -110,13 +112,13 @@ public class DebuggerPcodeStepperProviderTest extends AbstractGhidraHeadedDebugg
*/ */
emu.addBreakpoint(imm2045.getAddress(), "1:1"); emu.addBreakpoint(imm2045.getAddress(), "1:1");
// Just one to decode is necessary // Just one p-code step to decode
TraceSchedule schedule3 = schedule2.steppedPcodeForward(thread, 1); TraceSchedule schedule3 = schedule2.steppedPcodeForward(thread, 1);
traceManager.activateTime(schedule3); traceManager.activateTime(schedule3);
waitForPass(() -> assertEquals(schedule3, pcodeProvider.current.getTime())); waitForPass(() -> assertEquals(schedule3, pcodeProvider.current.getTime()));
assertTrue(pcodeProvider.pcodeTableModel.getModelData() waitForPass(() -> assertTrue(pcodeProvider.pcodeTableModel.getModelData()
.stream() .stream()
.anyMatch(r -> r.getCode().contains("emu_swi"))); .anyMatch(r -> r.getCode().contains("emu_swi"))));
} }
} }
@@ -135,7 +135,10 @@ public abstract class AnnotatedSleighUseropLibrary<T> implements SleighUseropLib
Class<T> opType = getOperandType(); Class<T> opType = getOperandType();
@SuppressWarnings({ "unchecked", "rawtypes" }) @SuppressWarnings({ "unchecked", "rawtypes" })
Class<? extends AnnotatedSleighUseropLibrary<T>> cls = (Class) this.getClass(); Class<? extends AnnotatedSleighUseropLibrary<T>> cls = (Class) this.getClass();
Set<Method> methods = CACHE_BY_CLASS.computeIfAbsent(cls, __ -> collectDefinitions(cls)); Set<Method> methods;
synchronized (CACHE_BY_CLASS) {
methods = CACHE_BY_CLASS.computeIfAbsent(cls, __ -> collectDefinitions(cls));
}
for (Method m : methods) { for (Method m : methods) {
ops.put(m.getName(), new AnnotatedSleighUseropDefinition<>(this, opType, lookup, m)); ops.put(m.getName(), new AnnotatedSleighUseropDefinition<>(this, opType, lookup, m));
} }