Skip to content

Commit 54734e9

Browse files
Harshitha PopuriHarshitha Popuri
authored andcommitted
Add third entry point getROMMethodInfoForOSRFrame
1 parent f7946db commit 54734e9

File tree

3 files changed

+87
-12
lines changed

3 files changed

+87
-12
lines changed

runtime/codert_vm/jswalk.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ UDATA jitWalkStackFrames(J9StackWalkState *walkState)
215215
lswRecord(walkState, LSW_TYPE_METHOD, walkState->method);
216216
lswRecord(walkState, LSW_TYPE_JIT_FRAME_INFO, walkState);
217217
#endif
218-
initializeBasicROMMethodInfo(walkState, J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method));
218+
//initializeBasicROMMethodInfo(walkState, J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method));
219+
getROMMethodInfoForBytecodePC(walkState, J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method), walkState->bytecodePCOffset);
219220

220221
if ((rc = walkFrame(walkState)) != J9_STACKWALK_KEEP_ITERATING) {
221222
return rc;
@@ -255,7 +256,8 @@ UDATA jitWalkStackFrames(J9StackWalkState *walkState)
255256
#ifdef J9VM_INTERP_LINEAR_STACKWALK_TRACING
256257
lswRecord(walkState, LSW_TYPE_JIT_FRAME_INFO, walkState);
257258
#endif
258-
initializeBasicROMMethodInfo(walkState, J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method));
259+
//initializeBasicROMMethodInfo(walkState, J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method));
260+
getROMMethodInfoForBytecodePC(walkState, J9_ROM_METHOD_FROM_RAM_METHOD(walkState->method), walkState->bytecodePCOffset);
259261
if ((rc = walkFrame(walkState)) != J9_STACKWALK_KEEP_ITERATING) {
260262
return rc;
261263
}
@@ -1985,7 +1987,8 @@ jitWalkOSRFrame(J9StackWalkState *walkState, J9OSRFrame *osrFrame)
19851987
J9MonitorEnterRecord *enterRecord = osrFrame->monitorEnterRecords;
19861988
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method);
19871989

1988-
initializeBasicROMMethodInfo(walkState, romMethod);
1990+
//initializeBasicROMMethodInfo(walkState, romMethod);
1991+
getROMMethodInfoForOSRFrame(walkState, osrFrame);
19891992

19901993
#ifdef J9VM_INTERP_STACKWALK_TRACING
19911994
{

runtime/oti/stackmap_api.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,14 @@ getROMMethodInfoForROMMethod(J9StackWalkState *walkState, J9ROMMethod *romMethod
223223
void
224224
getROMMethodInfoForBytecodePC(J9StackWalkState *walkState, J9ROMMethod *romMethod, UDATA pc);
225225

226+
/**
227+
* @brief
228+
* @param walkState
229+
* @param osrFrame
230+
*/
231+
void
232+
getROMMethodInfoForOSRFrame(J9StackWalkState *walkState, J9OSRFrame *osrFrame);
233+
226234
#ifdef __cplusplus
227235
}
228236
#endif

runtime/stackmap/mapcache.cpp

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,17 @@ updateROMMethodInfoCache(J9JavaVM *vm, J9ClassLoader *classLoader, J9ROMMethodIn
112112
}
113113

114114
if (NULL != cache) {
115-
hashTableAdd(cache, info);
115+
PORT_ACCESS_FROM_JAVAVM(vm);
116+
J9ROMMethodInfo *copy = (J9ROMMethodInfo *) j9mem_allocate_memory(sizeof(J9ROMMethodInfo), J9MEM_CATEGORY_VM);
117+
*copy = *info;
118+
hashTableAdd(cache, copy);
116119
}
117120

118121
omrthread_monitor_exit(mapCacheMutex);
119122
}
120123

