/* * This file is part of the Jikes RVM project (http://jikesrvm.org). * * This file is licensed to You under the Eclipse Public License (EPL); * You may not use this file except in compliance with the License. You * may obtain a copy of the License at * * http://www.opensource.org/licenses/eclipse-1.0.php * * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. */ package org.mmtk.harness.vm; import org.mmtk.harness.lang.Trace; import org.mmtk.harness.lang.Trace.Item; import org.mmtk.harness.sanity.FromSpaceInvariant; import org.mmtk.plan.Simple; import org.mmtk.plan.TraceLocal; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.ObjectReference; /** * Debugger support for the MMTk harness */ public final class Debug extends org.mmtk.vm.Debug { /** * Enable MMTk debugger support */ @Override public boolean isEnabled() { return true; } private String format(ObjectReference obj) { if (obj.isNull()) { return obj.toString(); } return ObjectModel.getString(obj); } private String format(Address addr) { return ObjectModel.addressAndSpaceString(addr); } /** * @see org.mmtk.vm.Debug#arrayRemsetEntry(org.vmmagic.unboxed.Address, org.vmmagic.unboxed.Address) */ @Override public void arrayRemsetEntry(Address start, Address guard) { Trace.trace(Item.REMSET, "arrayRemset: [%s,%s)", start, guard); } /** * @see org.mmtk.vm.Debug#modbufEntry(org.vmmagic.unboxed.ObjectReference) */ @Override public void modbufEntry(ObjectReference object) { Trace.trace(Item.REMSET, "modbuf: %s", format(object)); } /** * @see org.mmtk.vm.Debug#remsetEntry(org.vmmagic.unboxed.Address) */ @Override public void remsetEntry(Address slot) { try { Trace.trace(Item.REMSET, "remset: %s->%s", format(slot), format(slot.loadObjectReference())); } catch (Throwable e) { System.err.printf("Error encountered processing remset entry %s%n", slot); throw new RuntimeException(e); } } /** * @see org.mmtk.vm.Debug#globalPhase(short, boolean) */ @Override public void globalPhase(short phaseId, boolean before) { if (phaseId == Simple.RELEASE && before) { new FromSpaceInvariant(); } } /** * @see org.mmtk.vm.Debug#traceObject(org.mmtk.plan.TraceLocal, org.vmmagic.unboxed.ObjectReference) */ @Override public void traceObject(TraceLocal trace, ObjectReference object) { Trace.trace(Item.TRACEOBJECT, "traceObject: %s", format(object)); } /** * Trace insertions at the head of a queue * @param value Value inserted */ @Override public void queueHeadInsert(String queueName, Address value) { Trace.trace(Item.QUEUE, "head insert %s to %s", value, queueName); } /** * Trace removals from the head of a queue * @param value Value inserted */ @Override public void queueHeadRemove(String queueName, Address value) { Trace.trace(Item.QUEUE, "head remove %s from %s", value, queueName); } /** * Trace insertions at the tail of a queue * @param value Value inserted */ @Override public void queueTailInsert(String queueName, Address value) { Trace.trace(Item.QUEUE, "tail insert %s to %s", value, queueName); } /** * Trace removals from the tail of a queue * @param value Value removed */ @Override public void queueTailRemove(String queueName, Address value) { Trace.trace(Item.QUEUE, "tail remove %s from %s", value, queueName); } }