Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/codert_vm/jswalk.c
5986 views
1
/*******************************************************************************
2
* Copyright (c) 1991, 2022 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "j9.h"
24
#ifdef J9VM_INTERP_STACKWALK_TRACING
25
#define walkFrame walkFrameVerbose
26
#define jitGetOwnedObjectMonitors jitGetOwnedObjectMonitorsVerbose
27
#define walkBytecodeFrameSlots walkBytecodeFrameSlotsVerbose
28
#endif
29
#include "j9protos.h"
30
#include "MethodMetaData.h"
31
#include "jitprotos.h"
32
#include "stackwalk.h"
33
#include "rommeth.h"
34
#include "j9cp.h"
35
#include "jitregmap.h"
36
#include "j9codertnls.h"
37
#include "HeapIteratorAPI.h"
38
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
39
#include "../vm/linearswalk.h"
40
#include "ut_j9vrb.h"
41
#else
42
#include "ut_j9codertvm.h"
43
#endif
44
45
#define J9JIT_ARTIFACT_SEARCH_CACHE_ENABLE
46
47
#ifndef J9VM_INTERP_STACKWALK_TRACING
48
#define walkFrame (walkState->walkThread->javaVM->walkFrame)
49
#define walkBytecodeFrameSlots (walkState->walkThread->javaVM->internalVMFunctions->walkBytecodeFrameSlots)
50
#endif
51
52
/* Use the JIT's view of the # of slots to get the argCount rather than asking
53
* the J9ROMMethod->argCount. This is essential as JSR 292 thunk_archetype methods
54
* serve only as templates for the generated code and will have an INCORRECT argCount
55
*/
56
#define SET_A0_CP_METHOD(walkState) \
57
(walkState)->arg0EA = (UDATA *) (((U_8 *) ((walkState)->bp + (walkState)->jitInfo->slots)) + sizeof(J9JITFrame) - sizeof(UDATA)), \
58
(walkState)->method = (walkState)->jitInfo->ramMethod, \
59
(walkState)->constantPool = (walkState)->jitInfo->constantPool, \
60
(walkState)->argCount = (walkState)->jitInfo->slots
61
62
#ifdef J9VM_JIT_FULL_SPEED_DEBUG
63
#define UPDATE_PC_FROM(walkState, pcExpression) \
64
(walkState)->pc = MASK_PC(*((walkState)->pcAddress = (U_8 **) &(pcExpression))), \
65
(walkState)->decompilationRecord = NULL
66
#else
67
#define UPDATE_PC_FROM(walkState, pcExpression) (walkState)->pc = MASK_PC((U_8 *) (pcExpression))
68
#define jitGetExceptionTable(walkState) jitGetExceptionTableFromPC((walkState)->walkThread, (UDATA) (walkState)->pc)
69
#endif
70
71
#ifdef J9VM_JIT_FULL_SPEED_DEBUG
72
#define COMMON_UNWIND_TO_NEXT_FRAME(walkState) \
73
(walkState)->resolveFrameFlags = 0, \
74
UPDATE_PC_FROM(walkState, ((J9JITFrame *) ((walkState)->bp))->returnPC)
75
#else
76
#define COMMON_UNWIND_TO_NEXT_FRAME(walkState) \
77
UPDATE_PC_FROM(walkState, ((J9JITFrame *) ((walkState)->bp))->returnPC)
78
#endif
79
80
#ifdef J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP
81
82
#define UNWIND_TO_NEXT_FRAME(walkState) \
83
(walkState)->unwindSP = ((UDATA *) (((J9JITFrame *) ((walkState)->bp)) + 1)) + (walkState)->argCount, \
84
COMMON_UNWIND_TO_NEXT_FRAME(walkState)
85
86
#else
87
88
#define UNWIND_TO_NEXT_FRAME(walkState) \
89
(walkState)->unwindSP = ((UDATA *) (((J9JITFrame *) ((walkState)->bp)) + 1)), /* arguments are passed in register, argument area lives in caller frame */ \
90
COMMON_UNWIND_TO_NEXT_FRAME(walkState)
91
92
#endif
93
94
#ifdef J9VM_INTERP_STACKWALK_TRACING
95
#define CLEAR_LOCAL_REGISTER_MAP_ENTRIES(walkState) \
96
{ \
97
UDATA clearRegNum; \
98
for (clearRegNum = 0; clearRegNum < (J9SW_POTENTIAL_SAVED_REGISTERS - J9SW_JIT_CALLEE_PRESERVED_SIZE); ++clearRegNum) { \
99
((UDATA **) &((walkState)->registerEAs))[jitCalleeDestroyedRegisterList[clearRegNum]] = NULL; \
100
} \
101
}
102
#else
103
#define CLEAR_LOCAL_REGISTER_MAP_ENTRIES(walkState)
104
#endif
105
106
#if (defined(J9VM_INTERP_STACKWALK_TRACING)) /* priv. proto (autogen) */
107
108
static void jitPrintFrameType(J9StackWalkState * walkState, char * frameType);
109
#endif /* J9VM_INTERP_STACKWALK_TRACING (autogen) */
110
111
112
113
static void walkJITFrameSlots(J9StackWalkState * walkState, U_8 * jitDescriptionBits, U_8 * stackAllocMapBits, U_8 ** jitDescriptionCursor, U_8 ** stackAllocMapCursor, UDATA * jitBitsRemaining, UDATA * mapBytesRemaining, UDATA * scanCursor, UDATA slotsRemaining, void *stackMap, J9JITStackAtlas *gcStackAtlas, char * slotDescription);
114
115
static void jitDropToCurrentFrame(J9StackWalkState * walkState);
116
117
static UDATA walkTransitionFrame(J9StackWalkState *walkState);
118
static void jitAddSpilledRegistersForJ2I(J9StackWalkState * walkState);
119
static void jitAddSpilledRegistersForINL(J9StackWalkState * walkState);
120
static UDATA jitNextUTFChar(U_8 ** pUtfData);
121
#if (defined(J9VM_JIT_FULL_SPEED_DEBUG)) /* priv. proto (autogen) */
122
123
static J9JITExceptionTable * jitGetExceptionTable(J9StackWalkState * walkState);
124
#endif /* J9VM_JIT_FULL_SPEED_DEBUG (autogen) */
125
126
127
128
static void jitAddSpilledRegistersForResolve(J9StackWalkState * walkState);
129
static void jitWalkFrame(J9StackWalkState *walkState, UDATA walkLocals, void *stackMap);
130
static void jitWalkResolveMethodFrame(J9StackWalkState *walkState);
131
static void jitWalkRegisterMap(J9StackWalkState *walkState, void *stackMap, J9JITStackAtlas *gcStackAtlas);
132
static UDATA jitNextSigChar(U_8 ** utfData);
133
static void jitWalkStackAllocatedObject(J9StackWalkState * walkState, j9object_t object);
134
static jvmtiIterationControl stackAllocatedObjectSlotWalkFunction(J9JavaVM *javaVM, J9MM_IterateObjectDescriptor *objectDesc, J9MM_IterateObjectRefDescriptor *refDesc, void *userData);
135
136
static UDATA countOwnedObjectMonitors(J9StackWalkState *walkState);
137
static UDATA walkLiveMonitorSlots(J9StackWalkState *walkState, J9JITStackAtlas *gcStackAtlas,
138
U_8 *liveMonitorMap, U_8 *monitorMask, U_16 numberOfMapBits);
139
static void countLiveMonitorSlots(J9StackWalkState *walkState, J9JITStackAtlas *gcStackAtlas, U_8 *liveMonitorMap, U_8 *monitorMask, U_16 numberOfMapBits);
140
static j9object_t *getSlotAddress(J9StackWalkState *walkState, J9JITStackAtlas *gcStackAtlas, U_16 slot);
141
static void jitWalkOSRBuffer(J9StackWalkState *walkState, J9OSRBuffer *osrBuffer);
142
143
UDATA jitWalkStackFrames(J9StackWalkState *walkState)
144
{
145
UDATA rc;
146
UDATA * returnSP;
147
U_8 * failedPC;
148
UDATA i;
149
U_8 ** returnTable;
150
void (*savedDropToCurrentFrame)(struct J9StackWalkState * walkState) ;
151
152
if (J9_ARE_ANY_BITS_SET(walkState->flags, J9_STACKWALK_RESUME)) {
153
walkState->flags &= ~J9_STACKWALK_RESUME;
154
if (0 != walkState->inlineDepth) {
155
goto resumeWalkInline;
156
}
157
goto resumeNonInline;
158
}
159
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
160
memset(&walkState->registerEAs, 0, sizeof(walkState->registerEAs));
161
}
162
if ((rc = walkTransitionFrame(walkState)) != J9_STACKWALK_KEEP_ITERATING) {
163
return rc;
164
}
165
166
walkState->frameFlags = 0;
167
savedDropToCurrentFrame = walkState->dropToCurrentFrame;
168
walkState->dropToCurrentFrame = jitDropToCurrentFrame;
169
170
while ((walkState->jitInfo = jitGetExceptionTable(walkState)) != NULL) {
171
walkState->stackMap = NULL;
172
walkState->inlineMap = NULL;
173
walkState->bp = walkState->unwindSP + getJitTotalFrameSize(walkState->jitInfo);
174
175
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
176
lswRecord(walkState, LSW_TYPE_JIT_BP, walkState->bp);
177
#endif
178
179
/* Point walkState->sp to the last outgoing argument */
180
181
#ifdef J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP
182
walkState->sp = walkState->unwindSP - walkState->argCount;
183
#else
184
walkState->sp = walkState->unwindSP;
185
#endif
186
walkState->outgoingArgCount = walkState->argCount;
187
188
if ((!(walkState->flags & J9_STACKWALK_SKIP_INLINES)) && getJitInlinedCallInfo(walkState->jitInfo)) {
189
jitGetMapsFromPC(walkState->currentThread, walkState->javaVM, walkState->jitInfo, (UDATA) walkState->pc, &(walkState->stackMap), &(walkState->inlineMap));
190
if (NULL != walkState->inlineMap) {
191
walkState->inlinedCallSite = getFirstInlinedCallSite(walkState->jitInfo, walkState->inlineMap);
192
193
if (NULL != walkState->inlinedCallSite) {
194
walkState->inlineDepth = getJitInlineDepthFromCallSite(walkState->jitInfo, walkState->inlinedCallSite);
195
walkState->arg0EA = NULL;
196
do {
197
J9Method * inlinedMethod = (J9Method *)getInlinedMethod(walkState->inlinedCallSite);
198
199
walkState->method = inlinedMethod;
200
walkState->constantPool = UNTAGGED_METHOD_CP(walkState->method);
201
walkState->bytecodePCOffset = (IDATA) getCurrentByteCodeIndexAndIsSameReceiver(walkState->jitInfo, walkState->inlineMap, walkState->inlinedCallSite, NULL);
202
#ifdef J9VM_INTERP_STACKWALK_TRACING
203
jitPrintFrameType(walkState, "JIT inline");
204
#endif
205
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
206
lswFrameNew(walkState->walkThread->javaVM, walkState, LSW_FRAME_TYPE_JIT_INLINE);
207
lswRecord(walkState, LSW_TYPE_UNWIND_SP, walkState->unwindSP);
208
lswRecord(walkState, LSW_TYPE_METHOD, walkState->method);
209
lswRecord(walkState, LSW_TYPE_JIT_FRAME_INFO, walkState);
210
#endif
211
if ((rc = walkFrame(walkState)) != J9_STACKWALK_KEEP_ITERATING) {
212
return rc;
213
}
214
resumeWalkInline:
215
walkState->inlinedCallSite = getNextInlinedCallSite(walkState->jitInfo, walkState->inlinedCallSite);
216
} while(--walkState->inlineDepth != 0);
217
}
218
}
219
} else if (walkState->flags & J9_STACKWALK_RECORD_BYTECODE_PC_OFFSET) {
220
jitGetMapsFromPC(walkState->currentThread, walkState->javaVM, walkState->jitInfo, (UDATA) walkState->pc, &(walkState->stackMap), &(walkState->inlineMap));
221
}
222
223
SET_A0_CP_METHOD(walkState);
224
if (walkState->flags & J9_STACKWALK_RECORD_BYTECODE_PC_OFFSET) {
225
walkState->bytecodePCOffset = (NULL == walkState->inlineMap) ? (IDATA) -1 : (IDATA) getCurrentByteCodeIndexAndIsSameReceiver(walkState->jitInfo, walkState->inlineMap, NULL, NULL);
226
}
227
228
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
229
lswFrameNew(walkState->walkThread->javaVM, walkState, LSW_FRAME_TYPE_JIT);
230
lswRecord(walkState, LSW_TYPE_UNWIND_SP, walkState->unwindSP);
231
lswRecord(walkState, LSW_TYPE_METHOD, walkState->method);
232
#endif
233
234
#ifdef J9VM_INTERP_STACKWALK_TRACING
235
jitPrintFrameType(walkState, "JIT");
236
#endif
237
238
if (walkState->flags & J9_STACKWALK_ITERATE_METHOD_CLASS_SLOTS) {
239
markClassesInInlineRanges(walkState->jitInfo, walkState);
240
}
241
242
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
243
jitWalkFrame(walkState, TRUE, walkState->stackMap);
244
}
245
246
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
247
lswRecord(walkState, LSW_TYPE_JIT_FRAME_INFO, walkState);
248
#endif
249
if ((rc = walkFrame(walkState)) != J9_STACKWALK_KEEP_ITERATING) {
250
return rc;
251
}
252
resumeNonInline:
253
254
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
255
CLEAR_LOCAL_REGISTER_MAP_ENTRIES(walkState);
256
jitAddSpilledRegisters(walkState, walkState->stackMap);
257
}
258
259
UNWIND_TO_NEXT_FRAME(walkState);
260
261
}
262
263
/* JIT pair with no mapping indicates a bytecoded frame */
264
265
failedPC = walkState->pc;
266
returnTable = (U_8 **) walkState->walkThread->javaVM->jitConfig->i2jReturnTable;
267
if (returnTable) {
268
for (i = 0; i < J9SW_JIT_RETURN_TABLE_SIZE; ++i) {
269
if (failedPC == returnTable[i]) {
270
goto i2jTransition;
271
}
272
}
273
/* Only report errors if the stack walk caller has allowed it.
274
* If errors are not being reported, the walk will continue at the last
275
* interpreter to JIT transition (skipping an unknown number of JIT frames.
276
* This is safe to do as the I2J values were saved by the interpreter at
277
* the transition point, and can be assumed to be valid.
278
*/
279
if (J9_ARE_NO_BITS_SET(walkState->flags, J9_STACKWALK_NO_ERROR_REPORT)) {
280
/* Avoid recursive error situations */
281
if (0 == (walkState->walkThread->privateFlags & J9_PRIVATE_FLAGS_STACK_CORRUPT)) {
282
walkState->walkThread->privateFlags |= J9_PRIVATE_FLAGS_STACK_CORRUPT;
283
walkState->walkThread->javaVM->internalVMFunctions->invalidJITReturnAddress(walkState);
284
}
285
}
286
i2jTransition: ;
287
}
288
289
UPDATE_PC_FROM(walkState, walkState->i2jState->pc);
290
walkState->literals = walkState->i2jState->literals;
291
walkState->arg0EA = (UDATA *) walkState->i2jState->a0;
292
returnSP = walkState->i2jState->returnSP;
293
walkState->previousFrameFlags = 0;
294
walkState->walkSP = (UDATA *) UNTAG2(returnSP, UDATA *);
295
#ifdef J9VM_INTERP_STACKWALK_TRACING
296
swPrintf(walkState, 2, "I2J values: PC = %p, A0 = %p, walkSP = %p, literals = %p, JIT PC = %p, pcAddress = %p, decomp = %p\n", walkState->pc,
297
walkState->arg0EA, walkState->walkSP, walkState->literals, failedPC,
298
#ifdef J9VM_JIT_FULL_SPEED_DEBUG
299
walkState->pcAddress, walkState->decompilationStack
300
#else
301
0, 0
302
#endif
303
);
304
#endif
305
306
walkState->dropToCurrentFrame = savedDropToCurrentFrame;
307
return J9_STACKWALK_KEEP_ITERATING;
308
}
309
310
static UDATA walkTransitionFrame(J9StackWalkState *walkState)
311
{
312
313
if (walkState->frameFlags & J9_STACK_FLAGS_JIT_RESOLVE_FRAME) {
314
J9SFJITResolveFrame * resolveFrame = (J9SFJITResolveFrame *) ((U_8 *) walkState->bp - sizeof(J9SFJITResolveFrame) + sizeof(UDATA));
315
UDATA resolveFrameType = walkState->frameFlags & J9_STACK_FLAGS_JIT_FRAME_SUB_TYPE_MASK;
316
317
#ifdef J9VM_INTERP_STACKWALK_TRACING
318
switch (resolveFrameType) {
319
case J9_STACK_FLAGS_JIT_GENERIC_RESOLVE: swPrintf(walkState, 3, "\tGeneric resolve\n"); break;
320
case J9_STACK_FLAGS_JIT_STACK_OVERFLOW_RESOLVE_FRAME: swPrintf(walkState, 3, "\tStack overflow resolve\n"); break;
321
case J9_STACK_FLAGS_JIT_DATA_RESOLVE: swPrintf(walkState, 3, "\tData resolve\n"); break;
322
case J9_STACK_FLAGS_JIT_RUNTIME_HELPER_RESOLVE: swPrintf(walkState, 3, "\tRuntime helper resolve\n"); break;
323
case J9_STACK_FLAGS_JIT_LOOKUP_RESOLVE: swPrintf(walkState, 3, "\tInterface lookup resolve\n"); break;
324
case J9_STACK_FLAGS_JIT_INTERFACE_METHOD_RESOLVE: swPrintf(walkState, 3, "\tInterface method resolve\n"); break;
325
case J9_STACK_FLAGS_JIT_SPECIAL_METHOD_RESOLVE: swPrintf(walkState, 3, "\tSpecial method resolve\n"); break;
326
case J9_STACK_FLAGS_JIT_STATIC_METHOD_RESOLVE: swPrintf(walkState, 3, "\tStatic method resolve\n"); break;
327
case J9_STACK_FLAGS_JIT_VIRTUAL_METHOD_RESOLVE: swPrintf(walkState, 3, "\tVirtual method resolve\n"); break;
328
case J9_STACK_FLAGS_JIT_RECOMPILATION_RESOLVE: swPrintf(walkState, 3, "\tRecompilation resolve\n"); break;
329
case J9_STACK_FLAGS_JIT_MONITOR_ENTER_RESOLVE: swPrintf(walkState, 3, "\tMonitor enter resolve\n"); break;
330
case J9_STACK_FLAGS_JIT_METHOD_MONITOR_ENTER_RESOLVE: swPrintf(walkState, 3, "\tMethod monitor enter resolve\n"); break;
331
case J9_STACK_FLAGS_JIT_FAILED_METHOD_MONITOR_ENTER_RESOLVE: swPrintf(walkState, 3, "\tFailed method monitor enter resolve\n"); break;
332
case J9_STACK_FLAGS_JIT_ALLOCATION_RESOLVE: swPrintf(walkState, 3, "\tAllocation resolve\n"); break;
333
case J9_STACK_FLAGS_JIT_BEFORE_ANEWARRAY_RESOLVE: swPrintf(walkState, 3, "\tBefore anewarray resolve\n"); break;
334
case J9_STACK_FLAGS_JIT_BEFORE_MULTIANEWARRAY_RESOLVE: swPrintf(walkState, 3, "\tBefore multianewarray resolve\n"); break;
335
case J9_STACK_FLAGS_JIT_INDUCE_OSR_RESOLVE: swPrintf(walkState, 3, "\tInduce OSR resolve\n"); break;
336
case J9_STACK_FLAGS_JIT_EXCEPTION_CATCH_RESOLVE: swPrintf(walkState, 3, "\tException catch resolve\n"); break;
337
default: swPrintf(walkState, 3, "\tUnknown resolve type %p\n", resolveFrameType);
338
}
339
#endif
340
341
UPDATE_PC_FROM(walkState, resolveFrame->returnAddress);
342
if (J9_STACK_FLAGS_JIT_EXCEPTION_CATCH_RESOLVE == resolveFrameType) {
343
#ifdef J9VM_INTERP_STACKWALK_TRACING
344
swPrintf(walkState, 3, "\tAt exception catch - incrementing PC to make map fetching work\n");
345
#endif
346
walkState->pc += 1;
347
}
348
walkState->resolveFrameFlags = walkState->frameFlags;
349
walkState->unwindSP = (UDATA *) UNTAG2(resolveFrame->taggedRegularReturnSP, UDATA *);
350
#ifdef J9VM_INTERP_STACKWALK_TRACING
351
swPrintf(walkState, 3, "\tunwindSP initialized to %p\n", walkState->unwindSP);
352
#endif
353
#ifdef J9SW_JIT_HELPERS_PASS_PARAMETERS_ON_STACK
354
walkState->unwindSP += resolveFrame->parmCount;
355
#ifdef J9VM_INTERP_STACKWALK_TRACING
356
swPrintf(walkState, 3, "\tAdding %d slots of pushed resolve parameters\n", resolveFrame->parmCount);
357
#endif
358
#endif
359
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
360
lswRecord(walkState, LSW_TYPE_RESOLVE_FRAME_TYPE, (void*)resolveFrameType);
361
#endif
362
363
if (resolveFrameType == J9_STACK_FLAGS_JIT_DATA_RESOLVE) {
364
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
365
jitAddSpilledRegistersForDataResolve(walkState);
366
}
367
368
walkState->unwindSP += getJitDataResolvePushes();
369
#ifdef J9VM_INTERP_STACKWALK_TRACING
370
swPrintf(walkState, 3, "\tData resolve added %d slots\n", getJitDataResolvePushes());
371
#endif
372
} else {
373
UDATA inMethodPrologue = TRUE;
374
375
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
376
jitAddSpilledRegistersForResolve(walkState);
377
}
378
379
switch(resolveFrameType) {
380
case J9_STACK_FLAGS_JIT_VIRTUAL_METHOD_RESOLVE:
381
case J9_STACK_FLAGS_JIT_INTERFACE_METHOD_RESOLVE:
382
case J9_STACK_FLAGS_JIT_SPECIAL_METHOD_RESOLVE:
383
case J9_STACK_FLAGS_JIT_STATIC_METHOD_RESOLVE:
384
case J9_STACK_FLAGS_JIT_LOOKUP_RESOLVE:
385
case J9_STACK_FLAGS_JIT_RECOMPILATION_RESOLVE:
386
case J9_STACK_FLAGS_JIT_INDUCE_OSR_RESOLVE:
387
jitWalkResolveMethodFrame(walkState);
388
break;
389
case J9_STACK_FLAGS_JIT_FAILED_METHOD_MONITOR_ENTER_RESOLVE:
390
inMethodPrologue = FALSE;
391
/* Intentional fall-through */
392
case J9_STACK_FLAGS_JIT_STACK_OVERFLOW_RESOLVE_FRAME:
393
walkState->jitInfo = jitGetExceptionTable(walkState);
394
walkState->bp = walkState->unwindSP;
395
if (!inMethodPrologue) {
396
walkState->bp += getJitTotalFrameSize(walkState->jitInfo);
397
}
398
walkState->outgoingArgCount = 0;
399
SET_A0_CP_METHOD(walkState);
400
401
#ifdef J9VM_INTERP_STACKWALK_TRACING
402
jitPrintFrameType(walkState, "JIT (hidden)");
403
#endif
404
405
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
406
jitWalkFrame(walkState, !inMethodPrologue, NULL);
407
}
408
409
if (walkState->flags & J9_STACKWALK_ITERATE_HIDDEN_JIT_FRAMES) {
410
UDATA rc;
411
412
walkState->frameFlags = 0;
413
if ((rc = walkFrame(walkState)) != J9_STACKWALK_KEEP_ITERATING) {
414
return rc;
415
}
416
}
417
418
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
419
CLEAR_LOCAL_REGISTER_MAP_ENTRIES(walkState);
420
}
421
422
UNWIND_TO_NEXT_FRAME(walkState);
423
}
424
}
425
} else if (walkState->frameFlags & J9_STACK_FLAGS_JIT_JNI_CALL_OUT_FRAME) {
426
J9SFNativeMethodFrame * nativeMethodFrame = (J9SFNativeMethodFrame *) ((U_8 *) walkState->bp - sizeof(J9SFNativeMethodFrame) + sizeof(UDATA));
427
428
UPDATE_PC_FROM(walkState, nativeMethodFrame->savedCP);
429
#ifdef J9VM_INTERP_GROWABLE_STACKS
430
if ((walkState->frameFlags & J9_SSF_JNI_REFS_REDIRECTED) && (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS)) {
431
UDATA * currentBP = walkState->bp;
432
433
walkState->jitInfo = jitGetExceptionTable(walkState);
434
walkState->unwindSP = ((UDATA *) nativeMethodFrame->savedPC) + 1;
435
walkState->bp = walkState->unwindSP + getJitTotalFrameSize(walkState->jitInfo);
436
SET_A0_CP_METHOD(walkState);
437
#ifdef J9VM_INTERP_STACKWALK_TRACING
438
jitPrintFrameType(walkState, "JIT (redirected JNI refs)");
439
#endif
440
jitWalkFrame(walkState, TRUE, NULL);
441
walkState->bp = currentBP;
442
}
443
#endif
444
walkState->unwindSP = walkState->bp + 1;
445
} else if (walkState->frameFlags & J9_STACK_FLAGS_JIT_CALL_IN_FRAME) {
446
UDATA callInFrameType = walkState->frameFlags & J9_STACK_FLAGS_JIT_FRAME_SUB_TYPE_MASK;
447
if ((callInFrameType & J9_STACK_FLAGS_JIT_CALL_IN_TYPE_J2_I) == J9_STACK_FLAGS_JIT_CALL_IN_TYPE_J2_I) {
448
J9SFJ2IFrame * j2iFrame = (J9SFJ2IFrame *) ((U_8 *) walkState->bp - sizeof(J9SFJ2IFrame) + sizeof(UDATA));
449
450
walkState->i2jState = &(j2iFrame->i2jState);
451
walkState->j2iFrame = j2iFrame->previousJ2iFrame;
452
453
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
454
jitAddSpilledRegistersForJ2I(walkState);
455
}
456
457
walkState->unwindSP = (UDATA *) UNTAG2(j2iFrame->taggedReturnSP, UDATA *);
458
UPDATE_PC_FROM(walkState, j2iFrame->returnAddress);
459
} else {
460
if (J9_ARE_ANY_BITS_SET(walkState->flags, J9_STACKWALK_NO_ERROR_REPORT)) {
461
return J9_STACKWALK_STOP_ITERATING;
462
}
463
/* Choke & Die */
464
#ifndef J9VM_INTERP_STACKWALK_TRACING
465
/* Symbol not visible from verbose */
466
Assert_JSWalk_invalidFrameType();
467
#endif
468
}
469
} else { /* inl */
470
J9SFSpecialFrame * specialFrame = (J9SFSpecialFrame *) ((U_8 *) walkState->bp - sizeof(J9SFSpecialFrame) + sizeof(UDATA));
471
472
if (walkState->flags & J9_STACKWALK_MAINTAIN_REGISTER_MAP) {
473
jitAddSpilledRegistersForINL(walkState);
474
}
475
/* Do not add J9SW_JIT_STACK_SLOTS_USED_BY_CALL as it has been popped from the stack by the call to INL helper */
476
#ifdef J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP
477
walkState->unwindSP = walkState->arg0EA + 1;
478
#else
479
walkState->unwindSP = (UDATA *) UNTAG2(specialFrame->savedA0, UDATA *);
480
#endif
481
UPDATE_PC_FROM(walkState, specialFrame->savedCP);
482
}
483
484
return J9_STACKWALK_KEEP_ITERATING;
485
}
486
487
488
#if (defined(J9VM_INTERP_STACKWALK_TRACING)) /* priv. proto (autogen) */
489
490
static void jitPrintFrameType(J9StackWalkState * walkState, char * frameType)
491
{
492
swPrintf(walkState, 2, "%s frame: bp = %p, pc = %p, unwindSP = %p, cp = %p, arg0EA = %p, jitInfo = %p\n",
493
frameType, walkState->bp, walkState->pc, walkState->unwindSP,
494
walkState->constantPool, walkState->arg0EA, walkState->jitInfo);
495
swPrintMethod(walkState);
496
swPrintf(walkState, 3, "\tBytecode index = %d, inlineDepth = %d, PC offset = %p\n",
497
walkState->bytecodePCOffset, walkState->inlineDepth, walkState->pc - (U_8 *) walkState->method->extra);
498
}
499
#endif /* J9VM_INTERP_STACKWALK_TRACING (autogen) */
500
501
502
static void jitWalkFrame(J9StackWalkState *walkState, UDATA walkLocals, void *stackMap)
503
{
504
J9JITStackAtlas * gcStackAtlas;
505
U_8 * jitDescriptionCursor;
506
U_8 * stackAllocMapCursor;
507
UDATA * objectArgScanCursor;
508
UDATA * objectTempScanCursor;
509
UDATA jitBitsRemaining;
510
U_8 jitDescriptionBits = 0;
511
U_8 stackAllocMapBits = 0;
512
UDATA mapBytesRemaining;
513
U_8 variableInternalPtrSize;
514
UDATA registerMap;
515
J9JITDecompilationInfo *decompilationRecord;
516
517
WALK_METHOD_CLASS(walkState);
518
519
if (stackMap == NULL) {
520
stackMap = getStackMapFromJitPC(walkState->currentThread, walkState->javaVM, walkState->jitInfo, (UDATA) walkState->pc);
521
if (stackMap == NULL) {
522
if (J9_ARE_ANY_BITS_SET(walkState->flags, J9_STACKWALK_NO_ERROR_REPORT)) {
523
return;
524
}
525
PORT_ACCESS_FROM_WALKSTATE(walkState);
526
J9ROMMethod * romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method);
527
J9UTF8 * className = J9ROMCLASS_CLASSNAME(J9_CLASS_FROM_METHOD(walkState->method)->romClass);
528
J9UTF8 * name = J9ROMMETHOD_NAME(romMethod);
529
J9UTF8 * sig = J9ROMMETHOD_SIGNATURE(romMethod);
530
531
j9nls_printf(PORTLIB, J9NLS_ERROR | J9NLS_BEGIN_MULTI_LINE, J9NLS_CODERT_UNABLE_TO_LOCATE_JIT_STACKMAP);
532
j9nls_printf(PORTLIB, J9NLS_ERROR | J9NLS_MULTI_LINE, J9NLS_CODERT_UNABLE_TO_LOCATE_JIT_STACKMAP_METHOD, (U_32) J9UTF8_LENGTH(className), J9UTF8_DATA(className), (U_32) J9UTF8_LENGTH(name), J9UTF8_DATA(name), (U_32) J9UTF8_LENGTH(sig), J9UTF8_DATA(sig), walkState->method);
533
j9nls_printf(PORTLIB, J9NLS_ERROR | J9NLS_END_MULTI_LINE, J9NLS_CODERT_UNABLE_TO_LOCATE_JIT_STACKMAP_PC, walkState->pc, walkState->pc - walkState->jitInfo->startPC, walkState->jitInfo);
534
535
#ifdef J9VM_INTERP_STACKWALK_TRACING
536
Assert_VRB_stackMapNull();
537
#else
538
Assert_Swalk_stackMapNull();
539
#endif
540
}
541
}
542
543
gcStackAtlas = (J9JITStackAtlas *) getJitGCStackAtlas(walkState->jitInfo);
544
545
#ifdef J9VM_INTERP_STACKWALK_TRACING
546
swPrintf(walkState, 2, "\tstackMap=%p, slots=%d parmBaseOffset=%d, parmSlots=%d, localBaseOffset=%d\n",
547
stackMap, walkState->jitInfo->slots, gcStackAtlas->parmBaseOffset, gcStackAtlas->numberOfParmSlots, gcStackAtlas->localBaseOffset);
548
#endif
549
550
objectArgScanCursor = getObjectArgScanCursor(walkState);
551
jitBitsRemaining = 0;
552
mapBytesRemaining = getJitNumberOfMapBytes(gcStackAtlas);
553
554
variableInternalPtrSize = 0;
555
registerMap = getJitRegisterMap(walkState->jitInfo, stackMap);
556
jitDescriptionCursor = getJitStackSlots(walkState->jitInfo, stackMap);
557
stackAllocMapCursor = getStackAllocMapFromJitPC(walkState->currentThread, walkState->jitInfo, (UDATA) walkState->pc, stackMap);
558
559
walkState->slotType = J9_STACKWALK_SLOT_TYPE_METHOD_LOCAL;
560
walkState->slotIndex = 0;
561
562
if (getJitNumberOfParmSlots(gcStackAtlas)) {
563
#ifdef J9VM_INTERP_STACKWALK_TRACING
564
swPrintf(walkState, 4, "\tDescribed JIT args starting at %p for %d slots\n", objectArgScanCursor, gcStackAtlas->numberOfParmSlots);
565
#endif
566
walkJITFrameSlots(walkState, &jitDescriptionBits, &stackAllocMapBits, &jitDescriptionCursor, &stackAllocMapCursor, &jitBitsRemaining, &mapBytesRemaining,
567
objectArgScanCursor, getJitNumberOfParmSlots(gcStackAtlas), stackMap, NULL, ": a");
568
}
569
570
if (walkLocals) {
571
objectTempScanCursor = getObjectTempScanCursor(walkState);
572
573
if (walkState->bp - objectTempScanCursor) {
574
#ifdef J9VM_INTERP_STACKWALK_TRACING
575
swPrintf(walkState, 4, "\tDescribed JIT temps starting at %p for %d slots\n", objectTempScanCursor, walkState->bp - objectTempScanCursor);
576
#endif
577
walkJITFrameSlots(walkState, &jitDescriptionBits, &stackAllocMapBits, &jitDescriptionCursor, &stackAllocMapCursor, &jitBitsRemaining, &mapBytesRemaining,
578
objectTempScanCursor, walkState->bp - objectTempScanCursor, stackMap, gcStackAtlas, ": t");
579
}
580
}
581
582
jitWalkRegisterMap(walkState, stackMap, gcStackAtlas);
583
584
/* If there is an OSR buffer attached to this frame, walk it */
585
586
decompilationRecord = walkState->decompilationRecord;
587
if (NULL != decompilationRecord) {
588
J9OSRBuffer *osrBuffer = &decompilationRecord->osrBuffer;
589
590
if (0 != osrBuffer->numberOfFrames) {
591
jitWalkOSRBuffer(walkState, osrBuffer);
592
}
593
}
594
}
595
596
static void walkJITFrameSlots(J9StackWalkState * walkState, U_8 * jitDescriptionBits, U_8 * stackAllocMapBits, U_8 ** jitDescriptionCursor, U_8 ** stackAllocMapCursor, UDATA * jitBitsRemaining, UDATA * mapBytesRemaining, UDATA * scanCursor, UDATA slotsRemaining, void *stackMap, J9JITStackAtlas *gcStackAtlas, char * slotDescription)
597
{
598
#ifdef J9VM_INTERP_STACKWALK_TRACING
599
char indexedTag[64];
600
#endif
601
602
/* GC stack atlas passed in to this function is NULL when this method
603
is called for parameters in the frame; when this method is called for
604
autos in the frame, the actual stack atlas is passed in. This
605
works because no internal pointers/pinning arrays can be parameters.
606
We must avoid doing internal pointer fixup twice for a
607
given stack frame as this method is called twice for each
608
stack frame (once for parms and once for autos).
609
610
If internal pointer map exists in the atlas it means there are internal pointer
611
regs/autos in this method.
612
*/
613
614
if (gcStackAtlas && getJitInternalPointerMap(gcStackAtlas))
615
{
616
walkJITFrameSlotsForInternalPointers(walkState, jitDescriptionCursor, scanCursor, stackMap, gcStackAtlas);
617
}
618
619
while (slotsRemaining)
620
{
621
if (!*jitBitsRemaining)
622
{
623
if (*mapBytesRemaining)
624
{
625
*jitDescriptionBits = getNextDescriptionBit(jitDescriptionCursor);
626
if (*stackAllocMapCursor != NULL)
627
{
628
*stackAllocMapBits = getNextDescriptionBit(stackAllocMapCursor);
629
}
630
--*mapBytesRemaining;
631
}
632
else
633
{
634
*jitDescriptionBits = 0;
635
}
636
*jitBitsRemaining = 8;
637
}
638
639
if (*jitDescriptionBits & 1)
640
{
641
#ifdef J9VM_INTERP_STACKWALK_TRACING
642
PORT_ACCESS_FROM_WALKSTATE(walkState);
643
j9str_printf(PORTLIB, indexedTag, 64, "O-Slot: %s%d", slotDescription, slotsRemaining - 1);
644
WALK_NAMED_O_SLOT((j9object_t*) scanCursor, indexedTag);
645
#else
646
WALK_O_SLOT((j9object_t*) scanCursor);
647
#endif
648
}
649
else if (*stackAllocMapBits & 1)
650
{
651
jitWalkStackAllocatedObject(walkState, (j9object_t)scanCursor);
652
}
653
else
654
{
655
#ifdef J9VM_INTERP_STACKWALK_TRACING
656
PORT_ACCESS_FROM_WALKSTATE(walkState);
657
j9str_printf(PORTLIB, indexedTag, 64, "I-Slot: %s%d", slotDescription, slotsRemaining - 1);
658
WALK_NAMED_I_SLOT(scanCursor, indexedTag);
659
#else
660
WALK_I_SLOT(scanCursor);
661
#endif
662
663
if (walkState->flags & J9_STACKWALK_CHECK_I_SLOTS_FOR_OBJECTS) {
664
/* check for verbose output */
665
666
#ifdef J9VM_INTERP_STACKWALK_TRACING
667
if (walkState->userData1 == (void*) 8) {
668
swPrintf(walkState, 3, "SCANNING I SLOT 0x%x contains: 0x%x, object is in heap 0x%x (0 is heap pointer) \n", scanCursor, *scanCursor, walkState->walkThread->javaVM->memoryManagerFunctions->j9gc_ext_check_is_valid_heap_object(walkState->walkThread->javaVM, *(j9object_t *)scanCursor, 0));
669
}
670
#endif
671
if (walkState->walkThread->javaVM->memoryManagerFunctions->j9gc_ext_check_is_valid_heap_object(walkState->walkThread->javaVM, *(j9object_t *)scanCursor, 0) == 0 ) {
672
#ifdef J9VM_INTERP_STACKWALK_TRACING
673
if ((walkState->userData1 == (void*)1) || (walkState->userData1 == (void*)8) ) {
674
swPrintf(walkState, 3, "Possible Class Address: 0x%x at search PC 0x%x \n",*((j9object_t *)(*scanCursor)), walkState->pc );
675
}
676
if ((walkState->userData1 == (void*)1) || (walkState->userData1 == (void*)8) ) {
677
swPrintf(walkState, 3, "Uncollected ref SLOT 0x%x pointing at object ref 0x%x for stackmap at seachPC 0x%x: \n", scanCursor, *scanCursor, walkState->pc);
678
}
679
#endif
680
if (walkState->userData2 == (void*)4) {
681
walkState->walkThread->javaVM->memoryManagerFunctions->j9gc_modron_global_collect(walkState->currentThread);
682
} else {
683
walkState->walkThread->javaVM->memoryManagerFunctions->j9gc_modron_local_collect(walkState->currentThread);
684
walkState->walkThread->javaVM->memoryManagerFunctions->j9gc_modron_local_collect(walkState->currentThread);
685
}
686
}
687
}
688
}
689
690
++(walkState->slotIndex);
691
++scanCursor;
692
--*jitBitsRemaining;
693
*jitDescriptionBits >>= 1;
694
*stackAllocMapBits >>= 1;
695
--slotsRemaining;
696
}
697
}
698
699
static void jitWalkRegisterMap(J9StackWalkState *walkState, void *stackMap, J9JITStackAtlas *gcStackAtlas)
700
{
701
UDATA registerMap = getJitRegisterMap(walkState->jitInfo, stackMap) & J9SW_REGISTER_MAP_MASK;
702
703
#ifdef J9VM_INTERP_STACKWALK_TRACING
704
swPrintf(walkState, 3, "\tJIT-RegisterMap = %p\n", registerMap);
705
#endif
706
707
if (gcStackAtlas->internalPointerMap) {
708
registerMap &= ~INTERNAL_PTR_REG_MASK;
709
}
710
711
if (registerMap) {
712
UDATA count = J9SW_POTENTIAL_SAVED_REGISTERS;
713
UDATA ** mapCursor;
714
715
#ifdef J9SW_REGISTER_MAP_WALK_REGISTERS_LOW_TO_HIGH
716
mapCursor = (UDATA **) &(walkState->registerEAs);
717
#else
718
mapCursor = ((UDATA **) &(walkState->registerEAs)) + J9SW_POTENTIAL_SAVED_REGISTERS - 1;
719
#endif
720
721
walkState->slotType = J9_STACKWALK_SLOT_TYPE_JIT_REGISTER_MAP;
722
walkState->slotIndex = 0;
723
724
while (count) {
725
if (registerMap & 1) {
726
j9object_t * targetObject = *((j9object_t **) mapCursor);
727
728
#ifdef J9VM_INTERP_STACKWALK_TRACING
729
j9object_t oldObject = *targetObject;
730
j9object_t newObject;
731
swPrintf(walkState, 4, "\t\tJIT-RegisterMap-O-Slot[%p] = %p (%s)\n", targetObject, oldObject, jitRegisterNames[mapCursor - ((UDATA **) &(walkState->registerEAs))]);
732
#endif
733
walkState->objectSlotWalkFunction(walkState->walkThread, walkState, targetObject, targetObject);
734
#ifdef J9VM_INTERP_STACKWALK_TRACING
735
newObject = *targetObject;
736
if (oldObject != newObject) {
737
swPrintf(walkState, 4, "\t\t\t-> %p\n", newObject);
738
}
739
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
740
lswRecordSlot(walkState, targetObject, LSW_TYPE_O_SLOT, "O-Slot");
741
#endif
742
743
#endif
744
}
745
#ifdef J9VM_INTERP_STACKWALK_TRACING
746
else {
747
UDATA * targetSlot = *((UDATA **) mapCursor);
748
749
if (targetSlot) {
750
swPrintf(walkState, 5, "\t\tJIT-RegisterMap-I-Slot[%p] = %p (%s)\n", targetSlot, *targetSlot, jitRegisterNames[mapCursor - ((UDATA **) &(walkState->registerEAs))]);
751
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
752
lswRecordSlot(walkState, targetSlot, LSW_TYPE_I_SLOT, "I-Slot");
753
#endif
754
}
755
}
756
#endif
757
758
++(walkState->slotIndex);
759
--count;
760
registerMap >>= 1;
761
#ifdef J9SW_REGISTER_MAP_WALK_REGISTERS_LOW_TO_HIGH
762
++mapCursor;
763
#else
764
--mapCursor;
765
#endif
766
}
767
}
768
}
769
770
771
#ifdef J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT
772
773
#if defined(J9VM_ARCH_S390)
774
775
/* On 390, either vector or floating point registers are preserved in the ELS, not both.
776
* Matching VRs and FPRs overlap, with the FPR contents in the high-order bits of the VR,
777
* meaning that when the VR is saved to memory, the FPR contents are in the lowest-memory
778
* address of the VR save memory (due to 390 being big endian).
779
*
780
* Similarly, float values loaded using the LE instruction occupy the high-order bits of
781
* the target FPR, meaning that the float contents are also in the lowest-memory address
782
* of the save memory, whether it be VR or FPR.
783
*
784
* Currently, the 32 128-bit save slots for JIT VRs appear directly after the 16 64-bit
785
* save slots for JIT FPRs, so if vector registers are enabled, the save location for a
786
* JIT FPR is (base + (16 * 64) + (128 * FPRNumber)), or (base + (64 * (16 + (2 * FPRNumber)))).
787
*/
788
#define JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber) \
789
(((U_64*)((walkState)->walkedEntryLocalStorage->jitFPRegisterStorageBase)) + \
790
(J9_ARE_ANY_BITS_SET((walkState)->walkThread->javaVM->extendedRuntimeFlags, J9_EXTENDED_RUNTIME_USE_VECTOR_REGISTERS) \
791
? 16 + (2 * jitFloatArgumentRegisterNumbers[fpParmNumber]) \
792
: jitFloatArgumentRegisterNumbers[fpParmNumber]) \
793
)
794
#else
795
#define JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber) (((U_64*)((walkState)->walkedEntryLocalStorage->jitFPRegisterStorageBase)) + jitFloatArgumentRegisterNumbers[fpParmNumber])
796
#endif
797
798
static void
799
jitWalkResolveMethodFrame_walkD(J9StackWalkState *walkState, UDATA ** pendingSendScanCursor, UDATA * floatRegistersRemaining)
800
{
801
/* Doubles always occupy two stack slots. Move the pendingSendScanCursor back to the
802
* beginning of the two slots.
803
*/
804
--(*pendingSendScanCursor);
805
806
if (*floatRegistersRemaining) {
807
UDATA fpParmNumber = J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT - *floatRegistersRemaining;
808
#ifdef J9VM_INTERP_STACKWALK_TRACING
809
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
810
#if !defined(J9VM_ENV_DATA64)
811
WALK_NAMED_I_SLOT(((UDATA*)JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber)) + 1, "JIT-sig-reg-I-Slot");
812
#endif
813
WALK_NAMED_I_SLOT((UDATA*)JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber), "JIT-sig-reg-I-Slot");
814
}
815
#endif
816
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
817
*(U_64*)*pendingSendScanCursor = *JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber);
818
}
819
--(*floatRegistersRemaining);
820
}
821
#ifdef J9VM_INTERP_STACKWALK_TRACING
822
else {
823
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
824
#if !defined(J9VM_ENV_DATA64)
825
WALK_NAMED_I_SLOT((*pendingSendScanCursor) + 1, "JIT-sig-stk-I-Slot");
826
#endif
827
WALK_NAMED_I_SLOT(*pendingSendScanCursor, "JIT-sig-stk-I-Slot");
828
}
829
}
830
#endif
831
}
832
833
834
static void
835
jitWalkResolveMethodFrame_walkF(J9StackWalkState *walkState, UDATA ** pendingSendScanCursor, UDATA * floatRegistersRemaining)
836
{
837
if (*floatRegistersRemaining) {
838
UDATA fpParmNumber = J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT - *floatRegistersRemaining;
839
#ifdef J9VM_INTERP_STACKWALK_TRACING
840
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
841
#if defined(J9SW_JIT_FLOATS_PASSED_AS_DOUBLES) && !defined(J9VM_ENV_DATA64)
842
WALK_NAMED_I_SLOT(((UDATA*)JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber)) + 1, "JIT-sig-reg-I-Slot");
843
#endif
844
WALK_NAMED_I_SLOT((UDATA*)JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber), "JIT-sig-reg-I-Slot");
845
}
846
#endif
847
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
848
#if defined(J9SW_JIT_FLOATS_PASSED_AS_DOUBLES)
849
jitConvertStoredDoubleRegisterToSingle(JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber),(U_32*)*pendingSendScanCursor);
850
#else
851
*(U_32*)*pendingSendScanCursor = *(U_32*)JIT_FPR_PARM_ADDRESS(walkState, fpParmNumber);
852
#endif
853
}
854
--(*floatRegistersRemaining);
855
}
856
#ifdef J9VM_INTERP_STACKWALK_TRACING
857
else {
858
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
859
WALK_NAMED_I_SLOT(*pendingSendScanCursor, "JIT-sig-stk-I-Slot");
860
}
861
}
862
#endif
863
}
864
#endif
865
866
867
static void
868
jitWalkResolveMethodFrame_walkJ(J9StackWalkState *walkState, UDATA ** pendingSendScanCursor, UDATA ** stackSpillCursor, UDATA * stackSpillCount)
869
{
870
/* Longs always take 2 stack slots */
871
872
--(*pendingSendScanCursor);
873
874
#if defined(J9SW_ARGUMENT_REGISTER_COUNT)
875
if (*stackSpillCount) {
876
/* On 64-bit, the long is in a single register.
877
*
878
* On 32-bit, parameter registers are used for longs such that the lower-numbered register
879
* holds the lower-memory half of the long (so that a store multiple on the register pair
880
* could be used to put the long back in memory). This remains true for the case where only
881
* one parameter register remains.
882
*/
883
#ifdef J9VM_INTERP_STACKWALK_TRACING
884
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
885
WALK_NAMED_I_SLOT(*stackSpillCursor, "JIT-sig-reg-I-Slot");
886
}
887
#endif
888
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
889
**pendingSendScanCursor = **stackSpillCursor;
890
}
891
--(*stackSpillCount);
892
--(*stackSpillCursor);
893
#if !defined(J9VM_ENV_DATA64)
894
if (*stackSpillCount) {
895
#ifdef J9VM_INTERP_STACKWALK_TRACING
896
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
897
WALK_NAMED_I_SLOT(*stackSpillCursor, "JIT-sig-reg-I-Slot");
898
}
899
#endif
900
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
901
*((*pendingSendScanCursor) + 1) = **stackSpillCursor;
902
}
903
--(*stackSpillCount);
904
--(*stackSpillCursor);
905
} else
906
#endif
907
{
908
#ifdef J9VM_INTERP_STACKWALK_TRACING
909
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
910
WALK_NAMED_I_SLOT((*pendingSendScanCursor) + 1, "JIT-sig-stk-I-Slot");
911
}
912
#endif
913
}
914
} else
915
#endif
916
{
917
#ifdef J9VM_INTERP_STACKWALK_TRACING
918
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
919
/* Long is entirely in memory */
920
WALK_NAMED_I_SLOT((*pendingSendScanCursor) + 1, "JIT-sig-stk-I-Slot");
921
WALK_NAMED_I_SLOT(*pendingSendScanCursor, "JIT-sig-stk-I-Slot");
922
}
923
#endif
924
}
925
}
926
927
static void
928
jitWalkResolveMethodFrame_walkI(J9StackWalkState *walkState, UDATA ** pendingSendScanCursor, UDATA ** stackSpillCursor,
929
UDATA * stackSpillCount)
930
{
931
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
932
if (*stackSpillCount) {
933
934
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
935
*(U_32*)*pendingSendScanCursor = (U_32)**stackSpillCursor;
936
}
937
#ifdef J9VM_INTERP_STACKWALK_TRACING
938
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
939
WALK_NAMED_I_SLOT(*stackSpillCursor, "JIT-sig-reg-I-Slot");
940
}
941
#endif
942
--(*stackSpillCount);
943
--(*stackSpillCursor);
944
} else
945
#endif
946
{
947
#ifdef J9VM_INTERP_STACKWALK_TRACING
948
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
949
WALK_NAMED_I_SLOT(*pendingSendScanCursor, "JIT-sig-stk-I-Slot");
950
}
951
#endif
952
}
953
}
954
955
956
static void jitWalkResolveMethodFrame(J9StackWalkState *walkState)
957
{
958
UDATA walkStackedReceiver = FALSE;
959
J9UTF8 * signature;
960
UDATA pendingSendSlots;
961
U_8 * sigData;
962
UDATA sigChar;
963
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
964
UDATA * stackSpillCursor = NULL;
965
UDATA stackSpillCount = 0;
966
#endif
967
#ifdef J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT
968
UDATA floatRegistersRemaining = J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT;
969
#endif
970
UDATA resolveFrameType = walkState->frameFlags & J9_STACK_FLAGS_JIT_FRAME_SUB_TYPE_MASK;
971
972
walkState->slotType = J9_STACKWALK_SLOT_TYPE_INTERNAL;
973
walkState->slotIndex = -1;
974
975
if (resolveFrameType == J9_STACK_FLAGS_JIT_RECOMPILATION_RESOLVE) {
976
J9Method * method = (J9Method *) JIT_RESOLVE_PARM(1);
977
J9ROMMethod * romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method);
978
979
signature = J9ROMMETHOD_SIGNATURE(romMethod);
980
pendingSendSlots = J9_ARG_COUNT_FROM_ROM_METHOD(romMethod); /* receiver is already included in this arg count */
981
walkStackedReceiver = ((romMethod->modifiers & J9AccStatic) == 0);
982
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
983
stackSpillCount = J9SW_ARGUMENT_REGISTER_COUNT;
984
walkState->unwindSP += J9SW_ARGUMENT_REGISTER_COUNT;
985
stackSpillCursor = walkState->unwindSP - 1;
986
#endif
987
walkState->unwindSP += getJitRecompilationResolvePushes();
988
} else if (resolveFrameType == J9_STACK_FLAGS_JIT_LOOKUP_RESOLVE) {
989
UDATA *interfaceObjectAndISlot = (UDATA *) JIT_RESOLVE_PARM(2);
990
J9Class *resolvedClass = (J9Class *) *interfaceObjectAndISlot;
991
UDATA iTableOffset = *(interfaceObjectAndISlot + 1);
992
J9Method *ramMethod = NULL;
993
J9ROMMethod *romMethod = NULL;
994
if (J9_ARE_ANY_BITS_SET(iTableOffset, J9_ITABLE_OFFSET_DIRECT)) {
995
ramMethod = (J9Method*)(iTableOffset & ~J9_ITABLE_OFFSET_TAG_BITS);
996
} else if (J9_ARE_ANY_BITS_SET(iTableOffset, J9_ITABLE_OFFSET_VIRTUAL)) {
997
UDATA vTableOffset = iTableOffset & ~J9_ITABLE_OFFSET_TAG_BITS;
998
J9Class *jlObject = J9VMJAVALANGOBJECT_OR_NULL(walkState->walkThread->javaVM);
999
ramMethod = *(J9Method**)((UDATA)jlObject + vTableOffset);
1000
} else {
1001
UDATA methodIndex = (iTableOffset - sizeof(J9ITable)) / sizeof(UDATA);
1002
/* Find the appropriate segment for the referenced method within the
1003
* resolvedClass iTable.
1004
*/
1005
J9ITable *allInterfaces = (J9ITable*)resolvedClass->iTable;
1006
for(;;) {
1007
J9Class *interfaceClass = allInterfaces->interfaceClass;
1008
UDATA methodCount = J9INTERFACECLASS_ITABLEMETHODCOUNT(interfaceClass);
1009
if (methodIndex < methodCount) {
1010
/* iTable segment located */
1011
ramMethod = iTableMethodAtIndex(interfaceClass, methodIndex);
1012
break;
1013
}
1014
methodIndex -= methodCount;
1015
allInterfaces = allInterfaces->next;
1016
}
1017
}
1018
romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(ramMethod);
1019
signature = J9ROMMETHOD_SIGNATURE(romMethod);
1020
pendingSendSlots = J9_ARG_COUNT_FROM_ROM_METHOD(romMethod); /* receiver is already included in this arg count */
1021
walkStackedReceiver = TRUE;
1022
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1023
stackSpillCount = J9SW_ARGUMENT_REGISTER_COUNT;
1024
walkState->unwindSP += J9SW_ARGUMENT_REGISTER_COUNT;
1025
stackSpillCursor = walkState->unwindSP - 1;
1026
#endif
1027
1028
#ifdef J9SW_JIT_LOOKUP_INTERFACE_RESOLVE_OFFSET_TO_SAVED_RECEIVER
1029
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
1030
#ifdef J9VM_INTERP_STACKWALK_TRACING
1031
swPrintf(walkState, 4, "\tObject push (picBuilder interface saved receiver)\n");
1032
#endif
1033
WALK_O_SLOT((j9object_t*) (walkState->unwindSP + J9SW_JIT_LOOKUP_INTERFACE_RESOLVE_OFFSET_TO_SAVED_RECEIVER));
1034
}
1035
#endif
1036
walkState->unwindSP += getJitVirtualMethodResolvePushes();
1037
} else if (resolveFrameType == J9_STACK_FLAGS_JIT_INDUCE_OSR_RESOLVE) {
1038
/* walkState->pc has been populated from the resolve frame */
1039
J9JITExceptionTable *metaData = jitGetExceptionTable(walkState);
1040
void *stackMap = NULL;
1041
void *inlineMap = NULL;
1042
J9Method *callingMethod = NULL;
1043
IDATA bytecodePCOffset = -1;
1044
void *inlinedCallSite = NULL;
1045
U_8 *invokeBytecode = NULL;
1046
U_8 bytecode = 0;
1047
U_16 cpIndex = 0;
1048
1049
/* Being unable to find the metadata or stack maps is a fatal error */
1050
if (NULL == metaData) {
1051
/* Only report errors if the stack walk caller has allowed it.
1052
* If errors are not being reported, stop walking this frame,
1053
* which will likely lead to further errors or crashes.
1054
*/
1055
if (J9_ARE_NO_BITS_SET(walkState->flags, J9_STACKWALK_NO_ERROR_REPORT)) {
1056
/* Avoid recursive error situations */
1057
if (0 == (walkState->walkThread->privateFlags & J9_PRIVATE_FLAGS_STACK_CORRUPT)) {
1058
walkState->walkThread->privateFlags |= J9_PRIVATE_FLAGS_STACK_CORRUPT;
1059
walkState->walkThread->javaVM->internalVMFunctions->invalidJITReturnAddress(walkState);
1060
}
1061
}
1062
return;
1063
}
1064
jitGetMapsFromPC(walkState->currentThread, walkState->javaVM, metaData, (UDATA)walkState->pc, &stackMap, &inlineMap);
1065
1066
/* If there are no inlines, use the outer method. Otherwise, use the innermost inline at the current PC */
1067
1068
callingMethod = metaData->ramMethod;
1069
if (NULL != inlineMap) {
1070
if (NULL != getJitInlinedCallInfo(metaData)) {
1071
inlinedCallSite = getFirstInlinedCallSite(metaData, inlineMap);
1072
if (NULL != inlinedCallSite) {
1073
callingMethod = (J9Method*)getInlinedMethod(inlinedCallSite);
1074
}
1075
}
1076
}
1077
bytecodePCOffset = (IDATA)getCurrentByteCodeIndexAndIsSameReceiver(metaData, inlineMap, inlinedCallSite, NULL);
1078
invokeBytecode = J9_BYTECODE_START_FROM_RAM_METHOD(callingMethod) + bytecodePCOffset;
1079
bytecode = invokeBytecode[0];
1080
cpIndex = *(U_16*)(invokeBytecode + 1);
1081
switch(bytecode) {
1082
case JBinvokeinterface2: {
1083
/* invokeinterface2 is a 5-byte bytecode: [invokeinterface2, 0, invokeinterface, idx, idx] */
1084
cpIndex = *(U_16*)(invokeBytecode + 3);
1085
/* Intentional fall-through */
1086
}
1087
case JBinvokevirtual:
1088
case JBinvokespecial:
1089
case JBinvokeinterface:
1090
case JBinvokehandle:
1091
case JBinvokehandlegeneric:
1092
walkStackedReceiver = TRUE;
1093
/* Intentional fall-through */
1094
case JBinvokestatic: {
1095
J9ROMConstantPoolItem *romCPItem = &(J9_ROM_CP_FROM_CP(J9_CP_FROM_METHOD(callingMethod))[cpIndex]);
1096
signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(J9ROMMETHODREF_NAMEANDSIGNATURE((J9ROMMethodRef*)romCPItem));
1097
break;
1098
}
1099
case JBinvokespecialsplit: {
1100
/* cpIndex is actually an index into split table. Access the split table to get real constant pool index */
1101
J9ROMClass *romClass = J9_CLASS_FROM_METHOD(callingMethod)->romClass;
1102
U_16 realCPIndex = *(J9ROMCLASS_SPECIALSPLITMETHODREFINDEXES(romClass) + cpIndex);
1103
J9ROMConstantPoolItem *romCPItem = &(J9_ROM_CP_FROM_CP(J9_CP_FROM_METHOD(callingMethod))[realCPIndex]);
1104
signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(J9ROMMETHODREF_NAMEANDSIGNATURE((J9ROMMethodRef*)romCPItem));
1105
walkStackedReceiver = TRUE;
1106
break;
1107
}
1108
case JBinvokestaticsplit: {
1109
/* cpIndex is actually an index into split table. Access the split table to get real constant pool index */
1110
J9ROMClass *romClass = J9_CLASS_FROM_METHOD(callingMethod)->romClass;
1111
U_16 realCPIndex = *(J9ROMCLASS_STATICSPLITMETHODREFINDEXES(romClass) + cpIndex);
1112
J9ROMConstantPoolItem *romCPItem = &(J9_ROM_CP_FROM_CP(J9_CP_FROM_METHOD(callingMethod))[realCPIndex]);
1113
signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(J9ROMMETHODREF_NAMEANDSIGNATURE((J9ROMMethodRef*)romCPItem));
1114
break;
1115
}
1116
case JBinvokedynamic: {
1117
/* invokedynamic has no receiver, all pushed arguments are described by the signature
1118
* in the call site data.
1119
*/
1120
J9ROMClass *romClass = J9_CLASS_FROM_METHOD(callingMethod)->romClass;
1121
J9SRP *callSiteData = (J9SRP*)J9ROMCLASS_CALLSITEDATA(romClass);
1122
J9ROMNameAndSignature *nameAndSig = SRP_PTR_GET(callSiteData + cpIndex, J9ROMNameAndSignature*);
1123
signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(nameAndSig);
1124
break;
1125
}
1126
default:
1127
/* Not an invoke, no special handling required */
1128
return;
1129
}
1130
pendingSendSlots = getSendSlotsFromSignature(J9UTF8_DATA(signature)) + (walkStackedReceiver ? 1 : 0);
1131
/* Nothing is in registers at this point - the JIT has populated the outgoing argument area in the stack */
1132
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1133
stackSpillCount = 0;
1134
#endif
1135
#ifdef J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT
1136
floatRegistersRemaining = 0;
1137
#endif
1138
} else {
1139
UDATA cpIndex;
1140
J9ConstantPool * constantPool;
1141
J9ROMMethodRef * romMethodRef;
1142
1143
if ((resolveFrameType == J9_STACK_FLAGS_JIT_STATIC_METHOD_RESOLVE) || (resolveFrameType == J9_STACK_FLAGS_JIT_SPECIAL_METHOD_RESOLVE)) {
1144
#ifdef J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT
1145
floatRegistersRemaining = 0;
1146
#endif
1147
constantPool = (J9ConstantPool *) JIT_RESOLVE_PARM(2);
1148
cpIndex = JIT_RESOLVE_PARM(3);
1149
walkState->unwindSP += getJitStaticMethodResolvePushes();
1150
walkStackedReceiver = (resolveFrameType == J9_STACK_FLAGS_JIT_SPECIAL_METHOD_RESOLVE);
1151
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1152
stackSpillCount = 0;
1153
#endif
1154
cpIndex = jitGetRealCPIndex(walkState->currentThread, J9_CLASS_FROM_CP(constantPool)->romClass, cpIndex);
1155
} else {
1156
UDATA * indexAndLiterals = (UDATA *) JIT_RESOLVE_PARM(1);
1157
1158
constantPool = (J9ConstantPool *) *indexAndLiterals;
1159
cpIndex = *(indexAndLiterals + 1);
1160
1161
walkStackedReceiver = TRUE;
1162
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1163
stackSpillCount = J9SW_ARGUMENT_REGISTER_COUNT;
1164
walkState->unwindSP += J9SW_ARGUMENT_REGISTER_COUNT;
1165
stackSpillCursor = walkState->unwindSP - 1;
1166
#endif
1167
1168
#ifdef J9SW_JIT_VIRTUAL_METHOD_RESOLVE_OFFSET_TO_SAVED_RECEIVER
1169
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
1170
#ifdef J9VM_INTERP_STACKWALK_TRACING
1171
swPrintf(walkState, 4, "\tObject push (picBuilder virtual saved receiver)\n");
1172
#endif
1173
WALK_O_SLOT((j9object_t*) (walkState->unwindSP + J9SW_JIT_VIRTUAL_METHOD_RESOLVE_OFFSET_TO_SAVED_RECEIVER));
1174
}
1175
#endif
1176
walkState->unwindSP += getJitVirtualMethodResolvePushes();
1177
}
1178
1179
romMethodRef = (J9ROMMethodRef *) &(constantPool->romConstantPool[cpIndex]);
1180
signature = J9ROMNAMEANDSIGNATURE_SIGNATURE(J9ROMMETHODREF_NAMEANDSIGNATURE(romMethodRef));
1181
pendingSendSlots = getSendSlotsFromSignature(J9UTF8_DATA(signature)) + (walkStackedReceiver ? 1 : 0);
1182
}
1183
1184
if ((walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) || (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS)) {
1185
UDATA * pendingSendScanCursor = walkState->unwindSP + pendingSendSlots - 1;
1186
1187
#ifdef J9VM_INTERP_STACKWALK_TRACING
1188
swPrintf(walkState, 3, "\tPending send scan cursor initialized to %p\n", pendingSendScanCursor);
1189
#endif
1190
if (walkStackedReceiver) {
1191
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1192
if (stackSpillCount) {
1193
#ifdef J9VM_INTERP_STACKWALK_TRACING
1194
swPrintf(walkState, 4, "\tObject push (receiver in register spill area)\n");
1195
#endif
1196
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
1197
/* Restore stacked receiver */
1198
*pendingSendScanCursor = *stackSpillCursor;
1199
}
1200
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
1201
WALK_O_SLOT((j9object_t*) stackSpillCursor);
1202
}
1203
--stackSpillCount;
1204
--stackSpillCursor;
1205
} else {
1206
#endif
1207
#ifdef J9VM_INTERP_STACKWALK_TRACING
1208
swPrintf(walkState, 4, "\tObject push (receiver in stack)\n");
1209
#endif
1210
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
1211
WALK_O_SLOT((j9object_t*) pendingSendScanCursor);
1212
}
1213
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1214
}
1215
#endif
1216
--pendingSendScanCursor;
1217
}
1218
1219
#ifdef J9VM_INTERP_STACKWALK_TRACING
1220
swPrintf(walkState, 3, "\tMethod signature: %.*s\n", (U_32) J9UTF8_LENGTH(signature), J9UTF8_DATA(signature));
1221
#endif
1222
1223
sigData = J9UTF8_DATA(signature);
1224
jitNextUTFChar(&sigData); /* skip the opening ( */
1225
while ((sigChar = jitNextSigChar(&sigData)) != ')') {
1226
1227
switch (sigChar) {
1228
case 'L':
1229
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1230
if (stackSpillCount) {
1231
1232
if (walkState->flags & J9_STACKWALK_SAVE_STACKED_REGISTERS) {
1233
/* Restore an object */
1234
*pendingSendScanCursor = *stackSpillCursor;
1235
}
1236
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
1237
WALK_NAMED_O_SLOT((j9object_t*) stackSpillCursor, "JIT-sig-reg-O-Slot");
1238
}
1239
--stackSpillCount;
1240
--stackSpillCursor;
1241
} else {
1242
#endif
1243
if (walkState->flags & J9_STACKWALK_ITERATE_O_SLOTS) {
1244
WALK_NAMED_O_SLOT((j9object_t*) pendingSendScanCursor, "JIT-sig-stk-O-Slot");
1245
}
1246
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1247
}
1248
#endif
1249
break;
1250
1251
case 'D':
1252
#ifdef J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT
1253
jitWalkResolveMethodFrame_walkD(walkState, &pendingSendScanCursor, &floatRegistersRemaining);
1254
break;
1255
#else
1256
/* no float regs - double treated as long */
1257
#endif
1258
1259
case 'J':
1260
#if defined(J9SW_ARGUMENT_REGISTER_COUNT)
1261
jitWalkResolveMethodFrame_walkJ(walkState, &pendingSendScanCursor, &stackSpillCursor, &stackSpillCount);
1262
#else
1263
jitWalkResolveMethodFrame_walkJ(walkState, &pendingSendScanCursor, NULL, NULL);
1264
#endif
1265
break;
1266
1267
case 'F':
1268
#ifdef J9SW_JIT_FLOAT_ARGUMENT_REGISTER_COUNT
1269
jitWalkResolveMethodFrame_walkF(walkState, &pendingSendScanCursor, &floatRegistersRemaining);
1270
break;
1271
#else
1272
/* no float regs - float treated as int */
1273
#endif
1274
1275
case 'I':
1276
default:
1277
#ifdef J9SW_ARGUMENT_REGISTER_COUNT
1278
jitWalkResolveMethodFrame_walkI(walkState, &pendingSendScanCursor, &stackSpillCursor, &stackSpillCount);
1279
#else
1280
jitWalkResolveMethodFrame_walkI(walkState, &pendingSendScanCursor, NULL, NULL);
1281
#endif
1282
break;
1283
1284
}
1285
1286
--pendingSendScanCursor;
1287
}
1288
1289
}
1290
1291
#ifdef J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP
1292
walkState->unwindSP += pendingSendSlots;
1293
#endif
1294
walkState->argCount = pendingSendSlots;
1295
}
1296
1297
1298
static UDATA jitNextUTFChar(U_8 ** pUtfData)
1299
{
1300
U_8 * utfData = *pUtfData;
1301
UDATA utfChar;
1302
1303
utfChar = (UDATA) *(utfData++);
1304
if (utfChar & 0x80) {
1305
if (utfChar & 0x20) {
1306
utfChar = (utfChar & 0x0F) << 12;
1307
utfChar |= ((((UDATA) *(utfData++)) & 0x3F) << 6);
1308
utfChar |= (((UDATA) *(utfData++)) & 0x3F);
1309
} else {
1310
utfChar = (utfChar & 0x1F) << 6;
1311
utfChar |= (((UDATA) *(utfData++)) & 0x3F);
1312
}
1313
}
1314
1315
*pUtfData = utfData;
1316
return utfChar;
1317
}
1318
static UDATA jitNextSigChar(U_8 ** utfData)
1319
{
1320
UDATA utfChar;
1321
1322
utfChar = jitNextUTFChar(utfData);
1323
1324
switch (utfChar) {
1325
case '[':
1326
do {
1327
utfChar = jitNextUTFChar(utfData);
1328
} while (utfChar == '[');
1329
if (utfChar != 'L') {
1330
utfChar = 'L';
1331
break;
1332
}
1333
/* Fall through to consume type name, utfChar == 'L' for return value */
1334
1335
case 'L':
1336
while (jitNextUTFChar(utfData) != ';') ;
1337
}
1338
1339
return utfChar;
1340
}
1341
1342
#if (defined(J9VM_INTERP_STACKWALK_TRACING)) /* priv. proto (autogen) */
1343
1344
void jitPrintRegisterMapArray(J9StackWalkState * walkState, char * description)
1345
{
1346
UDATA i;
1347
UDATA ** mapCursor = (UDATA **) &(walkState->registerEAs);
1348
1349
for (i = 0; i < J9SW_POTENTIAL_SAVED_REGISTERS; ++i) {
1350
UDATA * registerSaveAddress = mapCursor[i];
1351
1352
if (registerSaveAddress) {
1353
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
1354
lswRecordSlot(walkState, registerSaveAddress, LSW_TYPE_JIT_REG_SLOT, "%s: %s", description, jitRegisterNames[i]);
1355
#endif
1356
swPrintf(walkState, 3, "\tJIT-%s-RegisterMap[%p] = %p (%s)\n", description, registerSaveAddress,
1357
*registerSaveAddress, jitRegisterNames[i]);
1358
}
1359
}
1360
}
1361
1362
#endif /* J9VM_INTERP_STACKWALK_TRACING (autogen) */
1363
1364
1365
1366
1367
static void jitAddSpilledRegistersForResolve(J9StackWalkState * walkState)
1368
{
1369
J9STACKSLOT * slotCursor = walkState->walkedEntryLocalStorage->jitGlobalStorageBase;
1370
UDATA ** mapCursor = (UDATA **) &(walkState->registerEAs);
1371
UDATA i;
1372
1373
for (i = 0; i < J9SW_POTENTIAL_SAVED_REGISTERS; ++i) {
1374
*mapCursor++ = (UDATA *) slotCursor++;
1375
}
1376
1377
#ifdef J9VM_INTERP_STACKWALK_TRACING
1378
jitPrintRegisterMapArray(walkState, "Resolve");
1379
#endif
1380
}
1381
1382
static void jitAddSpilledRegistersForINL(J9StackWalkState * walkState)
1383
{
1384
J9STACKSLOT * slotCursor = walkState->walkedEntryLocalStorage->jitGlobalStorageBase;
1385
UDATA ** mapCursor = (UDATA **) &(walkState->registerEAs);
1386
UDATA i;
1387
1388
for (i = 0; i < J9SW_JIT_CALLEE_PRESERVED_SIZE; ++i) {
1389
UDATA regNumber = jitCalleeSavedRegisterList[i];
1390
1391
mapCursor[regNumber] = (UDATA *) &slotCursor[regNumber];
1392
}
1393
1394
#ifdef J9VM_INTERP_STACKWALK_TRACING
1395
jitPrintRegisterMapArray(walkState, "INL");
1396
#endif
1397
}
1398
1399
static void jitAddSpilledRegistersForJ2I(J9StackWalkState * walkState)
1400
{
1401
J9SFJ2IFrame * j2iFrame = (J9SFJ2IFrame *) ((U_8 *) walkState->bp - sizeof(J9SFJ2IFrame) + sizeof(UDATA));
1402
UDATA * slotCursor = ((UDATA *) &(j2iFrame->previousJ2iFrame)) + 1;
1403
UDATA ** mapCursor = (UDATA **) &(walkState->registerEAs);
1404
UDATA i;
1405
1406
for (i = 0; i < J9SW_JIT_CALLEE_PRESERVED_SIZE; ++i) {
1407
UDATA regNumber = jitCalleeSavedRegisterList[i];
1408
1409
mapCursor[regNumber] = slotCursor++;
1410
}
1411
1412
#ifdef J9VM_INTERP_STACKWALK_TRACING
1413
jitPrintRegisterMapArray(walkState, "J2I");
1414
#endif
1415
}
1416
1417
#if (defined(J9VM_JIT_FULL_SPEED_DEBUG)) /* priv. proto (autogen) */
1418
1419
static J9JITExceptionTable * jitGetExceptionTable(J9StackWalkState * walkState)
1420
{
1421
#ifdef J9VM_INTERP_STACKWALK_TRACING
1422
J9JITDecompilationInfo * stack;
1423
#endif
1424
J9JITExceptionTable * result = jitGetExceptionTableFromPC(walkState->walkThread, (UDATA) walkState->pc);
1425
1426
if (result) return result;
1427
1428
/* Check to see if the PC is a decompilation return point and if so, use the real PC for finding the metaData */
1429
1430
if (walkState->decompilationStack) {
1431
#ifdef J9VM_INTERP_STACKWALK_TRACING
1432
/* swPrintf(walkState, 1, "(ws pcaddr = %p, dc tos = %p, pcaddr = %p, pc = %p)\n", walkState->pcAddress, walkState->decompilationStack, walkState->decompilationStack->pcAddress, walkState->decompilationStack->pc); */
1433
#endif
1434
if (walkState->pcAddress == walkState->decompilationStack->pcAddress) {
1435
walkState->pc = walkState->decompilationStack->pc;
1436
if (J9_STACK_FLAGS_JIT_EXCEPTION_CATCH_RESOLVE == (walkState->resolveFrameFlags & J9_STACK_FLAGS_JIT_FRAME_SUB_TYPE_MASK)) {
1437
walkState->pc += 1;
1438
}
1439
walkState->decompilationRecord = walkState->decompilationStack;
1440
walkState->decompilationStack = walkState->decompilationStack->next;
1441
return jitGetExceptionTableFromPC(walkState->walkThread, (UDATA) walkState->pc);
1442
}
1443
#ifdef J9VM_INTERP_STACKWALK_TRACING
1444
stack = walkState->decompilationStack;
1445
while ((stack = stack->next) != NULL) {
1446
if (walkState->pcAddress == walkState->decompilationStack->pcAddress) {
1447
swPrintf(walkState, 0, "\n");
1448
swPrintf(walkState, 0, "\n");
1449
swPrintf(walkState, 0, "**** decomp found not on TOS! ****\n");
1450
swPrintf(walkState, 0, "\n");
1451
swPrintf(walkState, 0, "\n");
1452
}
1453
}
1454
#endif
1455
}
1456
1457
return NULL;
1458
}
1459
#endif /* J9VM_JIT_FULL_SPEED_DEBUG (autogen) */
1460
1461
1462
#define JIT_ARTIFACT_SEARCH_CACHE_SIZE 256
1463
#define JIT_ARTIFACT_SEARCH_CACHE_DIMENSION 8
1464
/* hash values for 64 bit and 32 bit platform. Just selected a random prime number, may need to modify later */
1465
#if defined(J9VM_ENV_DATA64)
1466
#define JIT_ARTIFACT_SEARCH_CACHE_HASH_VALUE ((UDATA)J9CONST_U64(17446744073709553729))
1467
#define BITS_IN_INTEGER 64
1468
#else
1469
#define JIT_ARTIFACT_SEARCH_CACHE_HASH_VALUE ((UDATA)4102541685U)
1470
#define BITS_IN_INTEGER 32
1471
#endif
1472
1473
#define JIT_ARTIFACT_SEARCH_CACHE_HASH_RESULT(key) \
1474
(((key) * JIT_ARTIFACT_SEARCH_CACHE_HASH_VALUE) >> (BITS_IN_INTEGER - JIT_ARTIFACT_SEARCH_CACHE_DIMENSION))
1475
1476
/* Cache entries may be used by multiple threads, so make the fields volatile */
1477
typedef struct TR_jit_artifact_search_cache
1478
{
1479
UDATA volatile searchValue;
1480
J9JITExceptionTable * volatile exceptionTable;
1481
} TR_jit_artifact_search_cache;
1482
1483
J9JITExceptionTable * jitGetExceptionTableFromPC(J9VMThread * vmThread, UDATA jitPC)
1484
{
1485
UDATA maskedPC = (UDATA)MASK_PC(jitPC);
1486
#ifdef J9JIT_ARTIFACT_SEARCH_CACHE_ENABLE
1487
TR_jit_artifact_search_cache *artifactSearchCache = vmThread->jitArtifactSearchCache;
1488
if (J9_ARE_NO_BITS_SET((UDATA)artifactSearchCache, J9_STACKWALK_NO_JIT_CACHE)) {
1489
J9JITExceptionTable *exceptionTable = NULL;
1490
TR_jit_artifact_search_cache *cacheEntry = NULL;
1491
if (NULL == artifactSearchCache) {
1492
TR_jit_artifact_search_cache *existingCache = NULL;
1493
PORT_ACCESS_FROM_JAVAVM(vmThread->javaVM);
1494
artifactSearchCache = j9mem_allocate_memory(JIT_ARTIFACT_SEARCH_CACHE_SIZE * sizeof (TR_jit_artifact_search_cache), OMRMEM_CATEGORY_JIT);
1495
if (NULL == artifactSearchCache) {
1496
goto noCache;
1497
}
1498
memset(artifactSearchCache, 0, JIT_ARTIFACT_SEARCH_CACHE_SIZE * sizeof(TR_jit_artifact_search_cache));
1499
/* The vmThread parameter to this function may not be the current thread, so ensure that only a single
1500
* instance of the cache is allocated for the thread, and make sure the empty cache entries for a new
1501
* cache are visible to other threads before the cache pointer is visible.
1502
*/
1503
issueWriteBarrier();
1504
existingCache = (TR_jit_artifact_search_cache*)compareAndSwapUDATA((uintptr_t*)&vmThread->jitArtifactSearchCache, (uintptr_t)existingCache, (uintptr_t)artifactSearchCache);
1505
if (NULL != existingCache) {
1506
j9mem_free_memory(artifactSearchCache);
1507
artifactSearchCache = existingCache;
1508
}
1509
}
1510
cacheEntry = &(artifactSearchCache[JIT_ARTIFACT_SEARCH_CACHE_HASH_RESULT(maskedPC)]);
1511
if (cacheEntry->searchValue == maskedPC) {
1512
exceptionTable = cacheEntry->exceptionTable;
1513
/* The cache is not thread-safe - it's possible to view an inconsistent pc/metadata pair from one
1514
* thread while another thread is updating the cache entry. To counteract this, verify that the
1515
* found metadata is valid for the input PC. If not, ignore the cache and go to the underlying
1516
* hash table.
1517
*/
1518
if ((NULL == exceptionTable)
1519
|| !(((maskedPC >= exceptionTable->startPC) && (maskedPC < exceptionTable->endWarmPC))
1520
|| ((0 != exceptionTable->startColdPC) && (maskedPC >= exceptionTable->startColdPC) && (maskedPC < exceptionTable->endPC)))
1521
) {
1522
exceptionTable = jit_artifact_search(vmThread->javaVM->jitConfig->translationArtifacts, maskedPC);
1523
}
1524
} else {
1525
exceptionTable = jit_artifact_search(vmThread->javaVM->jitConfig->translationArtifacts, maskedPC);
1526
if (NULL != exceptionTable) {
1527
cacheEntry->searchValue = maskedPC;
1528
cacheEntry->exceptionTable = exceptionTable;
1529
}
1530
}
1531
return exceptionTable;
1532
}
1533
noCache:
1534
#endif /* J9JIT_ARTIFACT_SEARCH_CACHE_ENABLE */
1535
return jit_artifact_search(vmThread->javaVM->jitConfig->translationArtifacts, maskedPC);
1536
}
1537
1538
1539
1540
1541
/* Only callable from inside a visible-only walk on the current thread (with VM access) */
1542
1543
static void
1544
jitDropToCurrentFrame(J9StackWalkState * walkState)
1545
{
1546
J9VMThread * vmThread = walkState->walkThread;
1547
J9STACKSLOT * elsSaveArea = walkState->walkedEntryLocalStorage->jitGlobalStorageBase;
1548
UDATA ** registerMap = (UDATA **) &(walkState->registerEAs);
1549
UDATA i;
1550
J9SFJITResolveFrame * resolveFrame;
1551
J9I2JState * currentState;
1552
U_8 * pc = walkState->pc;
1553
1554
#ifdef J9VM_JIT_FULL_SPEED_DEBUG
1555
J9JITDecompilationInfo * currentFrameDecompilation = NULL;
1556
1557
if (J9_FSD_ENABLED(vmThread->javaVM)) {
1558
1559
/* If there's a decompilation for the current frame, fix it to point back to the new resolve frame */
1560
1561
currentFrameDecompilation = vmThread->javaVM->jitConfig->jitCleanUpDecompilationStack(vmThread, walkState, FALSE);
1562
if (currentFrameDecompilation != NULL) {
1563
pc = *(walkState->pcAddress);
1564
}
1565
}
1566
#endif
1567
1568
/* Copy mapped regs into ELS - modify register map to reflect this */
1569
1570
for (i = 0; i < J9SW_POTENTIAL_SAVED_REGISTERS; ++i) {
1571
UDATA * newSaveSlot = (UDATA *) (&elsSaveArea[i]);
1572
UDATA * registerSaveAddress = registerMap[i];
1573
1574
if (registerSaveAddress != NULL) {
1575
*newSaveSlot = *registerSaveAddress;
1576
}
1577
registerMap[i] = newSaveSlot;
1578
}
1579
1580
/* Copy current I2J state back to ELS */
1581
1582
currentState = walkState->i2jState;
1583
if (currentState != NULL) {
1584
J9I2JState * elsState = &(vmThread->entryLocalStorage->i2jState);
1585
1586
elsState->pc = currentState->pc;
1587
elsState->literals = currentState->literals;
1588
elsState->a0 = currentState->a0;
1589
elsState->returnSP = currentState->returnSP;
1590
walkState->i2jState = elsState;
1591
}
1592
1593
/* Build generic resolve frame */
1594
resolveFrame = jitPushResolveFrame(vmThread, walkState->unwindSP, pc);
1595
#ifdef J9VM_JIT_FULL_SPEED_DEBUG
1596
if (currentFrameDecompilation != NULL) {
1597
currentFrameDecompilation->pcAddress = (U_8 **) &(resolveFrame->returnAddress);
1598
}
1599
#endif
1600
1601
vmThread->j2iFrame = walkState->j2iFrame;
1602
}
1603
1604
1605
/* This function is invoked for each stack allocated object. Unless a specific callback
1606
* has been provided for stack allocated objects it creates synthetic slots for the object's
1607
* fields and reports them using WALK_O_SLOT()
1608
*/
1609
static void
1610
jitWalkStackAllocatedObject(J9StackWalkState * walkState, j9object_t object)
1611
{
1612
J9JavaVM* vm = walkState->walkThread->javaVM;
1613
J9MM_IterateObjectDescriptor descriptor;
1614
UDATA iterateObjectSlotsFlags = 0;
1615
J9MemoryManagerFunctions *mmFuncs = vm->memoryManagerFunctions;
1616
1617
if (J9_STACKWALK_INCLUDE_ARRAYLET_LEAVES == (walkState->flags & J9_STACKWALK_INCLUDE_ARRAYLET_LEAVES)) {
1618
iterateObjectSlotsFlags |= j9mm_iterator_flag_include_arraylet_leaves;
1619
}
1620
1621
#if defined (J9VM_INTERP_STACKWALK_TRACING)
1622
swPrintf(walkState, 4, "\t\tSA-Obj[%p]\n", object);
1623
1624
#endif
1625
1626
mmFuncs->j9mm_initialize_object_descriptor(vm, &descriptor, object);
1627
1628
mmFuncs->j9mm_iterate_object_slots(
1629
vm,
1630
vm->portLibrary,
1631
&descriptor,
1632
iterateObjectSlotsFlags,
1633
stackAllocatedObjectSlotWalkFunction,
1634
walkState);
1635
}
1636
1637
static jvmtiIterationControl
1638
stackAllocatedObjectSlotWalkFunction(J9JavaVM *javaVM, J9MM_IterateObjectDescriptor *objectDesc, J9MM_IterateObjectRefDescriptor *refDesc, void *userData)
1639
{
1640
J9StackWalkState * walkState = userData; /* used implicitly by WALK_NAMED_INDIRECT_O_SLOT */
1641
1642
#if defined (J9VM_INTERP_STACKWALK_TRACING)
1643
j9object_t oldValue = refDesc->object;
1644
1645
swPrintf(walkState, 4, "\t\t\tF-Slot[%p] = %p\n", refDesc->fieldAddress, refDesc->object);
1646
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
1647
lswRecordSlot(walkState, refDesc->fieldAddress, LSW_TYPE_F_SLOT, "F-Slot");
1648
#endif
1649
swMarkSlotAsObject(walkState, (j9object_t*)(((UDATA)refDesc->fieldAddress) & ~(UDATA)(sizeof(UDATA) - 1)));
1650
#endif /* J9VM_INTERP_STACKWALK_TRACING */
1651
1652
walkState->objectSlotWalkFunction(walkState->currentThread, walkState, &refDesc->object, refDesc->fieldAddress);
1653
1654
#if defined (J9VM_INTERP_STACKWALK_TRACING)
1655
if (oldValue != refDesc->object) {
1656
swPrintf(walkState, 4, "\t\t\t\t-> %p\n", refDesc->object);
1657
}
1658
#endif /* J9VM_INTERP_STACKWALK_TRACING */
1659
1660
return JVMTI_ITERATION_CONTINUE;
1661
}
1662
1663
/*
1664
* userData1 = curInfo
1665
* userData2 = lastInfo / monitorCount
1666
* userData3 = monitorEnterRecords
1667
* userData4 = stack depth, including inlines
1668
*/
1669
UDATA
1670
jitGetOwnedObjectMonitors(J9StackWalkState *walkState)
1671
{
1672
J9JITStackAtlas *gcStackAtlas;
1673
void *stackMap;
1674
void *inlineMap;
1675
U_8 *liveMonitorMap;
1676
U_16 numberOfMapBits;
1677
1678
if (NULL == walkState->userData1) {
1679
return countOwnedObjectMonitors(walkState);
1680
}
1681
1682
/* get the stackmap and inline map for the given pc (this is a single walk of jit metadata) */
1683
jitGetMapsFromPC(walkState->currentThread, walkState->javaVM, walkState->jitInfo, (UDATA)walkState->pc, &stackMap, &inlineMap);
1684
1685
/* get a slot map of all live monitors on the JIT frame. May include slots from inlined methods */
1686
liveMonitorMap = getJitLiveMonitors(walkState->jitInfo, stackMap);
1687
gcStackAtlas = (J9JITStackAtlas *)getJitGCStackAtlas(walkState->jitInfo);
1688
numberOfMapBits = getJitNumberOfMapBytes(gcStackAtlas) << 3;
1689
1690
/*
1691
* walk the inlined methods and use the new monitor mask interface to find live
1692
* monitors corresponding to each inlined frame
1693
*/
1694
if (inlineMap) {
1695
void *inlinedCallSite;
1696
1697
for (
1698
inlinedCallSite = getFirstInlinedCallSite(walkState->jitInfo, inlineMap);
1699
inlinedCallSite != NULL;
1700
inlinedCallSite = getNextInlinedCallSite(walkState->jitInfo, inlinedCallSite)
1701
) {
1702
1703
if (liveMonitorMap) {
1704
U_8 *inlineMonitorMask = getMonitorMask(gcStackAtlas, inlinedCallSite);
1705
if (NULL != inlineMonitorMask) {
1706
walkLiveMonitorSlots(walkState, gcStackAtlas, liveMonitorMap, inlineMonitorMask, numberOfMapBits);
1707
}
1708
}
1709
/* increment stack depth */
1710
walkState->userData4 = (void *)(((UDATA)walkState->userData4) + 1);
1711
}
1712
}
1713
1714
/* Get the live monitors for the outer frame */
1715
if (liveMonitorMap) {
1716
walkLiveMonitorSlots(walkState, gcStackAtlas, liveMonitorMap, getMonitorMask(gcStackAtlas, NULL), numberOfMapBits);
1717
}
1718
1719
return J9_STACKWALK_KEEP_ITERATING;
1720
}
1721
1722
/*
1723
* userData4 (stack depth) is ignored in this case
1724
*/
1725
static UDATA
1726
countOwnedObjectMonitors(J9StackWalkState *walkState)
1727
{
1728
J9JITStackAtlas *gcStackAtlas;
1729
void *stackMap;
1730
void *inlineMap;
1731
U_8 *liveMonitorMap;
1732
U_16 numberOfMapBits;
1733
1734
/* get the stackmap and inline map for the given pc (this is a single walk of jit metadata) */
1735
jitGetMapsFromPC(walkState->currentThread, walkState->javaVM, walkState->jitInfo, (UDATA)walkState->pc, &stackMap, &inlineMap);
1736
1737
/* get a slot map of all live monitors on the JIT frame. May include slots from inlined methods */
1738
liveMonitorMap = getJitLiveMonitors(walkState->jitInfo, stackMap);
1739
gcStackAtlas = (J9JITStackAtlas *)getJitGCStackAtlas(walkState->jitInfo);
1740
numberOfMapBits = getJitNumberOfMapBytes(gcStackAtlas) << 3;
1741
1742
/*
1743
* walk the inlined methods and use the new monitor mask interface to find live
1744
* monitors corresponding to each inlined frame
1745
*/
1746
if (inlineMap) {
1747
void *inlinedCallSite;
1748
1749
for (
1750
inlinedCallSite = getFirstInlinedCallSite(walkState->jitInfo, inlineMap);
1751
inlinedCallSite != NULL;
1752
inlinedCallSite = getNextInlinedCallSite(walkState->jitInfo, inlinedCallSite)
1753
) {
1754
1755
if (liveMonitorMap) {
1756
U_8 *inlineMonitorMask = getMonitorMask(gcStackAtlas, inlinedCallSite);
1757
if (NULL != inlineMonitorMask) {
1758
countLiveMonitorSlots(walkState, gcStackAtlas, liveMonitorMap, inlineMonitorMask, numberOfMapBits);
1759
}
1760
}
1761
}
1762
}
1763
1764
/* Get the live monitors for the outer frame */
1765
if (liveMonitorMap) {
1766
countLiveMonitorSlots(walkState, gcStackAtlas, liveMonitorMap, getMonitorMask(gcStackAtlas, 0), numberOfMapBits);
1767
}
1768
return J9_STACKWALK_KEEP_ITERATING;
1769
}
1770
1771
static UDATA
1772
walkLiveMonitorSlots(J9StackWalkState *walkState, J9JITStackAtlas *gcStackAtlas,
1773
U_8 *liveMonitorMap, U_8 *monitorMask, U_16 numberOfMapBits)
1774
{
1775
J9ObjectMonitorInfo *info = walkState->userData1;
1776
J9ObjectMonitorInfo *lastInfo = walkState->userData2;
1777
j9object_t *objAddress;
1778
U_16 i;
1779
U_8 bit;
1780
J9VMThread *currentThread = walkState->currentThread;
1781
J9VMThread *targetThread = walkState->walkThread;
1782
J9InternalVMFunctions const * const vmFuncs = walkState->javaVM->internalVMFunctions;
1783
1784
for (i = 0; i < numberOfMapBits; ++i) {
1785
bit = liveMonitorMap[i >> 3] & monitorMask[i >> 3] & (1 << (i & 7));
1786
if (bit) {
1787
if (info > lastInfo) {
1788
/* don't overflow buffer */
1789
return J9_STACKWALK_STOP_ITERATING;
1790
}
1791
1792
objAddress = getSlotAddress(walkState, gcStackAtlas, i);
1793
1794
/* CMVC 188386 : if the object is stack allocates and the object is discontiguous on stack,
1795
* the jit just stores a null in the slot. Skip this slot.
1796
*/
1797
if (NULL != objAddress) {
1798
j9object_t obj = *objAddress;
1799
1800
if ((NULL != obj) && !vmFuncs->objectIsBeingWaitedOn(currentThread, targetThread, obj)) {
1801
info->object = obj;
1802
info->count = 1;
1803
info->depth = (UDATA)walkState->userData4;
1804
++info;
1805
}
1806
}
1807
}
1808
}
1809
walkState->userData1 = info;
1810
1811
return J9_STACKWALK_KEEP_ITERATING;
1812
}
1813
1814
static void
1815
countLiveMonitorSlots(J9StackWalkState *walkState, J9JITStackAtlas *gcStackAtlas, U_8 *liveMonitorMap, U_8 *monitorMask, U_16 numberOfMapBits)
1816
{
1817
IDATA monitorCount = (IDATA)walkState->userData2;
1818
U_16 i;
1819
U_8 bit;
1820
J9VMThread *currentThread = walkState->currentThread;
1821
J9VMThread *targetThread = walkState->walkThread;
1822
J9InternalVMFunctions const * const vmFuncs = walkState->javaVM->internalVMFunctions;
1823
1824
for (i = 0; i < numberOfMapBits; ++i) {
1825
bit = liveMonitorMap[i >> 3] & monitorMask[i >> 3];
1826
bit >>= i & 7;
1827
1828
if (bit & 1) {
1829
j9object_t *objAddress = getSlotAddress(walkState, gcStackAtlas, i);
1830
/* CMVC 188386 : if the object is stack allocates and the object is discontiguous on stack,
1831
* the jit stores a null in the slot. Skip this slot.
1832
*/
1833
if (NULL != objAddress) {
1834
j9object_t obj = *objAddress;
1835
1836
if ((NULL != obj) && !vmFuncs->objectIsBeingWaitedOn(currentThread, targetThread, obj)) {
1837
monitorCount += 1;
1838
}
1839
}
1840
}
1841
}
1842
walkState->userData2 = (void *)monitorCount;
1843
}
1844
1845
static j9object_t *
1846
getSlotAddress(J9StackWalkState *walkState, J9JITStackAtlas *gcStackAtlas, U_16 slot)
1847
{
1848
UDATA *slotAddress;
1849
j9object_t *retobj;
1850
U_16 numParms;
1851
1852
/* The base address depends on the range of the slot index */
1853
numParms = getJitNumberOfParmSlots(gcStackAtlas);
1854
if (slot < numParms) {
1855
slotAddress = getObjectArgScanCursor(walkState);
1856
} else {
1857
slotAddress = getObjectTempScanCursor(walkState);
1858
slot -= numParms;
1859
}
1860
1861
slotAddress += slot;
1862
retobj = (j9object_t *)slotAddress;
1863
1864
return retobj;
1865
}
1866
1867
1868
/**
1869
* Walk the stack slots in a single OSR frame.
1870
*
1871
* @param[in] *walkState current J9StackWalkState pointer
1872
* @param[in] *osrFrame the current OSR frame
1873
*
1874
* @return pointer to the next OSR frame in the buffer
1875
*/
1876
static J9OSRFrame*
1877
jitWalkOSRFrame(J9StackWalkState *walkState, J9OSRFrame *osrFrame)
1878
{
1879
J9Method *method = osrFrame->method;
1880
U_8 *bytecodePC = osrFrame->bytecodePCOffset + J9_BYTECODE_START_FROM_RAM_METHOD(osrFrame->method);
1881
UDATA numberOfLocals = osrFrame->numberOfLocals;
1882
UDATA maxStack = osrFrame->maxStack;
1883
UDATA pendingStackHeight = osrFrame->pendingStackHeight;
1884
UDATA offsetPC = bytecodePC - J9_BYTECODE_START_FROM_RAM_METHOD(method);
1885
UDATA *localSlots = ((UDATA*)(osrFrame + 1)) + maxStack;
1886
UDATA *nextFrame = localSlots + numberOfLocals;
1887
J9MonitorEnterRecord *enterRecord = osrFrame->monitorEnterRecords;
1888
1889
#ifdef J9VM_INTERP_STACKWALK_TRACING
1890
{
1891
J9Method *stateMethod = walkState->method;
1892
swPrintf(walkState, 3, "\tJIT-OSRFrame = %p, bytecodePC = %p, numberOfLocals = %d, maxStack = %d, pendingStackHeight = %d\n", osrFrame, bytecodePC, numberOfLocals, maxStack, pendingStackHeight);
1893
walkState->method = method;
1894
swPrintMethod(walkState);
1895
walkState->method = stateMethod;
1896
}
1897
#endif
1898
walkBytecodeFrameSlots(walkState, method, offsetPC,
1899
localSlots - 1, pendingStackHeight,
1900
nextFrame - 1, numberOfLocals, TRUE);
1901
while (NULL != enterRecord) {
1902
#ifdef J9VM_INTERP_STACKWALK_TRACING
1903
swPrintf(walkState, 3, "\tJIT-OSR-monitorEnterRecord = %p\n", enterRecord);
1904
#endif
1905
WALK_O_SLOT(&enterRecord->object);
1906
enterRecord = enterRecord->next;
1907
}
1908
return (J9OSRFrame*)nextFrame;
1909
}
1910
1911
1912
/**
1913
* Walk the stack slots in all frames in the OSR buffer.
1914
*
1915
* @param[in] *walkState current J9StackWalkState pointer
1916
* @param[in] *osrBuffer the OSR buffer
1917
*/
1918
static void
1919
jitWalkOSRBuffer(J9StackWalkState *walkState, J9OSRBuffer *osrBuffer)
1920
{
1921
UDATA numberOfFrames = osrBuffer->numberOfFrames;
1922
J9OSRFrame *currentFrame = (J9OSRFrame*)(osrBuffer + 1);
1923
1924
#ifdef J9VM_INTERP_STACKWALK_TRACING
1925
swPrintf(walkState, 3, "\tJIT-OSRBuffer = %p, numberOfFrames = %d\n", osrBuffer, numberOfFrames);
1926
#endif
1927
1928
/* Walk all of the frames (assume there is at least one) */
1929
1930
do {
1931
currentFrame = jitWalkOSRFrame(walkState, currentFrame);
1932
numberOfFrames -= 1;
1933
} while (0 != numberOfFrames);
1934
}
1935
1936