Skip to content

Commit 0f0adc6

Browse files
committed
Add DDR command continuationstack
Also removed the part that tests ELS because the ELS is no longer stored in the walk state. Signed-off-by: Gengchen Tuo <gengchen.tuo@ibm.com>
1 parent e41c032 commit 0f0adc6

19 files changed

+562
-400
lines changed

debugtools/DDR_VM/src/com/ibm/j9ddr/AuxFieldInfo29.dat

+9
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,15 @@ J9ThreadMonitorPool.entries = required
564564
J9ThreadMonitorPool.next = required
565565
J9TranslationBufferSet.romClassBuilder = required
566566
J9UTF8.length = required
567+
J9VMContinuation.arg0EA = UDATA*
568+
J9VMContinuation.decompilationStack = J9JITDecompilationInfo*
569+
J9VMContinuation.i2jState = J9I2JState
570+
J9VMContinuation.j2iFrame = UDATA*
571+
J9VMContinuation.jitGPRs = J9JITGPRSpillArea
572+
J9VMContinuation.literals = J9Method*
573+
J9VMContinuation.oldEntryLocalStorage = J9VMEntryLocalStorage*
574+
J9VMContinuation.pc = U8*
575+
J9VMContinuation.sp = UDATA*
567576
J9VMEntryLocalStorage.i2jState = required
568577
J9VMEntryLocalStorage.jitFPRegisterStorageBase = required
569578
J9VMEntryLocalStorage.jitGlobalStorageBase = required

debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/j9/RootScanner.java

+6-4
Original file line numberDiff line numberDiff line change
@@ -110,12 +110,14 @@ protected RootScanner() throws CorruptDataException
110110

