From: <jik...@li...> - 2013-01-12 22:29:58
|
details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/d5a3160c650c changeset: 10578:d5a3160c650c user: Erik Brangs <eri...@gm...> date: Sat Jan 12 16:26:51 2013 +0100 description: Merge with default at 832d6cfbf79861bb775189d9f803f314a555e3d3 (no additional changes). details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/3de2c9bd5cd4 changeset: 10579:3de2c9bd5cd4 user: Erik Brangs <eri...@gm...> date: Sat Jan 12 19:41:14 2013 +0100 description: Always pass the correct class library name to the AnnotationAdder. Note: AnnotationAdder is not yet updated for the OpenJDK class library. I've added a TODO as a reminder. details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/2d7467194ef0 changeset: 10580:2d7467194ef0 user: Erik Brangs <eri...@gm...> date: Sat Jan 12 20:00:57 2013 +0100 description: Remove some unused debug outputs. details: http://hg.code.sourceforge.net/p/jikesrvm/code/rev/9bb0434a7530 changeset: 10581:9bb0434a7530 user: Erik Brangs <eri...@gm...> date: Sat Jan 12 22:19:33 2013 +0100 description: Cleanups in org.jikesrvm.VM to improve readability of diff to default branch. diffstat: MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java | 5 +- MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/TraceInterface.java | 4 +- MMTk/src/org/mmtk/plan/Plan.java | 1 + MMTk/src/org/mmtk/plan/refcount/RCBase.java | 48 +- MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java | 99 ++- MMTk/src/org/mmtk/plan/refcount/RCBaseConstraints.java | 3 + MMTk/src/org/mmtk/plan/refcount/RCBaseMutator.java | 16 +- MMTk/src/org/mmtk/plan/refcount/RCHeader.java | 39 +- MMTk/src/org/mmtk/plan/refcount/generational/GenRCCollector.java | 6 + MMTk/src/org/mmtk/plan/refcount/generational/GenRCConstraints.java | 2 + MMTk/src/org/mmtk/policy/Space.java | 6 +- MMTk/src/org/mmtk/utility/heap/FreeListPageResource.java | 2 +- MMTk/src/org/mmtk/utility/heap/Map.java | 24 +- MMTk/src/org/mmtk/utility/heap/MonotonePageResource.java | 2 +- MMTk/src/org/mmtk/utility/options/Options.java | 1 + MMTk/src/org/mmtk/utility/options/UseReturnBarrier.java | 24 + build.xml | 3 +- rvm/src/org/jikesrvm/VM.java | 180 +++++--- rvm/src/org/jikesrvm/classloader/BootstrapClassLoader.java | 2 - rvm/src/org/jikesrvm/classloader/TableBasedDynamicLinker.java | 1 - rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java | 2 +- rvm/src/org/jikesrvm/compilers/baseline/ppc/BaselineCompilerImpl.java | 12 +- rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java | 6 + rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java | 1 - rvm/src/org/jikesrvm/compilers/opt/bc2ir/ppc/GenerateMachineSpecificMagic.java | 4 +- rvm/src/org/jikesrvm/compilers/opt/regalloc/ppc/StackManager.java | 14 +- rvm/src/org/jikesrvm/compilers/opt/runtimesupport/OptSaveVolatile.java | 2 +- rvm/src/org/jikesrvm/ia32/BaselineConstants.java | 4 + rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java | 47 ++ rvm/src/org/jikesrvm/ia32/Registers.java | 2 +- rvm/src/org/jikesrvm/jni/ppc/JNICompiler.java | 8 +- rvm/src/org/jikesrvm/osr/ExecutionStateExtractor.java | 4 +- rvm/src/org/jikesrvm/osr/ia32/OptExecutionStateExtractor.java | 2 +- rvm/src/org/jikesrvm/osr/ppc/BaselineExecutionStateExtractor.java | 2 +- rvm/src/org/jikesrvm/osr/ppc/CodeInstaller.java | 2 +- rvm/src/org/jikesrvm/osr/ppc/PostThreadSwitch.java | 2 +- rvm/src/org/jikesrvm/ppc/BaselineConstants.java | 4 + rvm/src/org/jikesrvm/ppc/MachineSpecificPowerPC.java | 2 +- rvm/src/org/jikesrvm/ppc/OutOfLineMachineCode.java | 4 +- rvm/src/org/jikesrvm/ppc/StackframeLayoutConstants.java | 2 +- rvm/src/org/jikesrvm/runtime/ArchEntrypoints.java | 7 +- rvm/src/org/jikesrvm/runtime/DynamicLinker.java | 2 +- rvm/src/org/jikesrvm/runtime/Entrypoints.java | 1 + rvm/src/org/jikesrvm/runtime/Magic.java | 34 +- rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java | 15 +- rvm/src/org/jikesrvm/runtime/StackTrace.java | 2 +- rvm/src/org/jikesrvm/scheduler/RVMThread.java | 218 +++++++++- rvm/src/org/jikesrvm/tools/header_gen/GenArch_ppc.java | 10 +- tools/asm-tasks/src/org/jikesrvm/tools/asm/AnnotationAdder.java | 2 + tools/bootImageRunner/ppc/bootThread.c | 4 +- tools/bootImageRunner/ppc/libvm.c | 12 +- 51 files changed, 697 insertions(+), 204 deletions(-) diffs (truncated from 1945 to 300 lines): diff --git a/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java b/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java --- a/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java +++ b/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java @@ -183,7 +183,7 @@ fp = thread.getContextRegisters().getInnermostFramePointer(); initialIPLoc = thread.getContextRegisters().getIPLocation(); } else { /* top frame explicitly defined */ - ip = Magic.getReturnAddress(topFrame); + ip = Magic.getReturnAddress(topFrame, thread); fp = Magic.getCallerFramePointer(topFrame); initialIPLoc = thread.getContextRegisters().getIPLocation(); // FIXME } @@ -277,7 +277,7 @@ VM.sysWriteln("Thread ",RVMThread.getCurrentThreadSlot()," at fp = ",fp); } prevFp = scanFrame(verbosity); - ip = Magic.getReturnAddress(fp); + ip = Magic.getReturnAddress(fp, thread); fp = Magic.getCallerFramePointer(fp); } } @@ -414,6 +414,7 @@ if (verbosity >= 2) printMethodHeader(); /* get the code associated with this frame */ + if (RVMThread.DEBUG_STACK_TRAMPOLINE) VM.sysWriteln(thread.getId(), fp, compiledMethod.getMethod()); Offset offset = compiledMethod.getInstructionOffset(ip); /* initialize MapIterator for this frame */ diff --git a/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/TraceInterface.java b/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/TraceInterface.java --- a/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/TraceInterface.java +++ b/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/TraceInterface.java @@ -134,7 +134,7 @@ int compiledMethodID = 0; Offset ipOffset = Offset.zero(); Address fp = Magic.getFramePointer(); - Address ip = Magic.getReturnAddress(fp); + Address ip = Magic.getReturnAddressUnchecked(fp); fp = Magic.getCallerFramePointer(fp); // This code borrows heavily from RVMThread.dumpStack while (Magic.getCallerFramePointer(fp).NE(STACKFRAME_SENTINEL_FP)) { @@ -178,7 +178,7 @@ } } } - ip = Magic.getReturnAddress(fp); + ip = Magic.getReturnAddressUnchecked(fp); fp = Magic.getCallerFramePointer(fp); } if (m != null) { diff --git a/MMTk/src/org/mmtk/plan/Plan.java b/MMTk/src/org/mmtk/plan/Plan.java --- a/MMTk/src/org/mmtk/plan/Plan.java +++ b/MMTk/src/org/mmtk/plan/Plan.java @@ -174,6 +174,7 @@ Options.sanityCheck = new SanityCheck(); Options.debugAddress = new DebugAddress(); Options.perfEvents = new PerfEvents(); + Options.useReturnBarrier = new UseReturnBarrier(); Options.threads = new Threads(); Options.cycleTriggerThreshold = new CycleTriggerThreshold(); Map.finalizeStaticSpaceMap(); diff --git a/MMTk/src/org/mmtk/plan/refcount/RCBase.java b/MMTk/src/org/mmtk/plan/refcount/RCBase.java --- a/MMTk/src/org/mmtk/plan/refcount/RCBase.java +++ b/MMTk/src/org/mmtk/plan/refcount/RCBase.java @@ -55,6 +55,9 @@ public static boolean performCycleCollection; public static final short BT_CLOSURE = Phase.createSimple("closure-bt"); + /** True if we are building for generational RC */ + public static final boolean BUILD_FOR_GENRC = ((RCBaseConstraints) VM.activePlan.constraints()).buildForGenRC(); + // CHECKSTYLE:OFF /** @@ -74,10 +77,21 @@ Phase.scheduleGlobal (BT_CLOSURE), Phase.scheduleCollector (BT_CLOSURE)); + protected static final short genRCCollectionPhase = Phase.createComplex("release", null, + Phase.scheduleGlobal (PROCESS_OLDROOTBUFFER), + Phase.scheduleCollector (PROCESS_OLDROOTBUFFER), + Phase.scheduleGlobal (PROCESS_NEWROOTBUFFER), + Phase.scheduleCollector (PROCESS_NEWROOTBUFFER), + Phase.scheduleMutator (PROCESS_DECBUFFER), + Phase.scheduleGlobal (PROCESS_DECBUFFER), + Phase.scheduleCollector (PROCESS_DECBUFFER), + Phase.scheduleGlobal (BT_CLOSURE), + Phase.scheduleCollector (BT_CLOSURE)); + /** * Perform the initial determination of liveness from the roots. */ - protected static final short rootClosurePhase = Phase.createComplex("initial-closure", null, + protected static final short refCountRootClosurePhase = Phase.createComplex("initial-closure", null, Phase.scheduleMutator (PREPARE), Phase.scheduleGlobal (PREPARE), Phase.scheduleCollector (PREPARE), @@ -88,15 +102,36 @@ Phase.scheduleGlobal (CLOSURE), Phase.scheduleCollector (CLOSURE)); + protected static final short genRCRootClosurePhase = Phase.createComplex("initial-closure", null, + Phase.scheduleMutator (PREPARE), + Phase.scheduleGlobal (PREPARE), + Phase.scheduleCollector (PREPARE), + Phase.scheduleComplex (prepareStacks), + Phase.scheduleCollector (STACK_ROOTS), + Phase.scheduleCollector (ROOTS), + Phase.scheduleGlobal (ROOTS), + Phase.scheduleMutator (PROCESS_MODBUFFER), + Phase.scheduleGlobal (PROCESS_MODBUFFER), + Phase.scheduleCollector (PROCESS_MODBUFFER), + Phase.scheduleGlobal (CLOSURE), + Phase.scheduleCollector (CLOSURE)); + /** * This is the phase that is executed to perform a collection. */ - public short collection = Phase.createComplex("collection", null, + public short refCountCollection = Phase.createComplex("collection", null, Phase.scheduleComplex(initPhase), - Phase.scheduleComplex(rootClosurePhase), + Phase.scheduleComplex(refCountRootClosurePhase), Phase.scheduleComplex(refCountCollectionPhase), Phase.scheduleComplex(completeClosurePhase), Phase.scheduleComplex(finishPhase)); + + public short genRCCollection = Phase.createComplex("collection", null, + Phase.scheduleComplex(initPhase), + Phase.scheduleComplex(genRCRootClosurePhase), + Phase.scheduleComplex(genRCCollectionPhase), + Phase.scheduleComplex(completeClosurePhase), + Phase.scheduleComplex(finishPhase)); // CHECKSTYLE:ON @@ -138,7 +173,6 @@ public RCBase() { Options.noReferenceTypes.setDefaultValue(true); Options.noFinalizer.setDefaultValue(true); - rootTrace = new Trace(metaDataSpace); backupTrace = new Trace(metaDataSpace); rcSweeper = new BTSweeper(); @@ -149,7 +183,6 @@ @Interruptible public void processOptions() { super.processOptions(); - if (!Options.noReferenceTypes.getValue()) { VM.assertions.fail("Reference Types are not supported by RC"); } @@ -181,7 +214,8 @@ super.collectionPhase(phaseId); if (CC_ENABLED) { ccForceFull = Options.fullHeapSystemGC.getValue(); - performCycleCollection |= (collectionAttempt > 1) || emergencyCollection || ccForceFull; + if (BUILD_FOR_GENRC) performCycleCollection = (collectionAttempt > 1) || emergencyCollection || ccForceFull; + else performCycleCollection |= (collectionAttempt > 1) || emergencyCollection || ccForceFull; if (performCycleCollection && Options.verbose.getValue() > 0) Log.write(" [CC] "); } return; @@ -243,7 +277,7 @@ } else { rcSpace.release(); } - performCycleCollection = getPagesAvail() < Options.cycleTriggerThreshold.getPages(); + if (!BUILD_FOR_GENRC) performCycleCollection = getPagesAvail() < Options.cycleTriggerThreshold.getPages(); return; } diff --git a/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java b/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java --- a/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java +++ b/MMTk/src/org/mmtk/plan/refcount/RCBaseCollector.java @@ -81,7 +81,8 @@ */ @Override public void collect() { - Phase.beginNewPhaseStack(Phase.scheduleComplex(global().collection)); + if (RCBase.BUILD_FOR_GENRC) Phase.beginNewPhaseStack(Phase.scheduleComplex(global().genRCCollection)); + else Phase.beginNewPhaseStack(Phase.scheduleComplex(global().refCountCollection)); } @Override @@ -119,27 +120,39 @@ if (RCBase.CC_BACKUP_TRACE && RCBase.performCycleCollection) { while(!(current = newRootBuffer.pop()).isNull()) { if (RCHeader.testAndMark(current)) { - if (RCHeader.initRC(current) == RCHeader.INC_NEW) { - modBuffer.push(current); + if (RCBase.BUILD_FOR_GENRC) { + RCHeader.initRC(current); + } else { + if (RCHeader.initRC(current) == RCHeader.INC_NEW) { + modBuffer.push(current); + } } backupTrace.processNode(current); } else { - if (RCHeader.incRC(current) == RCHeader.INC_NEW) { - modBuffer.push(current); + if (RCBase.BUILD_FOR_GENRC) { + RCHeader.incRC(current); + } else { + if (RCHeader.incRC(current) == RCHeader.INC_NEW) { + modBuffer.push(current); + } } } } - modBuffer.flushLocal(); + if (!RCBase.BUILD_FOR_GENRC) modBuffer.flushLocal(); return; } while(!(current = newRootBuffer.pop()).isNull()) { - if (RCHeader.incRC(current) == RCHeader.INC_NEW) { - modBuffer.push(current); + if (RCBase.BUILD_FOR_GENRC) { + RCHeader.incRC(current); + } else { + if (RCHeader.incRC(current) == RCHeader.INC_NEW) { + modBuffer.push(current); + } } oldRootBuffer.push(current); } oldRootBuffer.flushLocal(); - modBuffer.flushLocal(); + if (!RCBase.BUILD_FOR_GENRC) modBuffer.flushLocal(); return; } @@ -147,8 +160,10 @@ ObjectReference current; while(!(current = modBuffer.pop()).isNull()) { RCHeader.makeUnlogged(current); - if (Space.isInSpace(RCBase.REF_COUNT, current)) { - ExplicitFreeListSpace.testAndSetLiveBit(current); + if (!RCBase.BUILD_FOR_GENRC) { + if (Space.isInSpace(RCBase.REF_COUNT, current)) { + ExplicitFreeListSpace.testAndSetLiveBit(current); + } } VM.scanning.scanObject(getModifiedProcessor(), current); } @@ -158,7 +173,34 @@ if (phaseId == RCBase.PROCESS_DECBUFFER) { ObjectReference current; if (RCBase.CC_BACKUP_TRACE && RCBase.performCycleCollection) { - while(!(current = decBuffer.pop()).isNull()) { + if (!RCBase.BUILD_FOR_GENRC) { + while(!(current = decBuffer.pop()).isNull()) { + if (RCHeader.isNew(current)) { + if (Space.isInSpace(RCBase.REF_COUNT, current)) { + RCBase.rcSpace.free(current); + } else if (Space.isInSpace(RCBase.REF_COUNT_LOS, current)) { + RCBase.rcloSpace.free(current); + } else if (Space.isInSpace(RCBase.IMMORTAL, current)) { + VM.scanning.scanObject(zero, current); + } + } + } + } + return; + } + while(!(current = decBuffer.pop()).isNull()) { + if (RCBase.BUILD_FOR_GENRC) { + if (RCHeader.decRC(current) == RCHeader.DEC_KILL) { + decBuffer.processChildren(current); + if (Space.isInSpace(RCBase.REF_COUNT, current)) { + RCBase.rcSpace.free(current); + } else if (Space.isInSpace(RCBase.REF_COUNT_LOS, current)) { + RCBase.rcloSpace.free(current); + } else if (Space.isInSpace(RCBase.IMMORTAL, current)) { + VM.scanning.scanObject(zero, current); + } + } + } else { if (RCHeader.isNew(current)) { if (Space.isInSpace(RCBase.REF_COUNT, current)) { RCBase.rcSpace.free(current); @@ -167,28 +209,16 @@ } else if (Space.isInSpace(RCBase.IMMORTAL, current)) { VM.scanning.scanObject(zero, current); } - } - } - return; - } - while(!(current = decBuffer.pop()).isNull()) { - if (RCHeader.isNew(current)) { - if (Space.isInSpace(RCBase.REF_COUNT, current)) { - RCBase.rcSpace.free(current); - } else if (Space.isInSpace(RCBase.REF_COUNT_LOS, current)) { - RCBase.rcloSpace.free(current); - } else if (Space.isInSpace(RCBase.IMMORTAL, current)) { - VM.scanning.scanObject(zero, current); - } - } else { - if (RCHeader.decRC(current) == RCHeader.DEC_KILL) { |