From: <ste...@us...> - 2006-09-28 06:23:15
|
Revision: 10846 http://svn.sourceforge.net/jikesrvm/?rev=10846&view=rev Author: steveb-oss Date: 2006-09-27 23:23:11 -0700 (Wed, 27 Sep 2006) Log Message: ----------- Fix to what appears to be a long standing stack-scanning bug. Since revision 3170, trap frames have been skipped during stack scanning. This is apparently a bug because a side effect of calling getNextReferenceAddress() is that registeres saved by the callee are put into registerLocations data structure. This means that when a GC occurs with a trap frame on the stack, it will not handle the trapping method propoerly. Revision Links: -------------- http://svn.sourceforge.net/jikesrvm/?rev=3170&view=rev Modified Paths: -------------- rvmroot/trunk/MMTk/ext/vm/JikesRVM/com/ibm/JikesRVM/mm/mmtk/ScanThread.java Modified: rvmroot/trunk/MMTk/ext/vm/JikesRVM/com/ibm/JikesRVM/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/trunk/MMTk/ext/vm/JikesRVM/com/ibm/JikesRVM/mm/mmtk/ScanThread.java 2006-09-27 21:40:28 UTC (rev 10845) +++ rvmroot/trunk/MMTk/ext/vm/JikesRVM/com/ibm/JikesRVM/mm/mmtk/ScanThread.java 2006-09-28 06:23:11 UTC (rev 10846) @@ -329,12 +329,14 @@ scanFrameForObjects(verbosity); /* scan the frame for pointers to code */ - if (processCodeLocations) processFrameForCode(verbosity); + if (processCodeLocations && compiledMethodType != VM_CompiledMethod.TRAP) + processFrameForCode(verbosity); iterator.cleanupPointers(); /* skip preceeding native frames if this frame is a native bridge */ - if (compiledMethod.getMethod().getDeclaringClass().isBridgeFromNative()) { + if (compiledMethodType != VM_CompiledMethod.TRAP && + compiledMethod.getMethod().getDeclaringClass().isBridgeFromNative()) { fp = VM_Runtime.unwindNativeStackFrameForGC(fp); if (verbosity >= 1) Log.write("scanFrame skipping native C frames\n"); } @@ -370,9 +372,6 @@ if (verbosity >= 1) printMethodHeader(); - /* skip over traps */ - if (compiledMethodType == VM_CompiledMethod.TRAP) return false; - /* get the code associated with this frame */ Offset offset = compiledMethod.getInstructionOffset(ip); @@ -612,11 +611,13 @@ private void checkReference(Address refaddr, int verbosity) { ObjectReference ref = refaddr.loadObjectReference(); if (!MM_Interface.validRef(ref)) { - Log.write("\nInvalid ref reported while scanning stack\n"); + Log.writeln(); + Log.writeln("Invalid ref reported while scanning stack"); printMethodHeader(); - Log.write(refaddr); Log.write(":"); MM_Interface.dumpRef(ref); + Log.write(refaddr); Log.write(":"); Log.flush(); MM_Interface.dumpRef(ref); dumpStackFrame(verbosity); - Log.write("\nDumping stack starting at frame with bad ref:\n"); + Log.writeln(); + Log.writeln("Dumping stack starting at frame with bad ref:"); VM_Scheduler.dumpStack(ip, fp); /* dump stack starting at top */ Address top_ip = thread.contextRegisters.getInnermostInstructionAddress(); @@ -688,7 +689,7 @@ start = fp; // start at fp end = fp.loadAddress(); // stop at callers fp } - + for (Address loc = start; loc.LT(end); loc = loc.plus(BYTES_IN_ADDRESS)) { Log.write(loc); Log.write(" ("); Log.write(loc.diff(start)); @@ -700,8 +701,8 @@ if (verbosity >= 3 && MM_Interface.objectInVM(value) && loc.NE(start) && loc.NE(end) ) MM_Interface.dumpRef(value); else - Log.write("\n"); + Log.writeln(); } - Log.write("\n"); + Log.writeln(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |