Skip to content

Commit

Permalink
Review rework complete writing of locations to include object constants.
Browse files Browse the repository at this point in the history
  • Loading branch information
adinn committed May 4, 2022
1 parent 429269f commit 7b2fa60
Show file tree
Hide file tree
Showing 8 changed files with 264 additions and 158 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,8 @@ enum LocalKind {

int stackSlot();

long heapOffset();

JavaConstant constantValue();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,7 @@ public class DwarfDebugInfo extends DebugInfoBase {
public static final byte DW_OP_bregx = (byte) 0x92;
public static final byte DW_OP_push_object_address = (byte) 0x97;
public static final byte DW_OP_implicit_value = (byte) 0x9e;
public static final byte DW_OP_stack_value = (byte) 0x9f;

/* Register constants for AArch64. */
public static final byte rheapbase_aarch64 = (byte) 27;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.util.List;

import jdk.vm.ci.meta.JavaConstant;
import jdk.vm.ci.meta.JavaKind;
import jdk.vm.ci.meta.PrimitiveConstant;

import org.graalvm.compiler.debug.DebugContext;
Expand Down Expand Up @@ -1063,44 +1064,10 @@ private int writeStaticFieldLocation(DebugContext context, ClassEntry classEntry
/* Field offset needs to be relocated relative to static primitive or static object base. */
int offset = fieldEntry.getOffset();
log(context, " [0x%08x] location heapbase + 0x%x (%s)", pos, offset, (fieldEntry.getValueType().isPrimitive() ? "primitive" : "object"));
pos = writeHeapLocation(offset, buffer, pos);
pos = writeHeapLocationExprLoc(offset, buffer, pos);
return pos;
}

private int writeHeapLocation(int offset, byte[] buffer, int p) {
int pos = p;
if (dwarfSections.useHeapBase()) {
/* Write a location rebasing the offset relative to the heapbase register. */
byte regOp = (byte) (DwarfDebugInfo.DW_OP_breg0 + dwarfSections.getHeapbaseRegister());
/*
* We have to size the DWARF expression by writing it to the scratch buffer so we can
* write its size as a ULEB before the expression itself.
*/
int size = putByte(regOp, scratch, 0) + putSLEB(offset, scratch, 0);
if (buffer == null) {
/* Add ULEB size to the expression size. */
return pos + putULEB(size, scratch, 0) + size;
} else {
/* Write the size and expression into the output buffer. */
pos = putULEB(size, buffer, pos);
pos = putByte(regOp, buffer, pos);
return putSLEB(offset, buffer, pos);
}
} else {
/* Write a relocatable address relative to the heap section start. */
byte regOp = DwarfDebugInfo.DW_OP_addr;
int size = 9;
/* Write the size and expression into the output buffer. */
if (buffer == null) {
return pos + putULEB(size, scratch, 0) + size;
} else {
pos = putULEB(size, buffer, pos);
pos = putByte(regOp, buffer, pos);
return putRelocatableHeapOffset(offset, buffer, pos);
}
}
}

private int writeArrayTypes(DebugContext context, byte[] buffer, int pos) {
log(context, " [0x%08x] array classes", pos);
return getTypes().filter(TypeEntry::isArray).reduce(pos,
Expand Down Expand Up @@ -1423,7 +1390,7 @@ private int writeMethodLocalLocation(DebugContext context, Range range, DebugLoc
case CONSTANT:
JavaConstant constant = value.constantValue();
// can only handle primitive or null constants just now
if (constant instanceof PrimitiveConstant || constant.isNull()) {
if (constant instanceof PrimitiveConstant || constant.getJavaKind() == JavaKind.Object) {
localValues.add(value);
}
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,8 +246,8 @@ private int writeVarLocations(DebugContext context, DebugLocalInfo local, long b
pos = writePrimitiveConstantLocation(context, value.constantValue(), buffer, pos);
} else if (constant.isNull()) {
pos = writeNullConstantLocation(context, value.constantValue(), buffer, pos);
} else {
assert false : "Should not reach here!";
} else {
pos = writeObjectConstantLocation(context, value.constantValue(), value.heapOffset(), buffer, pos);
}
break;
default:
Expand Down Expand Up @@ -353,7 +353,7 @@ private int writePrimitiveConstantLocation(DebugContext context, JavaConstant co
pos += putShort((short) byteCount, scratch, 0);
pos += putByte(op, scratch, 0);
pos += putULEB(dataByteCount, scratch, 0);

if (dataByteCount == 1) {
if (kind == JavaKind.Boolean) {
pos += putByte((byte) (constant.asBoolean() ? 1 : 0), scratch, 0);
Expand Down Expand Up @@ -388,7 +388,7 @@ private int writePrimitiveConstantLocation(DebugContext context, JavaConstant co
long l = (kind == JavaKind.Long ? constant.asLong() : Double.doubleToRawLongBits(constant.asDouble()));
pos = putLong(l, buffer, pos);
}
verboseLog(context, " [0x%08x] CONSTANT %s", pos, constant.toValueString());
verboseLog(context, " [0x%08x] CONSTANT (primitive) %s", pos, constant.toValueString());
}
return pos;
}
Expand All @@ -410,11 +410,19 @@ private int writeNullConstantLocation(DebugContext context, JavaConstant constan
pos = putByte(op, buffer, pos);
pos = putULEB(dataByteCount, buffer, pos);
pos = writeAttrData8(0, buffer, pos);
verboseLog(context, " [0x%08x] CONSTANT %s", pos, constant.toValueString());
verboseLog(context, " [0x%08x] CONSTANT (null) %s", pos, constant.toValueString());
}
return pos;
}

private int writeObjectConstantLocation(DebugContext context, JavaConstant constant, long heapOffset, byte[] buffer, int p) {
assert constant.getJavaKind() == JavaKind.Object && !constant.isNull();
int pos = p;
pos = writeHeapLocationLocList(heapOffset, buffer, pos);
verboseLog(context, " [0x%08x] CONSTANT (object) %s", pos, constant.toValueString());
return pos;
}

// auxiliary class used to collect per-range locations for a given local
// merging adjacent ranges with the same location
static class LocalValueExtent {
Expand Down Expand Up @@ -600,72 +608,72 @@ public enum DwarfRegEncodingAArch64 {

// map from compiler AArch64 register indices to corresponding dwarf AArch64 register index
private static final int[] GRAAL_AARCH64_TO_DWARF_REG_MAP = {
DwarfRegEncodingAArch64.R0.encoding,
DwarfRegEncodingAArch64.R1.encoding,
DwarfRegEncodingAArch64.R2.encoding,
DwarfRegEncodingAArch64.R3.encoding,
DwarfRegEncodingAArch64.R4.encoding,
DwarfRegEncodingAArch64.R5.encoding,
DwarfRegEncodingAArch64.R6.encoding,
DwarfRegEncodingAArch64.R7.encoding,
DwarfRegEncodingAArch64.R8.encoding,
DwarfRegEncodingAArch64.R9.encoding,
DwarfRegEncodingAArch64.R10.encoding,
DwarfRegEncodingAArch64.R11.encoding,
DwarfRegEncodingAArch64.R12.encoding,
DwarfRegEncodingAArch64.R13.encoding,
DwarfRegEncodingAArch64.R14.encoding,
DwarfRegEncodingAArch64.R15.encoding,
DwarfRegEncodingAArch64.R16.encoding,
DwarfRegEncodingAArch64.R17.encoding,
DwarfRegEncodingAArch64.R18.encoding,
DwarfRegEncodingAArch64.R19.encoding,
DwarfRegEncodingAArch64.R20.encoding,
DwarfRegEncodingAArch64.R21.encoding,
DwarfRegEncodingAArch64.R22.encoding,
DwarfRegEncodingAArch64.R23.encoding,
DwarfRegEncodingAArch64.R24.encoding,
DwarfRegEncodingAArch64.R25.encoding,
DwarfRegEncodingAArch64.R26.encoding,
DwarfRegEncodingAArch64.R27.encoding,
DwarfRegEncodingAArch64.R28.encoding,
DwarfRegEncodingAArch64.R29.encoding,
DwarfRegEncodingAArch64.R30.encoding,
DwarfRegEncodingAArch64.R31.encoding,
DwarfRegEncodingAArch64.ZR.encoding,
DwarfRegEncodingAArch64.SP.encoding,
DwarfRegEncodingAArch64.V0.encoding,
DwarfRegEncodingAArch64.V1.encoding,
DwarfRegEncodingAArch64.V2.encoding,
DwarfRegEncodingAArch64.V3.encoding,
DwarfRegEncodingAArch64.V4.encoding,
DwarfRegEncodingAArch64.V5.encoding,
DwarfRegEncodingAArch64.V6.encoding,
DwarfRegEncodingAArch64.V7.encoding,
DwarfRegEncodingAArch64.V8.encoding,
DwarfRegEncodingAArch64.V9.encoding,
DwarfRegEncodingAArch64.V10.encoding,
DwarfRegEncodingAArch64.V11.encoding,
DwarfRegEncodingAArch64.V12.encoding,
DwarfRegEncodingAArch64.V13.encoding,
DwarfRegEncodingAArch64.V14.encoding,
DwarfRegEncodingAArch64.V15.encoding,
DwarfRegEncodingAArch64.V16.encoding,
DwarfRegEncodingAArch64.V17.encoding,
DwarfRegEncodingAArch64.V18.encoding,
DwarfRegEncodingAArch64.V19.encoding,
DwarfRegEncodingAArch64.V20.encoding,
DwarfRegEncodingAArch64.V21.encoding,
DwarfRegEncodingAArch64.V22.encoding,
DwarfRegEncodingAArch64.V23.encoding,
DwarfRegEncodingAArch64.V24.encoding,
DwarfRegEncodingAArch64.V25.encoding,
DwarfRegEncodingAArch64.V26.encoding,
DwarfRegEncodingAArch64.V27.encoding,
DwarfRegEncodingAArch64.V28.encoding,
DwarfRegEncodingAArch64.V29.encoding,
DwarfRegEncodingAArch64.V30.encoding,
DwarfRegEncodingAArch64.V31.encoding,
DwarfRegEncodingAArch64.R0.encoding,
DwarfRegEncodingAArch64.R1.encoding,
DwarfRegEncodingAArch64.R2.encoding,
DwarfRegEncodingAArch64.R3.encoding,
DwarfRegEncodingAArch64.R4.encoding,
DwarfRegEncodingAArch64.R5.encoding,
DwarfRegEncodingAArch64.R6.encoding,
DwarfRegEncodingAArch64.R7.encoding,
DwarfRegEncodingAArch64.R8.encoding,
DwarfRegEncodingAArch64.R9.encoding,
DwarfRegEncodingAArch64.R10.encoding,
DwarfRegEncodingAArch64.R11.encoding,
DwarfRegEncodingAArch64.R12.encoding,
DwarfRegEncodingAArch64.R13.encoding,
DwarfRegEncodingAArch64.R14.encoding,
DwarfRegEncodingAArch64.R15.encoding,
DwarfRegEncodingAArch64.R16.encoding,
DwarfRegEncodingAArch64.R17.encoding,
DwarfRegEncodingAArch64.R18.encoding,
DwarfRegEncodingAArch64.R19.encoding,
DwarfRegEncodingAArch64.R20.encoding,
DwarfRegEncodingAArch64.R21.encoding,
DwarfRegEncodingAArch64.R22.encoding,
DwarfRegEncodingAArch64.R23.encoding,
DwarfRegEncodingAArch64.R24.encoding,
DwarfRegEncodingAArch64.R25.encoding,
DwarfRegEncodingAArch64.R26.encoding,
DwarfRegEncodingAArch64.R27.encoding,
DwarfRegEncodingAArch64.R28.encoding,
DwarfRegEncodingAArch64.R29.encoding,
DwarfRegEncodingAArch64.R30.encoding,
DwarfRegEncodingAArch64.R31.encoding,
DwarfRegEncodingAArch64.ZR.encoding,
DwarfRegEncodingAArch64.SP.encoding,
DwarfRegEncodingAArch64.V0.encoding,
DwarfRegEncodingAArch64.V1.encoding,
DwarfRegEncodingAArch64.V2.encoding,
DwarfRegEncodingAArch64.V3.encoding,
DwarfRegEncodingAArch64.V4.encoding,
DwarfRegEncodingAArch64.V5.encoding,
DwarfRegEncodingAArch64.V6.encoding,
DwarfRegEncodingAArch64.V7.encoding,
DwarfRegEncodingAArch64.V8.encoding,
DwarfRegEncodingAArch64.V9.encoding,
DwarfRegEncodingAArch64.V10.encoding,
DwarfRegEncodingAArch64.V11.encoding,
DwarfRegEncodingAArch64.V12.encoding,
DwarfRegEncodingAArch64.V13.encoding,
DwarfRegEncodingAArch64.V14.encoding,
DwarfRegEncodingAArch64.V15.encoding,
DwarfRegEncodingAArch64.V16.encoding,
DwarfRegEncodingAArch64.V17.encoding,
DwarfRegEncodingAArch64.V18.encoding,
DwarfRegEncodingAArch64.V19.encoding,
DwarfRegEncodingAArch64.V20.encoding,
DwarfRegEncodingAArch64.V21.encoding,
DwarfRegEncodingAArch64.V22.encoding,
DwarfRegEncodingAArch64.V23.encoding,
DwarfRegEncodingAArch64.V24.encoding,
DwarfRegEncodingAArch64.V25.encoding,
DwarfRegEncodingAArch64.V26.encoding,
DwarfRegEncodingAArch64.V27.encoding,
DwarfRegEncodingAArch64.V28.encoding,
DwarfRegEncodingAArch64.V29.encoding,
DwarfRegEncodingAArch64.V30.encoding,
DwarfRegEncodingAArch64.V31.encoding,
};

// register numbers used by DWARF for AMD64 registers
Expand Down Expand Up @@ -712,37 +720,37 @@ public enum DwarfRegEncodingAMD64 {

// map from compiler X86_64 register indices to corresponding dwarf AMD64 register index
private static final int[] GRAAL_X86_64_TO_DWARF_REG_MAP = {
DwarfRegEncodingAMD64.RAX.encoding,
DwarfRegEncodingAMD64.RCX.encoding,
DwarfRegEncodingAMD64.RDX.encoding,
DwarfRegEncodingAMD64.RBX.encoding,
DwarfRegEncodingAMD64.RSP.encoding,
DwarfRegEncodingAMD64.RBP.encoding,
DwarfRegEncodingAMD64.RSI.encoding,
DwarfRegEncodingAMD64.RDI.encoding,
DwarfRegEncodingAMD64.R8.encoding,
DwarfRegEncodingAMD64.R9.encoding,
DwarfRegEncodingAMD64.R10.encoding,
DwarfRegEncodingAMD64.R11.encoding,
DwarfRegEncodingAMD64.R12.encoding,
DwarfRegEncodingAMD64.R13.encoding,
DwarfRegEncodingAMD64.R14.encoding,
DwarfRegEncodingAMD64.R15.encoding,
DwarfRegEncodingAMD64.XMM0.encoding,
DwarfRegEncodingAMD64.XMM1.encoding,
DwarfRegEncodingAMD64.XMM2.encoding,
DwarfRegEncodingAMD64.XMM3.encoding,
DwarfRegEncodingAMD64.XMM4.encoding,
DwarfRegEncodingAMD64.XMM5.encoding,
DwarfRegEncodingAMD64.XMM6.encoding,
DwarfRegEncodingAMD64.XMM7.encoding,
DwarfRegEncodingAMD64.XMM8.encoding,
DwarfRegEncodingAMD64.XMM9.encoding,
DwarfRegEncodingAMD64.XMM10.encoding,
DwarfRegEncodingAMD64.XMM11.encoding,
DwarfRegEncodingAMD64.XMM12.encoding,
DwarfRegEncodingAMD64.XMM13.encoding,
DwarfRegEncodingAMD64.XMM14.encoding,
DwarfRegEncodingAMD64.XMM15.encoding,
DwarfRegEncodingAMD64.RAX.encoding,
DwarfRegEncodingAMD64.RCX.encoding,
DwarfRegEncodingAMD64.RDX.encoding,
DwarfRegEncodingAMD64.RBX.encoding,
DwarfRegEncodingAMD64.RSP.encoding,
DwarfRegEncodingAMD64.RBP.encoding,
DwarfRegEncodingAMD64.RSI.encoding,
DwarfRegEncodingAMD64.RDI.encoding,
DwarfRegEncodingAMD64.R8.encoding,
DwarfRegEncodingAMD64.R9.encoding,
DwarfRegEncodingAMD64.R10.encoding,
DwarfRegEncodingAMD64.R11.encoding,
DwarfRegEncodingAMD64.R12.encoding,
DwarfRegEncodingAMD64.R13.encoding,
DwarfRegEncodingAMD64.R14.encoding,
DwarfRegEncodingAMD64.R15.encoding,
DwarfRegEncodingAMD64.XMM0.encoding,
DwarfRegEncodingAMD64.XMM1.encoding,
DwarfRegEncodingAMD64.XMM2.encoding,
DwarfRegEncodingAMD64.XMM3.encoding,
DwarfRegEncodingAMD64.XMM4.encoding,
DwarfRegEncodingAMD64.XMM5.encoding,
DwarfRegEncodingAMD64.XMM6.encoding,
DwarfRegEncodingAMD64.XMM7.encoding,
DwarfRegEncodingAMD64.XMM8.encoding,
DwarfRegEncodingAMD64.XMM9.encoding,
DwarfRegEncodingAMD64.XMM10.encoding,
DwarfRegEncodingAMD64.XMM11.encoding,
DwarfRegEncodingAMD64.XMM12.encoding,
DwarfRegEncodingAMD64.XMM13.encoding,
DwarfRegEncodingAMD64.XMM14.encoding,
DwarfRegEncodingAMD64.XMM15.encoding,
};
}
Loading

0 comments on commit 7b2fa60

Please sign in to comment.