121124
static void
122-
populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void *key, UDATA pc, bool computeStackAndLocals)
125+
populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void *key, UDATA pc, bool computeStackAndLocals, UDATA pendingCount, UDATA numberOfLocals)
123126
{
124127
J9Method *method = walkState->method;
125128
J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD(method)->classLoader;
@@ -131,7 +134,6 @@ populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void
131134

132135
/* Always compute argument bits */
133136
j9localmap_ArgBitsForPC0(romClass, romMethod, newInfo.argbits);
134-
135137
if (computeStackAndLocals) {
136138
/* Compute stack map for this PC */
137139
j9stackmap_StackBitsForPC(
@@ -146,6 +148,7 @@ populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void
146148
NULL);
147149

148150
/* Compute local variable map for this PC */
151+
149152
vm->localMapFunction(
150153
vm->portLibrary,
151154
romClass,
@@ -163,26 +166,58 @@ populateROMMethodInfo(J9StackWalkState *walkState, J9ROMMethod *romMethod, void
163166
newInfo.tempCount = J9_TEMP_COUNT_FROM_ROM_METHOD(romMethod);
164167

165168
/* Insert into cache */
166-
updateROMMethodInfoCache(vm, classLoader, &newInfo);
169+
//updateROMMethodInfoCache(vm, classLoader, &newInfo);
170+
PORT_ACCESS_FROM_JAVAVM(vm);
171+
J9ROMMethodInfo *stored = (J9ROMMethodInfo *) j9mem_allocate_memory(sizeof(J9ROMMethodInfo), J9MEM_CATEGORY_VM);
172+
if (NULL == stored) {
173+
walkState->romMethodInfo = newInfo;
174+
} else {
175+
*stored = newInfo;
176+
updateROMMethodInfoCache(vm, classLoader, stored);
177+
walkState->romMethodInfo = *stored;
178+
}
179+
}
180+
181+
static UDATA
182+
computePendingCountForBytecode(J9ROMMethod *romMethod)
183+
{
184+
UDATA pendingCount = 0;
167185

168-
/* Reflect into current walkState */
169-
walkState->romMethodInfo = newInfo;
186+
UDATA argCount = romMethod->argCount;
187+
UDATA tempCount = romMethod->tempCount;
188+
189+
pendingCount = argCount + tempCount;
190+
191+
UDATA modifiers = romMethod->modifiers;
192+
193+
if (modifiers & J9AccSynchronized) {
194+
/* Add monitor slot for synchronized methods */
195+
pendingCount += 1;
196+
} else if ((modifiers & (J9AccMethodObjectConstructor | J9AccEmptyMethod)) == J9AccMethodObjectConstructor) {
197+
/* Add extra receiver temp for non-empty Object.<init> */
198+
pendingCount += 1;
199+
}
200+
201+
return pendingCount;
170202
}
171203

172204
void
173205
getROMMethodInfoForROMMethod(J9StackWalkState *walkState, J9ROMMethod *romMethod)
174206
{
175207
J9Method *method = walkState->method;
176208
J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD(method)->classLoader;
177-
209+
if (NULL == walkState->method || walkState->pc == NULL) {
210+
return; // avoid dereference
211+
}
178212
void *key = (void *)romMethod;
179213
J9ROMMethodInfo tmp = {0};
180214

181215
/* Check cache first */
182216
if (!checkROMMethodInfoCache(classLoader, key, &tmp)) {
183217
/* Cache miss or not populated */
184218
initializeBasicROMMethodInfo(walkState, romMethod);
185-
populateROMMethodInfo(walkState, romMethod, key, 0, false);
219+
populateROMMethodInfo(walkState, romMethod, key, 0, false, 0, 0);
220+
//populateROMMethodInfo(walkState, romMethod, key, 0, false);
186221
} else {
187222
/* Cache hit */
188223
walkState->romMethodInfo = tmp;
@@ -194,11 +229,15 @@ void
194229
getROMMethodInfoForBytecodePC(J9StackWalkState *walkState, J9ROMMethod *romMethod, UDATA pc)
195230
{
196231
if (pc <= J9SF_MAX_SPECIAL_FRAME_TYPE || pc >= (UDATA)J9_BYTECODE_SIZE_FROM_ROM_METHOD(romMethod)) {
232+
initializeBasicROMMethodInfo(walkState, romMethod);
197233
return;
198234
}
199235

200236
J9Method *method = walkState->method;
201237
J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD(method)->classLoader;
238+
if (NULL == walkState->method || walkState->pc == NULL) {
239+
return; // avoid dereference
240+
}
202241

203242
void *key = (void *)( (uintptr_t)J9_BYTECODE_START_FROM_ROM_METHOD(romMethod) + (uintptr_t)pc );
204243
J9ROMMethodInfo tmp = {0};
@@ -207,12 +246,37 @@ getROMMethodInfoForBytecodePC(J9StackWalkState *walkState, J9ROMMethod *romMetho
207246
if (!checkROMMethodInfoCache(classLoader, key, &tmp)) {
208247
/* Cache miss or not populated */
209248
initializeBasicROMMethodInfo(walkState, romMethod);
210-
populateROMMethodInfo(walkState, romMethod, key, pc, true);
249+
UDATA pendingCount = computePendingCountForBytecode(romMethod);
250+
UDATA numberOfLocals = romMethod->tempCount + romMethod->argCount;
251+
populateROMMethodInfo(walkState, romMethod, key, pc, true, pendingCount, numberOfLocals);
252+
//populateROMMethodInfo(walkState, romMethod, key, pc, true);
211253
} else {
212254
/* Cache hit */
213255
walkState->romMethodInfo = tmp;
214256
}
215257
}
216258

259+
void
260+
getROMMethodInfoForOSRFrame(J9StackWalkState *walkState, J9OSRFrame *osrFrame)
261+
{
262+
J9Method *method = osrFrame->method;
263+
J9ClassLoader *classLoader = J9_CLASS_FROM_METHOD(method)->classLoader;
264+
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD(method);
265+
266+
/* Use the ROMMethod pointer plus bytecode offset as key */
267+
void *key = (void *)((uintptr_t)J9_BYTECODE_START_FROM_ROM_METHOD(romMethod) + (uintptr_t)osrFrame->bytecodePCOffset);
268+
J9ROMMethodInfo tmp = {0};
269+
270+
/* Check the cache first */
271+
if (!checkROMMethodInfoCache(classLoader, key, &tmp)) {
272+
/* Cache miss or not populated */
273+
initializeBasicROMMethodInfo(walkState, romMethod);
274+
populateROMMethodInfo(walkState, romMethod, key, osrFrame->bytecodePCOffset, true, osrFrame->pendingStackHeight, osrFrame->numberOfLocals);
275+
//populateROMMethodInfo(walkState, romMethod, key, osrFrame->bytecodePCOffset,true);
276+
} else {
277+
/* Cache hit */
278+
walkState->romMethodInfo = tmp;
279+
}
280+
}
217281

218282
} /* extern "C" */

0 commit comments

Comments
 (0)