111111
private class RootScannerStackWalkerCallbacks implements IStackWalkerCallbacks
112112
{
113-
public FrameCallbackResult frameWalkFunction(J9VMThreadPointer walkThread, WalkState walkState)
113+
@Override
114+
public FrameCallbackResult frameWalkFunction(WalkState walkState)
114115
{
115116
return FrameCallbackResult.KEEP_ITERATING;
116117
}
117118

118-
public void objectSlotWalkFunction(J9VMThreadPointer walkThread, WalkState walkState, PointerPointer objectSlot, VoidPointer stackLocation)
119+
@Override
120+
public void objectSlotWalkFunction(WalkState walkState, PointerPointer objectSlot, VoidPointer stackLocation)
119121
{
120122
try {
121123
J9ObjectPointer object = J9ObjectPointer.cast(objectSlot.at(0));
@@ -127,8 +129,8 @@ public void objectSlotWalkFunction(J9VMThreadPointer walkThread, WalkState walkS
127129
}
128130
}
129131

130-
public void fieldSlotWalkFunction(J9VMThreadPointer walkThread,
131-
WalkState walkState, ObjectReferencePointer objectSlot,
132+
@Override
133+
public void fieldSlotWalkFunction(WalkState walkState, ObjectReferencePointer objectSlot,
132134
VoidPointer stackLocation)
133135
{
134136
try {

debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/j9/StackRoots.java

+8-7
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,14 @@ public class StackRoots
5151

5252
private class StackWalkerCallbacks implements IStackWalkerCallbacks
5353
{
54-
public FrameCallbackResult frameWalkFunction(J9VMThreadPointer walkThread, WalkState walkState)
54+
@Override
55+
public FrameCallbackResult frameWalkFunction(WalkState walkState)
5556
{
5657
return FrameCallbackResult.KEEP_ITERATING;
5758
}
58-
59-
public void objectSlotWalkFunction(J9VMThreadPointer walkThread, WalkState walkState, PointerPointer objectSlot, VoidPointer stackAddress)
59+
60+
@Override
61+
public void objectSlotWalkFunction(WalkState walkState, PointerPointer objectSlot, VoidPointer stackAddress)
6062
{
6163
if (walkState.method.isNull()){
6264
/* adding an object slot iterator causes us to be called for
@@ -76,10 +78,9 @@ public void objectSlotWalkFunction(J9VMThreadPointer walkThread, WalkState walkS
7678
throw new UnsupportedOperationException("Corrupt objectSlot detected");
7779
}
7880
}
79-
80-
81-
public void fieldSlotWalkFunction(J9VMThreadPointer walkThread,
82-
WalkState walkState, ObjectReferencePointer objectSlot,
81+
82+
@Override
83+
public void fieldSlotWalkFunction(WalkState walkState, ObjectReferencePointer objectSlot,
8384
VoidPointer stackLocation)
8485
{
8586
if (walkState.method.isNull()){

debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/j9/stackwalker/BaseStackWalkerCallbacks.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.ibm.j9ddr.vm29.pointer.ObjectReferencePointer;
2525
import com.ibm.j9ddr.vm29.pointer.PointerPointer;
2626
import com.ibm.j9ddr.vm29.pointer.VoidPointer;
27-
import com.ibm.j9ddr.vm29.pointer.generated.J9VMThreadPointer;
2827

2928
/**
3029
* Base implementation of IStackWalkerCallbacks that does performs no-ops
@@ -41,22 +40,22 @@ public class BaseStackWalkerCallbacks implements IStackWalkerCallbacks
4140
/* (non-Javadoc)
4241
* @see com.ibm.j9ddr.vm.j9.stackwalker.IStackWalkerCallbacks#frameWalkFunction(com.ibm.j9ddr.vm.j9.stackwalker.WalkState)
4342
*/
44-
public FrameCallbackResult frameWalkFunction(J9VMThreadPointer walkThread,
45-
WalkState walkState)
43+
@Override
44+
public FrameCallbackResult frameWalkFunction(WalkState walkState)
4645
{
4746
// Deliberately do nothing
4847
return FrameCallbackResult.KEEP_ITERATING;
4948
}
5049

51-
public void objectSlotWalkFunction(J9VMThreadPointer walkThread,
52-
WalkState walkState, PointerPointer objectSlot,
50+
@Override
51+
public void objectSlotWalkFunction(WalkState walkState, PointerPointer objectSlot,
5352
VoidPointer stackLocation)
5453
{
5554
// Deliberately do nothing
5655
}
5756

58-
public void fieldSlotWalkFunction(J9VMThreadPointer walkThread,
59-
WalkState walkState, ObjectReferencePointer objectSlot,
57+
@Override
58+
public void fieldSlotWalkFunction(WalkState walkState, ObjectReferencePointer objectSlot,
6059
VoidPointer stackLocation)
6160
{
6261
// Deliberately do nothing

debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/j9/stackwalker/IStackWalkerCallbacks.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import com.ibm.j9ddr.vm29.pointer.ObjectReferencePointer;
2525
import com.ibm.j9ddr.vm29.pointer.PointerPointer;
2626
import com.ibm.j9ddr.vm29.pointer.VoidPointer;
27-
import com.ibm.j9ddr.vm29.pointer.generated.J9VMThreadPointer;
2827

2928
/**
3029
* Interface for stack-walker callback routines.
@@ -35,14 +34,14 @@
3534
public interface IStackWalkerCallbacks
3635
{
3736

38-
public FrameCallbackResult frameWalkFunction(J9VMThreadPointer walkThread, WalkState walkState);
37+
public FrameCallbackResult frameWalkFunction(WalkState walkState);
3938

40-
public void objectSlotWalkFunction(J9VMThreadPointer walkThread, WalkState walkState, PointerPointer objectSlot, VoidPointer stackLocation);
39+
public void objectSlotWalkFunction(WalkState walkState, PointerPointer objectSlot, VoidPointer stackLocation);
4140

4241
/**
4342
* This callback doesn't exist in the native C.
4443
*
4544
* It's purpose in DDR is passing back field slots in stack-allocated objects (which would be incorrectly handled by a PointerPointer)
4645
*/
47-
public void fieldSlotWalkFunction(J9VMThreadPointer walkThread, WalkState walkState, ObjectReferencePointer objectSlot, VoidPointer stackLocation);
46+
public void fieldSlotWalkFunction(WalkState walkState, ObjectReferencePointer objectSlot, VoidPointer stackLocation);
4847
}

debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/j9/stackwalker/JITStackWalker.java

+20-21
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@
6262
import com.ibm.j9ddr.vm29.pointer.generated.J9SFNativeMethodFramePointer;
6363
import com.ibm.j9ddr.vm29.pointer.generated.J9SFSpecialFramePointer;
6464
import com.ibm.j9ddr.vm29.pointer.generated.J9UTF8Pointer;
65-
import com.ibm.j9ddr.vm29.pointer.generated.J9VMThreadPointer;
6665
import com.ibm.j9ddr.vm29.pointer.helper.J9UTF8Helper;
6766
import com.ibm.j9ddr.vm29.structure.J9ITable;
6867
import com.ibm.j9ddr.vm29.structure.J9JITFrame;
@@ -106,9 +105,9 @@ static void jitPrintRegisterMapArray(WalkState walkState, String description) th
106105
getImpl().jitPrintRegisterMapArray(walkState,description);
107106
}
108107

109-
static J9JITExceptionTablePointer jitGetExceptionTableFromPC(J9VMThreadPointer walkThread, U8Pointer pc) throws CorruptDataException
108+
static J9JITExceptionTablePointer jitGetExceptionTableFromPC(J9JavaVMPointer javaVM, U8Pointer pc) throws CorruptDataException
110109
{
111-
return getImpl().jitGetExceptionTableFromPC(walkThread, pc);
110+
return getImpl().jitGetExceptionTableFromPC(javaVM, pc);
112111
}
113112

114113
private static IJITStackWalker impl;
@@ -137,7 +136,7 @@ private static interface IJITStackWalker extends IAlgorithm
137136

138137
public void jitPrintRegisterMapArray(WalkState walkState, String description) throws CorruptDataException;
139138

140-
public J9JITExceptionTablePointer jitGetExceptionTableFromPC(J9VMThreadPointer walkThread, U8Pointer pc) throws CorruptDataException;
139+
public J9JITExceptionTablePointer jitGetExceptionTableFromPC(J9JavaVMPointer javaVM, U8Pointer pc) throws CorruptDataException;
141140
}
142141

143142
/**
@@ -214,7 +213,7 @@ public FrameCallbackResult jitWalkStackFrames(WalkState walkState)
214213
walkState.outgoingArgCount = walkState.argCount;
215214

216215
if (((walkState.flags & J9_STACKWALK_SKIP_INLINES) == 0) && getJitInlinedCallInfo(walkState.jitInfo).notNull()) {
217-
jitGetMapsFromPC(walkState.walkThread.javaVM(), walkState.jitInfo, UDATA.cast(walkState.pc), maps);
216+
jitGetMapsFromPC(walkState.javaVM, walkState.jitInfo, UDATA.cast(walkState.pc), maps);
218217
if (maps.inlineMap.notNull()) {
219218
VoidPointer inlinedCallSite = getFirstInlinedCallSite(walkState.jitInfo, VoidPointer.cast(maps.inlineMap));
220219
walkState.arg0EA = UDATAPointer.NULL;
@@ -238,7 +237,7 @@ public FrameCallbackResult jitWalkStackFrames(WalkState walkState)
238237
}
239238
}
240239
} else if ((walkState.flags & J9_STACKWALK_RECORD_BYTECODE_PC_OFFSET) != 0) {
241-
jitGetMapsFromPC(walkState.walkThread.javaVM(), walkState.jitInfo, UDATA.cast(walkState.pc),maps);
240+
jitGetMapsFromPC(walkState.javaVM, walkState.jitInfo, UDATA.cast(walkState.pc), maps);
242241
}
243242

244243
SET_A0_CP_METHOD(walkState);
@@ -278,7 +277,7 @@ public FrameCallbackResult jitWalkStackFrames(WalkState walkState)
278277

279278
/* JIT pair with no mapping indicates a bytecoded frame */
280279
failedPC = walkState.pc;
281-
returnTable = PointerPointer.cast(walkState.walkThread.javaVM().jitConfig().i2jReturnTable());
280+
returnTable = PointerPointer.cast(walkState.javaVM.jitConfig().i2jReturnTable());
282281
if (returnTable.notNull()) {
283282
for (i = 0; i < J9SW_JIT_RETURN_TABLE_SIZE; ++i) {
284283
if (failedPC.eq(U8Pointer.cast(returnTable.at(i)))) break;
@@ -309,11 +308,11 @@ private J9JITExceptionTablePointer jitGetExceptionTable(
309308
{
310309
/* this is done with a macro in C */
311310
if (! J9BuildFlags.jit_fullSpeedDebug) {
312-
return jitGetExceptionTableFromPC(walkState.walkThread, walkState.pc);
311+
return jitGetExceptionTableFromPC(walkState.javaVM, walkState.pc);
313312
}
314313

315314
J9JITDecompilationInfoPointer stack;
316-
J9JITExceptionTablePointer result = jitGetExceptionTableFromPC(walkState.walkThread, walkState.pc);
315+
J9JITExceptionTablePointer result = jitGetExceptionTableFromPC(walkState.javaVM, walkState.pc);
317316

318317
walkState.decompilationRecord = J9JITDecompilationInfoPointer.NULL;
319318
if (result.notNull()) return result;
@@ -333,7 +332,7 @@ private J9JITExceptionTablePointer jitGetExceptionTable(
333332
}
334333
walkState.decompilationRecord = walkState.decompilationStack;
335334
walkState.decompilationStack = walkState.decompilationStack.next();
336-
return jitGetExceptionTableFromPC(walkState.walkThread,walkState.pc);
335+
return jitGetExceptionTableFromPC(walkState.javaVM, walkState.pc);
337336
}
338337

339338
stack = walkState.decompilationStack;
@@ -348,9 +347,9 @@ private J9JITExceptionTablePointer jitGetExceptionTable(
348347
}
349348

350349
public J9JITExceptionTablePointer jitGetExceptionTableFromPC(
351-
J9VMThreadPointer walkThread, U8Pointer pc) throws CorruptDataException
350+
J9JavaVMPointer javaVM, U8Pointer pc) throws CorruptDataException
352351
{
353-
J9JITConfigPointer jitConfig = walkThread.javaVM().jitConfig();
352+
J9JITConfigPointer jitConfig = javaVM.jitConfig();
354353

355354
if (jitConfig.isNull()) {
356355
return J9JITExceptionTablePointer.NULL;
@@ -419,7 +418,7 @@ private void jitWalkResolveMethodFrame(WalkState walkState) throws CorruptDataEx
419418
ramMethod = J9MethodPointer.cast(iTableOffset).untag(J9_ITABLE_OFFSET_TAG_BITS);
420419
} else if (0 != (iTableOffset & J9_ITABLE_OFFSET_VIRTUAL)) {
421420
long vTableOffset = iTableOffset & ~J9_ITABLE_OFFSET_TAG_BITS;
422-
J9JavaVMPointer vm = walkState.walkThread.javaVM();
421+
J9JavaVMPointer vm = walkState.javaVM;
423422
// C code uses Object from the VM constant pool, but that's not easily
424423
// accessible to DDR. Any class will do.
425424
J9ClassPointer clazz = vm.booleanArrayClass();
@@ -646,7 +645,7 @@ private char jitNextSigChar(String signatureString) throws CorruptDataException
646645

647646
private U64Pointer jitFPRParmAddress(WalkState walkState, UDATA fpParmNumber) throws CorruptDataException
648647
{
649-
U64Pointer base = U64Pointer.cast(walkState.walkedEntryLocalStorage.jitFPRegisterStorageBase());
648+
U64Pointer base = U64Pointer.cast(walkState.jitFPRegisterStorageBase);
650649

651650
if (J9BuildFlags.arch_s390) {
652651
/* 390 uses FPR0/2/4/6 for arguments, so double fpParmNumber to get the right register */
@@ -664,7 +663,7 @@ private U64Pointer jitFPRParmAddress(WalkState walkState, UDATA fpParmNumber) th
664663
* save slots for JIT FPRs, so if vector registers are enabled, the save location for a
665664
* JIT FPR is (base + (16 * 64) + (128 * FPRNumber)), or (base + (64 * (16 + (2 * FPRNumber)))).
666665
*/
667-
if (0 != (walkState.walkThread.javaVM().extendedRuntimeFlags().longValue() & J9_EXTENDED_RUNTIME_USE_VECTOR_REGISTERS)) {
666+
if (0 != (walkState.javaVM.extendedRuntimeFlags().longValue() & J9_EXTENDED_RUNTIME_USE_VECTOR_REGISTERS)) {
668667
fpParmNumber = fpParmNumber.add(fpParmNumber).add(16);
669668
}
670669
}
@@ -983,7 +982,7 @@ private FrameCallbackResult walkTransitionFrame(WalkState walkState) throws Corr
983982
private void jitAddSpilledRegistersForResolve(WalkState walkState) throws CorruptDataException
984983
{
985984
try {
986-
UDATAPointer slotCursor = walkState.walkedEntryLocalStorage.jitGlobalStorageBase();
985+
UDATAPointer slotCursor = walkState.jitGlobalStorageBase;
987986
int mapCursor = 0;
988987
int i;
989988

@@ -1000,7 +999,7 @@ private void jitAddSpilledRegistersForResolve(WalkState walkState) throws Corrup
1000999

10011000
private void jitAddSpilledRegistersForINL(WalkState walkState) throws CorruptDataException
10021001
{
1003-
UDATAPointer slotCursor = walkState.walkedEntryLocalStorage.jitGlobalStorageBase();
1002+
UDATAPointer slotCursor = walkState.jitGlobalStorageBase;
10041003
int i;
10051004

10061005
for (i = 0; i < J9SW_JIT_CALLEE_PRESERVED_SIZE; ++i) {
@@ -1079,7 +1078,7 @@ private void jitWalkFrame(WalkState walkState, boolean walkLocals, VoidPointer s
10791078
WALK_METHOD_CLASS(walkState);
10801079

10811080
if (stackMap.isNull()) {
1082-
stackMap = getStackMapFromJitPC(walkState.walkThread.javaVM(), walkState.jitInfo, UDATA.cast(walkState.pc));
1081+
stackMap = getStackMapFromJitPC(walkState.javaVM, walkState.jitInfo, UDATA.cast(walkState.pc));
10831082
if (stackMap.isNull()) {
10841083
throw new AddressedCorruptDataException(walkState.jitInfo.getAddress(),"Unable to locate JIT stack map");
10851084
}
@@ -1095,7 +1094,7 @@ private void jitWalkFrame(WalkState walkState, boolean walkLocals, VoidPointer s
10951094
mapBytesRemaining = new UDATA(getJitNumberOfMapBytes(gcStackAtlas));
10961095

10971096
jitDescriptionCursor = getJitStackSlots(walkState.jitInfo, stackMap);
1098-
stackAllocMapCursor = U8Pointer.cast(getStackAllocMapFromJitPC(walkState.walkThread.javaVM(), walkState.jitInfo, UDATA.cast(walkState.pc), stackMap));
1097+
stackAllocMapCursor = U8Pointer.cast(getStackAllocMapFromJitPC(walkState.javaVM, walkState.jitInfo, UDATA.cast(walkState.pc), stackMap));
10991098
stackAllocMapBits = new U8(0);
11001099

11011100
walkState.slotType = (int)J9_STACKWALK_SLOT_TYPE_METHOD_LOCAL;
@@ -1217,7 +1216,7 @@ stack frame (once for parms and once for autos).
12171216
swPrintf(walkState, 4, "\t\t\tF-Slot[{0}] = {1}", slot.getHexAddress(), slot.at(0).getHexAddress());
12181217

12191218
if (walkState.callBacks != null) {
1220-
walkState.callBacks.fieldSlotWalkFunction(walkState.walkThread, walkState, slot, VoidPointer.cast(slot));
1219+
walkState.callBacks.fieldSlotWalkFunction(walkState, slot, VoidPointer.cast(slot));
12211220
}
12221221

12231222
}
@@ -1278,7 +1277,7 @@ private void jitWalkRegisterMap(WalkState walkState, VoidPointer stackMap, J9JIT
12781277
swPrintf(walkState, 4, "\t\tJIT-RegisterMap-O-Slot[{0}] = {1} ({2})",
12791278
targetObject.getHexAddress(),
12801279
oldObject.getHexAddress(), jitRegisterNames[mapCursor]);
1281-
walkState.callBacks.objectSlotWalkFunction(walkState.walkThread, walkState, targetObject, VoidPointer.cast(targetObject));
1280+
walkState.callBacks.objectSlotWalkFunction(walkState, targetObject, VoidPointer.cast(targetObject));
12821281

12831282
newObject = targetObject.isNull() ? J9ObjectPointer.NULL : J9ObjectPointer.cast(targetObject.at(0));
12841283

debugtools/DDR_VM/src/com/ibm/j9ddr/vm29/j9/stackwalker/MethodMetaData.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1234,7 +1234,7 @@ that does the stack check failure check (can result in GC). Avoid
12341234
oldPinningArrayAddress.getHexAddress(),
12351235
walkState.bp.getHexAddress(),
12361236
offsetOfFirstInternalPtr);
1237-
walkState.callBacks.objectSlotWalkFunction(walkState.walkThread, walkState, currPinningArrayCursor, VoidPointer.cast(currPinningArrayCursor));
1237+
walkState.callBacks.objectSlotWalkFunction(walkState, currPinningArrayCursor, VoidPointer.cast(currPinningArrayCursor));
12381238
newPinningArrayAddress = J9ObjectPointer.cast( currPinningArrayCursor.at(0) );
12391239
displacement = new IDATA( UDATA.cast(newPinningArrayAddress).sub(UDATA.cast(oldPinningArrayAddress)));
12401240
walkState.slotIndex++;

0 commit comments

Comments
 (0)