@@ -91,9 +91,40 @@ static void dropToCurrentFrame (J9StackWalkState * walkState);
91
91
/* The minimum number of stack slots that a stack frame can occupy */
92
92
#define J9_STACKWALK_MIN_FRAME_SLOTS (OMR_MIN(sizeof(J9JITFrame), sizeof(J9SFStackFrame)) / sizeof(UDATA))
93
93
94
+ static VMINLINE UDATA
95
+ maxFramesOnStack (J9StackWalkState * walkState )
96
+ {
97
+ J9VMThread * walkThread = walkState -> walkThread ;
98
+ J9JITConfig * jitConfig = walkThread -> javaVM -> jitConfig ;
99
+ UDATA * endOfStack = walkThread -> stackObject -> end ;
100
+ UDATA * sp = walkState -> walkThread -> sp ;
101
+ UDATA maxFrames = (endOfStack - sp ) / J9_STACKWALK_MIN_FRAME_SLOTS ;
102
+
103
+ if (NULL != jitConfig ) {
104
+ if (J9_ARE_NO_BITS_SET (walkState -> flags , J9_STACKWALK_SKIP_INLINES )) {
105
+ /* It's possible every frame on the stack is a fully inlined JIT frame */
106
+ maxFrames *= (jitConfig -> maxInlineDepth + 1 );
107
+ }
108
+ }
109
+
110
+ if (J9_ARE_NO_BITS_SET (walkState -> flags , J9_STACKWALK_NO_ERROR_REPORT )) {
111
+ UDATA * stackStart = J9_LOWEST_STACK_SLOT (walkState -> walkThread );
112
+ #if defined(J9VM_INTERP_STACKWALK_TRACING )
113
+ Assert_VRB_true (sp >= stackStart );
114
+ Assert_VRB_true (sp <= endOfStack );
115
+ #else /* J9VM_INTERP_STACKWALK_TRACING */
116
+ Assert_VM_true (sp >= stackStart );
117
+ Assert_VM_true (sp <= endOfStack );
118
+ #endif /* J9VM_INTERP_STACKWALK_TRACING */
119
+ }
120
+
121
+ return maxFrames ;
122
+ }
123
+
94
124
UDATA walkStackFrames (J9VMThread * currentThread , J9StackWalkState * walkState )
95
125
{
96
- UDATA rc = (walkState -> walkThread -> privateFlags & J9_PRIVATE_FLAGS_STACK_CORRUPT ) ? J9_STACKWALK_RC_STACK_CORRUPT : J9_STACKWALK_RC_NONE ;
126
+ UDATA rc = J9_STACKWALK_RC_NONE ;
127
+ UDATA walkRC = 0 ;
97
128
J9Method * nextLiterals ;
98
129
UDATA * nextA0 ;
99
130
UDATA savedFlags = walkState -> flags ;
@@ -120,9 +151,15 @@ UDATA walkStackFrames(J9VMThread *currentThread, J9StackWalkState *walkState)
120
151
walkState -> flags &= ~J9_STACKWALK_RESUME ;
121
152
goto resumeInterpreterWalk ;
122
153
}
123
- if (currentThread != NULL ) {
154
+
155
+ walkState -> loopBreaker = 0 ;
156
+ if (NULL != currentThread ) {
124
157
oldState = currentThread -> activeWalkState ;
125
158
currentThread -> activeWalkState = walkState ;
159
+ if (J9_ARE_ANY_BITS_SET (currentThread -> privateFlags2 , J9_PRIVATE_FLAGS2_ASYNC_GET_CALL_TRACE )) {
160
+ /* Add one because walkFrames decrements loopBreaker and bails when it reaches 0 */
161
+ walkState -> loopBreaker = maxFramesOnStack (walkState ) + 1 ;
162
+ }
126
163
}
127
164
128
165
walkState -> javaVM = walkState -> walkThread -> javaVM ;
@@ -330,7 +367,9 @@ UDATA walkStackFrames(J9VMThread *currentThread, J9StackWalkState *walkState)
330
367
331
368
/* Walk the frame */
332
369
333
- if (walkFrame (walkState ) != J9_STACKWALK_KEEP_ITERATING ) {
370
+ walkRC = walkFrame (walkState );
371
+ if (J9_STACKWALK_KEEP_ITERATING != walkRC ) {
372
+ rc = walkRC ;
334
373
goto terminationPoint ;
335
374
}
336
375
resumeInterpreterWalk :
@@ -342,7 +381,9 @@ UDATA walkStackFrames(J9VMThread *currentThread, J9StackWalkState *walkState)
342
381
#ifdef J9VM_INTERP_NATIVE_SUPPORT
343
382
if (walkState -> frameFlags & J9_STACK_FLAGS_JIT_TRANSITION_TO_INTERPRETER_MASK ) {
344
383
resumeJitWalk :
345
- if (jitWalkStackFrames (walkState ) != J9_STACKWALK_KEEP_ITERATING ) {
384
+ walkRC = jitWalkStackFrames (walkState );
385
+ if (J9_STACKWALK_KEEP_ITERATING != walkRC ) {
386
+ rc = walkRC ;
346
387
goto terminationPoint ;
347
388
}
348
389
walkState -> decompilationRecord = NULL ;
@@ -400,12 +441,23 @@ UDATA walkStackFrames(J9VMThread *currentThread, J9StackWalkState *walkState)
400
441
currentThread -> activeWalkState = oldState ;
401
442
}
402
443
444
+ if (J9_ARE_ANY_BITS_SET (walkState -> walkThread -> privateFlags , J9_PRIVATE_FLAGS_STACK_CORRUPT )) {
445
+ rc = J9_STACKWALK_RC_STACK_CORRUPT ;
446
+ }
447
+
403
448
return rc ;
404
449
}
405
450
406
451
407
452
UDATA walkFrame (J9StackWalkState * walkState )
408
453
{
454
+ if (0 != walkState -> loopBreaker ) {
455
+ walkState -> loopBreaker -= 1 ;
456
+ if (0 == walkState -> loopBreaker ) {
457
+ return J9_STACKWALK_RC_STACK_CORRUPT ;
458
+ }
459
+ }
460
+
409
461
if (walkState -> flags & J9_STACKWALK_VISIBLE_ONLY ) {
410
462
411
463
if ((((UDATA ) walkState -> pc == J9SF_FRAME_TYPE_NATIVE_METHOD ) || ((UDATA ) walkState -> pc == J9SF_FRAME_TYPE_JNI_NATIVE_METHOD )) && !(walkState -> flags & J9_STACKWALK_INCLUDE_NATIVES )) {
@@ -519,38 +571,17 @@ UDATA walkFrame(J9StackWalkState * walkState)
519
571
static UDATA allocateCache (J9StackWalkState * walkState )
520
572
{
521
573
PORT_ACCESS_FROM_WALKSTATE (walkState );
522
- UDATA * endOfStack = walkState -> walkThread -> stackObject -> end ;
523
- UDATA framesPresent = 0 ;
574
+ UDATA framesPresent = maxFramesOnStack (walkState );
524
575
UDATA cacheElementSize = 0 ;
525
576
UDATA cacheSize = 0 ;
526
577
UDATA * stackStart = J9_LOWEST_STACK_SLOT (walkState -> walkThread );
527
578
UDATA * sp = walkState -> walkThread -> sp ;
528
579
529
- if (J9_ARE_NO_BITS_SET (walkState -> flags , J9_STACKWALK_NO_ERROR_REPORT )) {
530
- #if defined(J9VM_INTERP_STACKWALK_TRACING )
531
- Assert_VRB_true (sp >= stackStart );
532
- Assert_VRB_true (sp <= endOfStack );
533
- #else /* J9VM_INTERP_STACKWALK_TRACING */
534
- Assert_VM_true (sp >= stackStart );
535
- Assert_VM_true (sp <= endOfStack );
536
- #endif /* J9VM_INTERP_STACKWALK_TRACING */
537
- }
538
-
539
- framesPresent = (endOfStack - sp ) / J9_STACKWALK_MIN_FRAME_SLOTS ;
540
-
541
580
if (walkState -> flags & J9_STACKWALK_CACHE_PCS ) ++ cacheElementSize ;
542
581
if (walkState -> flags & J9_STACKWALK_CACHE_CPS ) ++ cacheElementSize ;
543
582
if (walkState -> flags & J9_STACKWALK_CACHE_METHODS ) ++ cacheElementSize ;
544
583
545
584
cacheSize = framesPresent * cacheElementSize ;
546
- #ifdef J9VM_INTERP_NATIVE_SUPPORT
547
- if (walkState -> walkThread -> javaVM -> jitConfig ) {
548
- if (!(walkState -> flags & J9_STACKWALK_SKIP_INLINES )) {
549
- /* computations above assume 1 cacheElement per frame, in reality there may be (maxInlinedMethods + 1) elements per frame */
550
- cacheSize *= (walkState -> walkThread -> javaVM -> jitConfig -> maxInlineDepth + 1 );
551
- }
552
- }
553
- #endif
554
585
555
586
if ((walkState != walkState -> walkThread -> stackWalkState ) || ((UDATA ) (sp - stackStart ) < cacheSize )
556
587
#if defined (J9VM_INTERP_VERBOSE ) || defined (J9VM_PROF_EVENT_REPORTING )
0 commit comments