Skip to content

Commit

Permalink
Eliminate ThreadLocalState routines that were not 64bit safe.
Browse files Browse the repository at this point in the history
Improve the performance of OProfile profiling by not generating line
number tables for the boot image.
  • Loading branch information
captain5050 committed Apr 30, 2010
1 parent 0b092ef commit d38420e
Show file tree
Hide file tree
Showing 10 changed files with 97 additions and 212 deletions.
27 changes: 20 additions & 7 deletions rvm/src/mrp/debug/OProfileListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@

import org.jikesrvm.classloader.Atom;
import org.jikesrvm.compilers.common.CompiledMethod;
import org.jikesrvm.compilers.common.CompiledMethod.DebugInformationVisitor;
import org.jikesrvm.compilers.common.CompiledMethods;
import org.jikesrvm.compilers.common.CompiledMethod.DebugInformationVisitor;
import org.jikesrvm.runtime.Callbacks;
import org.jikesrvm.runtime.Magic;
import org.jikesrvm.runtime.Callbacks.Callback;
import org.jikesrvm.util.StringUtilities;
import org.jikesrvm.VM;
import org.vmmagic.unboxed.Address;
import org.vmmagic.unboxed.Offset;
Expand All @@ -34,6 +35,9 @@ public final class OProfileListener {
/** Debug messages */
private static final boolean DEBUG = false;

/** Profile boot image compiled methods */
private static final boolean profileBootImage = false;

/** Only instance of this class */
private static OProfileListener singleton;

Expand All @@ -56,6 +60,7 @@ public void notify(Object... args) {
CompiledMethod cm = CompiledMethods.getCompiledMethod(i);
if (cm != null && cm.isCompiled()) singleton.describeCompiledMethod(cm);
}

Callbacks.methodCompileCompleteCallbacks.addCallback(
new Callback() {
public void notify(Object... args) {
Expand Down Expand Up @@ -93,24 +98,32 @@ private void describeCompiledMethod(CompiledMethod cm) {
if (DEBUG) VM.sysWriteln("Describing compiled method: "+cm);
String stringSymbolName = cm.symbolName();
if (DEBUG) VM.sysWriteln(" symbol name: "+stringSymbolName);
Atom symbolName = Atom.findOrCreateUnicodeAtom(stringSymbolName);
final byte[] symbolName = StringUtilities.stringToBytesNullTerminated(stringSymbolName);
final Address codeAddress = Magic.objectAsAddress(cm.getEntryCodeArray());
int codeLength = cm.getEntryCodeArray().length();
sysCall.sysOProfileWriteNativeCode(opHandle, symbolName.toByteArray(), codeAddress, codeLength);
sysCall.sysOProfileWriteNativeCode(opHandle, symbolName, codeAddress, codeLength);

final class CompileMapVisitor extends DebugInformationVisitor {
final Address cmap = sysCall.sysOProfileStartCompileMap(opHandle, codeAddress);
public void visit(Offset offs, Atom fileName, int lineNumber) {
if (VM.VerifyAssertions) VM._assert(!cmap.isZero());
sysCall.sysOProfileAddToCompileMap(cmap, codeAddress.plus(offs), fileName.toByteArray(), lineNumber);
byte[] fileNameBA;
if(fileName == null) {
fileNameBA = symbolName;
} else {
fileNameBA = StringUtilities.stringToBytesNullTerminated(fileName.toString());
}
sysCall.sysOProfileAddToCompileMap(cmap, codeAddress.plus(offs), fileNameBA, lineNumber);
}
void finish() {
sysCall.sysOProfileFinishCompileMap(cmap);
}
}
CompileMapVisitor visitor = new CompileMapVisitor();
cm.walkDebugInformation(visitor);
visitor.finish();
if(profileBootImage || !cm.getMethod().getDeclaringClass().isInBootImage()) {
CompileMapVisitor visitor = new CompileMapVisitor();
cm.walkDebugInformation(visitor);
visitor.finish();
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,6 @@ public String getCompilerName() {
return "baseline compiler";
}

/**
* Name for use in debuggers
*/
public String symbolName() {
return method.toString();
}

/**
* Get the exception deliverer for this kind of compiled method
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import org.jikesrvm.compilers.common.assembler.ia32.Assembler;
import org.jikesrvm.compilers.common.assembler.ia32.AssemblerConstants;
import org.jikesrvm.ia32.BaselineConstants;
import org.jikesrvm.ia32.ThreadLocalState;
import org.jikesrvm.jni.ia32.JNICompiler;
import org.jikesrvm.mm.mminterface.MemoryManager;
import org.jikesrvm.objectmodel.JavaHeader;
Expand Down Expand Up @@ -3255,7 +3254,7 @@ protected void emit_invokeinterface(MethodReference methodRef) {
InterfaceMethodSignature sig = InterfaceMethodSignature.findOrCreate(methodRef);

// squirrel away signature ID
ThreadLocalState.emitMoveImmToField(asm, ArchEntrypoints.hiddenSignatureIdField.getOffset(), sig.getId());
asm.emitMOV_RegDisp_Imm(THREAD_REGISTER, ArchEntrypoints.hiddenSignatureIdField.getOffset(), sig.getId());
// T1 = "this" object
stackMoveHelper(T1, Offset.fromIntZeroExtend((count - 1) << LG_WORDSIZE));
asm.baselineEmitLoadTIB(S0, T1);
Expand Down Expand Up @@ -3775,10 +3774,14 @@ private void genPrologue() {
* point of the caller.
* The third word of the header contains the compiled method id of the called method.
*/
asm.emitPUSH_RegDisp(TR, ArchEntrypoints.framePointerField.getOffset()); // store caller's frame pointer
ThreadLocalState.emitMoveRegToField(asm,
ArchEntrypoints.framePointerField.getOffset(),
SP); // establish new frame
// store caller's frame pointer
asm.emitPUSH_RegDisp(TR, ArchEntrypoints.framePointerField.getOffset());
// establish new frame
if(VM.BuildFor32Addr) {
asm.emitMOV_RegDisp_Reg(THREAD_REGISTER, ArchEntrypoints.framePointerField.getOffset(), SP);
} else {
asm.emitMOV_RegDisp_Reg_Quad(THREAD_REGISTER, ArchEntrypoints.framePointerField.getOffset(), SP);
}
/*
* NOTE: until the end of the prologue SP holds the framepointer.
*/
Expand Down Expand Up @@ -3896,12 +3899,14 @@ protected void emit_deferred_prologue() {
if (VM.VerifyAssertions) VM._assert(method.isForOsrSpecialization());

if (isInterruptible) {
// S0<-limit
ThreadLocalState.emitMoveFieldToReg(asm, S0, Entrypoints.stackLimitField.getOffset());
if (VM.BuildFor32Addr) {
// S0<-limit
asm.emitMOV_Reg_RegDisp(S0, THREAD_REGISTER,Entrypoints.stackLimitField.getOffset());
asm.emitSUB_Reg_Reg(S0, SP);
asm.emitADD_Reg_Imm(S0, method.getOperandWords() << LG_WORDSIZE);
} else {
// S0<-limit
asm.emitMOV_Reg_RegDisp_Quad(S0, THREAD_REGISTER,Entrypoints.stackLimitField.getOffset());
asm.emitSUB_Reg_Reg_Quad(S0, SP);
asm.emitADD_Reg_Imm_Quad(S0, method.getOperandWords() << LG_WORDSIZE);
}
Expand Down Expand Up @@ -4047,7 +4052,7 @@ static void genBoundsCheck(Assembler asm, GPR indexReg, GPR arrayRefReg) {
asm.emitBranchLikelyNextInstruction();
ForwardReference fr = asm.forwardJcc(AssemblerConstants.LGT);
// "pass" index param to C trap handler
ThreadLocalState.emitMoveRegToField(asm, ArchEntrypoints.arrayIndexTrapParamField.getOffset(), indexReg);
asm.emitMOV_RegDisp_Reg(THREAD_REGISTER, ArchEntrypoints.arrayIndexTrapParamField.getOffset(), indexReg);
// trap
asm.emitINT_Imm(RuntimeEntrypoints.TRAP_ARRAY_BOUNDS + RVM_TRAP_BASE);
fr.resolve(asm);
Expand Down Expand Up @@ -4410,7 +4415,7 @@ private void genThreadSwitchTest(int whereFrom) {
}

// thread switch requested ??
ThreadLocalState.emitCompareFieldWithImm(asm, Entrypoints.takeYieldpointField.getOffset(), 0);
asm.emitCMP_RegDisp_Imm(THREAD_REGISTER, Entrypoints.takeYieldpointField.getOffset(), 0);
ForwardReference fr1;
if (whereFrom == RVMThread.PROLOGUE) {
// Take yieldpoint if yieldpoint flag is non-zero (either 1 or -1)
Expand Down
4 changes: 2 additions & 2 deletions rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java
Original file line number Diff line number Diff line change
Expand Up @@ -521,8 +521,8 @@ public int findLineNumberForInstruction(Offset instructionOffset) {
/**
* Name for use in debuggers
*/
public String symbolName() {
return toString();
public final String symbolName() {
return method.getDeclaringClass().toString()+"."+method.getName().toString()+method.getDescriptor().toString();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,14 +128,6 @@ public String getCompilerName() {
return "optimizing compiler";
}

/**
* Name for use in debuggers
*/
@Interruptible
public String symbolName() {
return method.toString();
}

/**
* Get handler to deal with stack unwinding and exception delivery
* for this method's stackframes.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ private static void insertStubCase(Assembler asm, int[] sigIds, RVMMethod[] targ
}
} else {
Offset disp = ArchEntrypoints.hiddenSignatureIdField.getOffset();
ThreadLocalState.emitCompareFieldWithImm(asm, disp, sigIds[middle]);
asm.emitCMP_RegDisp_Imm(THREAD_REGISTER, disp, sigIds[middle]);
if (low < middle) {
asm.emitJCC_Cond_Label(AssemblerConstants.LT, bcIndices[(low + middle - 1) / 2]);
}
Expand Down
50 changes: 30 additions & 20 deletions rvm/src/org/jikesrvm/ia32/OutOfLineMachineCode.java
Original file line number Diff line number Diff line change
Expand Up @@ -254,24 +254,31 @@ private static CodeArray generateReflectiveMethodInvokerInstructions() {

/* push a new frame */
asm.emitPUSH_RegDisp(TR, fpOffset); // link this frame with next
ThreadLocalState.emitMoveRegToField(asm, fpOffset, SP); // establish base of new frame
asm.emitPUSH_Imm(INVISIBLE_METHOD_ID);
asm.emitADD_Reg_Imm(SP, STACKFRAME_BODY_OFFSET.toInt());
if(VM.BuildFor32Addr) {
asm.emitMOV_RegDisp_Reg(THREAD_REGISTER, fpOffset, SP); // establish base of new frame
asm.emitPUSH_Imm(INVISIBLE_METHOD_ID);
asm.emitADD_Reg_Imm(SP, STACKFRAME_BODY_OFFSET.toInt());
} else {
asm.emitMOV_RegDisp_Reg_Quad(THREAD_REGISTER, fpOffset, SP); // establish base of new frame
asm.emitPUSH_Imm(INVISIBLE_METHOD_ID);
asm.emitADD_Reg_Imm_Quad(SP, STACKFRAME_BODY_OFFSET.toInt());
}

/* write parameters on stack
* move data from memory addressed by Paramaters array, the fourth
* parameter to this, into the stack.
* SP target address
* S0 source address
* T1 length
* T0 scratch
*/
ThreadLocalState.emitMoveFieldToReg(asm, S0, fpOffset);
* move data from memory addressed by Paramaters array, the fourth
* parameter to this, into the stack.
* SP target address
* S0 source address
* T1 length
* T0 scratch
*/
if (VM.BuildFor32Addr) {
asm.emitMOV_Reg_RegDisp(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp(S0, S0, PARAMS_FP_OFFSET); // S0 <- Parameters
asm.emitMOV_Reg_RegDisp(T1, S0, ObjectModel.getArrayLengthOffset()); // T1 <- Parameters.length()
asm.emitCMP_Reg_Imm(T1, 0); // length == 0 ?
} else {
asm.emitMOV_Reg_RegDisp_Quad(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp_Quad(S0, S0, PARAMS_FP_OFFSET);// S0 <- Parameters
if (JavaHeaderConstants.ARRAY_LENGTH_BYTES == 4) {
asm.emitMOV_Reg_RegDisp(T1, S0, ObjectModel.getArrayLengthOffset()); // T1 <- Parameters.length()
Expand Down Expand Up @@ -306,12 +313,13 @@ private static CodeArray generateReflectiveMethodInvokerInstructions() {

if (SSE2_FULL) {
/* write fprs onto fprs registers */
ThreadLocalState.emitMoveFieldToReg(asm, S0, fpOffset);
if (VM.BuildFor32Addr) {
asm.emitMOV_Reg_RegDisp(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp(T0, S0, FPRS_FP_OFFSET); // T0 <- FPRs
asm.emitMOV_Reg_RegDisp(T1, T0, ObjectModel.getArrayLengthOffset()); // T1 <- FPRs.length()
asm.emitMOV_Reg_RegDisp(S0, S0, FPRMETA_FP_OFFSET); // S0 <- FPRmeta
} else {
asm.emitMOV_Reg_RegDisp_Quad(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp_Quad(T0, S0, FPRS_FP_OFFSET); // T0 <- FPRs
if (JavaHeaderConstants.ARRAY_LENGTH_BYTES == 4) {
asm.emitMOV_Reg_RegDisp(T1, T0, ObjectModel.getArrayLengthOffset()); // T1 <- FPRs.length()
Expand Down Expand Up @@ -365,7 +373,7 @@ private static CodeArray generateReflectiveMethodInvokerInstructions() {
} else {
if (VM.VerifyAssertions) VM._assert(VM.BuildFor32Addr);
/* write fprs onto fprs registers */
ThreadLocalState.emitMoveFieldToReg(asm, S0, fpOffset);
asm.emitMOV_Reg_RegDisp(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp(S0, S0, FPRS_FP_OFFSET); // S0 <- FPRs
asm.emitMOV_Reg_RegDisp(T1, S0, ObjectModel.getArrayLengthOffset()); // T1 <- FPRs.length()
asm.emitSHL_Reg_Imm(T1, LG_WORDSIZE + 1); // length in bytes
Expand All @@ -383,13 +391,14 @@ private static CodeArray generateReflectiveMethodInvokerInstructions() {
}

/* write gprs: S0 = Base address of GPRs[], T1 = GPRs.length */
ThreadLocalState.emitMoveFieldToReg(asm, S0, fpOffset);
if (VM.BuildFor32Addr) {
asm.emitMOV_Reg_RegDisp(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp(S0, S0, GPRS_FP_OFFSET); // S0 <- GPRs
asm.emitMOV_Reg_RegDisp(T1, S0, ObjectModel.getArrayLengthOffset()); // T1 <- GPRs.length()
asm.emitCMP_Reg_Imm(T1, 0); // length == 0 ?
} else {
asm.emitMOV_Reg_RegDisp(S0, S0, GPRS_FP_OFFSET); // S0 <- GPRs
asm.emitMOV_Reg_RegDisp_Quad(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp_Quad(S0, S0, GPRS_FP_OFFSET); // S0 <- GPRs
if (JavaHeaderConstants.ARRAY_LENGTH_BYTES == 4) {
asm.emitMOV_Reg_RegDisp(T1, S0, ObjectModel.getArrayLengthOffset()); // T1 <- GPRs.length()
asm.emitCMP_Reg_Imm(T1, 0); // length == 0 ?
Expand All @@ -416,10 +425,11 @@ private static CodeArray generateReflectiveMethodInvokerInstructions() {
fr4.resolve(asm);

/* branch to method. On a good day we might even be back */
ThreadLocalState.emitMoveFieldToReg(asm, S0, fpOffset);
if (VM.BuildFor32Addr) {
asm.emitMOV_Reg_RegDisp(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp(S0, S0, CODE_FP_OFFSET); // S0 <- code
} else {
asm.emitMOV_Reg_RegDisp_Quad(S0, THREAD_REGISTER, fpOffset);
asm.emitMOV_Reg_RegDisp_Quad(S0, S0, CODE_FP_OFFSET); // S0 <- code
}
asm.emitCALL_Reg(S0); // go there
Expand Down Expand Up @@ -563,10 +573,8 @@ private static CodeArray generateThreadSwitchInstructions() {
asm.emitMOV_Reg_RegDisp_Quad(S0, T1, fpOffset); // S0 := restoreRegs.fp
}
// TR.framePointer = restoreRegs.fp
ThreadLocalState.emitMoveRegToField(asm,
ArchEntrypoints.framePointerField.getOffset(),
S0);
if (VM.BuildFor32Addr) {
asm.emitMOV_RegDisp_Reg(THREAD_REGISTER, ArchEntrypoints.framePointerField.getOffset(), S0);
asm.emitMOV_Reg_RegDisp(S0, T1, gprsOffset); // S0 := restoreRegs.gprs[]
asm.emitMOV_Reg_RegDisp(SP, S0, Offset.fromIntZeroExtend(SP.value() << LG_WORDSIZE)); // SP := restoreRegs.gprs[#SP]
for (int i = 0; i < NUM_NONVOLATILE_GPRS; i++) {
Expand All @@ -577,6 +585,7 @@ private static CodeArray generateThreadSwitchInstructions() {
LG_WORDSIZE));
}
} else {
asm.emitMOV_RegDisp_Reg_Quad(THREAD_REGISTER, ArchEntrypoints.framePointerField.getOffset(), S0);
asm.emitMOV_Reg_RegDisp_Quad(S0, T1, gprsOffset); // S0 := restoreRegs.gprs[]
asm.emitMOV_Reg_RegDisp_Quad(SP, S0, Offset.fromIntZeroExtend(SP.value() << LG_WORDSIZE)); // SP := restoreRegs.gprs[#SP]
for (int i = 0; i < NUM_NONVOLATILE_GPRS; i++) {
Expand Down Expand Up @@ -609,10 +618,11 @@ private static CodeArray generateRestoreHardwareExceptionStateInstructions() {
// Set TR.framePointer to be registers.fp
if (VM.BuildFor32Addr) {
asm.emitMOV_Reg_RegDisp(S0, T0, ArchEntrypoints.registersFPField.getOffset());
asm.emitMOV_RegDisp_Reg(THREAD_REGISTER, ArchEntrypoints.framePointerField.getOffset(), S0);
} else {
asm.emitMOV_Reg_RegDisp_Quad(S0, T0, ArchEntrypoints.registersFPField.getOffset());
asm.emitMOV_RegDisp_Reg_Quad(THREAD_REGISTER, ArchEntrypoints.framePointerField.getOffset(), S0);
}
ThreadLocalState.emitMoveRegToField(asm, ArchEntrypoints.framePointerField.getOffset(), S0);

// Restore SP
if (VM.BuildFor32Addr) {
Expand Down
Loading

0 comments on commit d38420e

Please sign in to comment.