Skip to content

Commit 7b2fa60

Browse files
committed
Review rework complete writing of locations to include object constants.
1 parent 429269f commit 7b2fa60

File tree

8 files changed

+264
-158
lines changed

8 files changed

+264
-158
lines changed

substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debuginfo/DebugInfoProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,8 @@ enum LocalKind {
374374

375375
int stackSlot();
376376

377+
long heapOffset();
378+
377379
JavaConstant constantValue();
378380
}
379381

substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfDebugInfo.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ public class DwarfDebugInfo extends DebugInfoBase {
285285
public static final byte DW_OP_bregx = (byte) 0x92;
286286
public static final byte DW_OP_push_object_address = (byte) 0x97;
287287
public static final byte DW_OP_implicit_value = (byte) 0x9e;
288+
public static final byte DW_OP_stack_value = (byte) 0x9f;
288289

289290
/* Register constants for AArch64. */
290291
public static final byte rheapbase_aarch64 = (byte) 27;

substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfInfoSectionImpl.java

Lines changed: 3 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.List;
3434

3535
import jdk.vm.ci.meta.JavaConstant;
36+
import jdk.vm.ci.meta.JavaKind;
3637
import jdk.vm.ci.meta.PrimitiveConstant;
3738

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

1070-
private int writeHeapLocation(int offset, byte[] buffer, int p) {
1071-
int pos = p;
1072-
if (dwarfSections.useHeapBase()) {
1073-
/* Write a location rebasing the offset relative to the heapbase register. */
1074-
byte regOp = (byte) (DwarfDebugInfo.DW_OP_breg0 + dwarfSections.getHeapbaseRegister());
1075-
/*
1076-
* We have to size the DWARF expression by writing it to the scratch buffer so we can
1077-
* write its size as a ULEB before the expression itself.
1078-
*/
1079-
int size = putByte(regOp, scratch, 0) + putSLEB(offset, scratch, 0);
1080-
if (buffer == null) {
1081-
/* Add ULEB size to the expression size. */
1082-
return pos + putULEB(size, scratch, 0) + size;
1083-
} else {
1084-
/* Write the size and expression into the output buffer. */
1085-
pos = putULEB(size, buffer, pos);
1086-
pos = putByte(regOp, buffer, pos);
1087-
return putSLEB(offset, buffer, pos);
1088-
}
1089-
} else {
1090-
/* Write a relocatable address relative to the heap section start. */
1091-
byte regOp = DwarfDebugInfo.DW_OP_addr;
1092-
int size = 9;
1093-
/* Write the size and expression into the output buffer. */
1094-
if (buffer == null) {
1095-
return pos + putULEB(size, scratch, 0) + size;
1096-
} else {
1097-
pos = putULEB(size, buffer, pos);
1098-
pos = putByte(regOp, buffer, pos);
1099-
return putRelocatableHeapOffset(offset, buffer, pos);
1100-
}
1101-
}
1102-
}
1103-
11041071
private int writeArrayTypes(DebugContext context, byte[] buffer, int pos) {
11051072
log(context, " [0x%08x] array classes", pos);
11061073
return getTypes().filter(TypeEntry::isArray).reduce(pos,
@@ -1423,7 +1390,7 @@ private int writeMethodLocalLocation(DebugContext context, Range range, DebugLoc
14231390
case CONSTANT:
14241391
JavaConstant constant = value.constantValue();
14251392
// can only handle primitive or null constants just now
1426-
if (constant instanceof PrimitiveConstant || constant.isNull()) {
1393+
if (constant instanceof PrimitiveConstant || constant.getJavaKind() == JavaKind.Object) {
14271394
localValues.add(value);
14281395
}
14291396
break;

substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfLocSectionImpl.java

Lines changed: 111 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -246,8 +246,8 @@ private int writeVarLocations(DebugContext context, DebugLocalInfo local, long b
246246
pos = writePrimitiveConstantLocation(context, value.constantValue(), buffer, pos);
247247
} else if (constant.isNull()) {
248248
pos = writeNullConstantLocation(context, value.constantValue(), buffer, pos);
249-
} else {
250-
assert false : "Should not reach here!";
249+
} else {
250+
pos = writeObjectConstantLocation(context, value.constantValue(), value.heapOffset(), buffer, pos);
251251
}
252252
break;
253253
default:
@@ -353,7 +353,7 @@ private int writePrimitiveConstantLocation(DebugContext context, JavaConstant co
353353
pos += putShort((short) byteCount, scratch, 0);
354354
pos += putByte(op, scratch, 0);
355355
pos += putULEB(dataByteCount, scratch, 0);
356-
356+
357357
if (dataByteCount == 1) {
358358
if (kind == JavaKind.Boolean) {
359359
pos += putByte((byte) (constant.asBoolean() ? 1 : 0), scratch, 0);
@@ -388,7 +388,7 @@ private int writePrimitiveConstantLocation(DebugContext context, JavaConstant co
388388
long l = (kind == JavaKind.Long ? constant.asLong() : Double.doubleToRawLongBits(constant.asDouble()));
389389
pos = putLong(l, buffer, pos);
390390
}
391-
verboseLog(context, " [0x%08x] CONSTANT %s", pos, constant.toValueString());
391+
verboseLog(context, " [0x%08x] CONSTANT (primitive) %s", pos, constant.toValueString());
392392
}
393393
return pos;
394394
}
@@ -410,11 +410,19 @@ private int writeNullConstantLocation(DebugContext context, JavaConstant constan
410410
pos = putByte(op, buffer, pos);
411411
pos = putULEB(dataByteCount, buffer, pos);
412412
pos = writeAttrData8(0, buffer, pos);
413-
verboseLog(context, " [0x%08x] CONSTANT %s", pos, constant.toValueString());
413+
verboseLog(context, " [0x%08x] CONSTANT (null) %s", pos, constant.toValueString());
414414
}
415415
return pos;
416416
}
417417

418+
private int writeObjectConstantLocation(DebugContext context, JavaConstant constant, long heapOffset, byte[] buffer, int p) {
419+
assert constant.getJavaKind() == JavaKind.Object && !constant.isNull();
420+
int pos = p;
421+
pos = writeHeapLocationLocList(heapOffset, buffer, pos);
422+
verboseLog(context, " [0x%08x] CONSTANT (object) %s", pos, constant.toValueString());
423+
return pos;
424+
}
425+
418426
// auxiliary class used to collect per-range locations for a given local
419427
// merging adjacent ranges with the same location
420428
static class LocalValueExtent {
@@ -600,72 +608,72 @@ public enum DwarfRegEncodingAArch64 {
600608

601609
// map from compiler AArch64 register indices to corresponding dwarf AArch64 register index
602610
private static final int[] GRAAL_AARCH64_TO_DWARF_REG_MAP = {
603-
DwarfRegEncodingAArch64.R0.encoding,
604-
DwarfRegEncodingAArch64.R1.encoding,
605-
DwarfRegEncodingAArch64.R2.encoding,
606-
DwarfRegEncodingAArch64.R3.encoding,
607-
DwarfRegEncodingAArch64.R4.encoding,
608-
DwarfRegEncodingAArch64.R5.encoding,
609-
DwarfRegEncodingAArch64.R6.encoding,
610-
DwarfRegEncodingAArch64.R7.encoding,
611-
DwarfRegEncodingAArch64.R8.encoding,
612-
DwarfRegEncodingAArch64.R9.encoding,
613-
DwarfRegEncodingAArch64.R10.encoding,
614-
DwarfRegEncodingAArch64.R11.encoding,
615-
DwarfRegEncodingAArch64.R12.encoding,
616-
DwarfRegEncodingAArch64.R13.encoding,
617-
DwarfRegEncodingAArch64.R14.encoding,
618-
DwarfRegEncodingAArch64.R15.encoding,
619-
DwarfRegEncodingAArch64.R16.encoding,
620-
DwarfRegEncodingAArch64.R17.encoding,
621-
DwarfRegEncodingAArch64.R18.encoding,
622-
DwarfRegEncodingAArch64.R19.encoding,
623-
DwarfRegEncodingAArch64.R20.encoding,
624-
DwarfRegEncodingAArch64.R21.encoding,
625-
DwarfRegEncodingAArch64.R22.encoding,
626-
DwarfRegEncodingAArch64.R23.encoding,
627-
DwarfRegEncodingAArch64.R24.encoding,
628-
DwarfRegEncodingAArch64.R25.encoding,
629-
DwarfRegEncodingAArch64.R26.encoding,
630-
DwarfRegEncodingAArch64.R27.encoding,
631-
DwarfRegEncodingAArch64.R28.encoding,
632-
DwarfRegEncodingAArch64.R29.encoding,
633-
DwarfRegEncodingAArch64.R30.encoding,
634-
DwarfRegEncodingAArch64.R31.encoding,
635-
DwarfRegEncodingAArch64.ZR.encoding,
636-
DwarfRegEncodingAArch64.SP.encoding,
637-
DwarfRegEncodingAArch64.V0.encoding,
638-
DwarfRegEncodingAArch64.V1.encoding,
639-
DwarfRegEncodingAArch64.V2.encoding,
640-
DwarfRegEncodingAArch64.V3.encoding,
641-
DwarfRegEncodingAArch64.V4.encoding,
642-
DwarfRegEncodingAArch64.V5.encoding,
643-
DwarfRegEncodingAArch64.V6.encoding,
644-
DwarfRegEncodingAArch64.V7.encoding,
645-
DwarfRegEncodingAArch64.V8.encoding,
646-
DwarfRegEncodingAArch64.V9.encoding,
647-
DwarfRegEncodingAArch64.V10.encoding,
648-
DwarfRegEncodingAArch64.V11.encoding,
649-
DwarfRegEncodingAArch64.V12.encoding,
650-
DwarfRegEncodingAArch64.V13.encoding,
651-
DwarfRegEncodingAArch64.V14.encoding,
652-
DwarfRegEncodingAArch64.V15.encoding,
653-
DwarfRegEncodingAArch64.V16.encoding,
654-
DwarfRegEncodingAArch64.V17.encoding,
655-
DwarfRegEncodingAArch64.V18.encoding,
656-
DwarfRegEncodingAArch64.V19.encoding,
657-
DwarfRegEncodingAArch64.V20.encoding,
658-
DwarfRegEncodingAArch64.V21.encoding,
659-
DwarfRegEncodingAArch64.V22.encoding,
660-
DwarfRegEncodingAArch64.V23.encoding,
661-
DwarfRegEncodingAArch64.V24.encoding,
662-
DwarfRegEncodingAArch64.V25.encoding,
663-
DwarfRegEncodingAArch64.V26.encoding,
664-
DwarfRegEncodingAArch64.V27.encoding,
665-
DwarfRegEncodingAArch64.V28.encoding,
666-
DwarfRegEncodingAArch64.V29.encoding,
667-
DwarfRegEncodingAArch64.V30.encoding,
668-
DwarfRegEncodingAArch64.V31.encoding,
611+
DwarfRegEncodingAArch64.R0.encoding,
612+
DwarfRegEncodingAArch64.R1.encoding,
613+
DwarfRegEncodingAArch64.R2.encoding,
614+
DwarfRegEncodingAArch64.R3.encoding,
615+
DwarfRegEncodingAArch64.R4.encoding,
616+
DwarfRegEncodingAArch64.R5.encoding,
617+
DwarfRegEncodingAArch64.R6.encoding,
618+
DwarfRegEncodingAArch64.R7.encoding,
619+
DwarfRegEncodingAArch64.R8.encoding,
620+
DwarfRegEncodingAArch64.R9.encoding,
621+
DwarfRegEncodingAArch64.R10.encoding,
622+
DwarfRegEncodingAArch64.R11.encoding,
623+
DwarfRegEncodingAArch64.R12.encoding,
624+
DwarfRegEncodingAArch64.R13.encoding,
625+
DwarfRegEncodingAArch64.R14.encoding,
626+
DwarfRegEncodingAArch64.R15.encoding,
627+
DwarfRegEncodingAArch64.R16.encoding,
628+
DwarfRegEncodingAArch64.R17.encoding,
629+
DwarfRegEncodingAArch64.R18.encoding,
630+
DwarfRegEncodingAArch64.R19.encoding,
631+
DwarfRegEncodingAArch64.R20.encoding,
632+
DwarfRegEncodingAArch64.R21.encoding,
633+
DwarfRegEncodingAArch64.R22.encoding,
634+
DwarfRegEncodingAArch64.R23.encoding,
635+
DwarfRegEncodingAArch64.R24.encoding,
636+
DwarfRegEncodingAArch64.R25.encoding,
637+
DwarfRegEncodingAArch64.R26.encoding,
638+
DwarfRegEncodingAArch64.R27.encoding,
639+
DwarfRegEncodingAArch64.R28.encoding,
640+
DwarfRegEncodingAArch64.R29.encoding,
641+
DwarfRegEncodingAArch64.R30.encoding,
642+
DwarfRegEncodingAArch64.R31.encoding,
643+
DwarfRegEncodingAArch64.ZR.encoding,
644+
DwarfRegEncodingAArch64.SP.encoding,
645+
DwarfRegEncodingAArch64.V0.encoding,
646+
DwarfRegEncodingAArch64.V1.encoding,
647+
DwarfRegEncodingAArch64.V2.encoding,
648+
DwarfRegEncodingAArch64.V3.encoding,
649+
DwarfRegEncodingAArch64.V4.encoding,
650+
DwarfRegEncodingAArch64.V5.encoding,
651+
DwarfRegEncodingAArch64.V6.encoding,
652+
DwarfRegEncodingAArch64.V7.encoding,
653+
DwarfRegEncodingAArch64.V8.encoding,
654+
DwarfRegEncodingAArch64.V9.encoding,
655+
DwarfRegEncodingAArch64.V10.encoding,
656+
DwarfRegEncodingAArch64.V11.encoding,
657+
DwarfRegEncodingAArch64.V12.encoding,
658+
DwarfRegEncodingAArch64.V13.encoding,
659+
DwarfRegEncodingAArch64.V14.encoding,
660+
DwarfRegEncodingAArch64.V15.encoding,
661+
DwarfRegEncodingAArch64.V16.encoding,
662+
DwarfRegEncodingAArch64.V17.encoding,
663+
DwarfRegEncodingAArch64.V18.encoding,
664+
DwarfRegEncodingAArch64.V19.encoding,
665+
DwarfRegEncodingAArch64.V20.encoding,
666+
DwarfRegEncodingAArch64.V21.encoding,
667+
DwarfRegEncodingAArch64.V22.encoding,
668+
DwarfRegEncodingAArch64.V23.encoding,
669+
DwarfRegEncodingAArch64.V24.encoding,
670+
DwarfRegEncodingAArch64.V25.encoding,
671+
DwarfRegEncodingAArch64.V26.encoding,
672+
DwarfRegEncodingAArch64.V27.encoding,
673+
DwarfRegEncodingAArch64.V28.encoding,
674+
DwarfRegEncodingAArch64.V29.encoding,
675+
DwarfRegEncodingAArch64.V30.encoding,
676+
DwarfRegEncodingAArch64.V31.encoding,
669677
};
670678

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

713721
// map from compiler X86_64 register indices to corresponding dwarf AMD64 register index
714722
private static final int[] GRAAL_X86_64_TO_DWARF_REG_MAP = {
715-
DwarfRegEncodingAMD64.RAX.encoding,
716-
DwarfRegEncodingAMD64.RCX.encoding,
717-
DwarfRegEncodingAMD64.RDX.encoding,
718-
DwarfRegEncodingAMD64.RBX.encoding,
719-
DwarfRegEncodingAMD64.RSP.encoding,
720-
DwarfRegEncodingAMD64.RBP.encoding,
721-
DwarfRegEncodingAMD64.RSI.encoding,
722-
DwarfRegEncodingAMD64.RDI.encoding,
723-
DwarfRegEncodingAMD64.R8.encoding,
724-
DwarfRegEncodingAMD64.R9.encoding,
725-
DwarfRegEncodingAMD64.R10.encoding,
726-
DwarfRegEncodingAMD64.R11.encoding,
727-
DwarfRegEncodingAMD64.R12.encoding,
728-
DwarfRegEncodingAMD64.R13.encoding,
729-
DwarfRegEncodingAMD64.R14.encoding,
730-
DwarfRegEncodingAMD64.R15.encoding,
731-
DwarfRegEncodingAMD64.XMM0.encoding,
732-
DwarfRegEncodingAMD64.XMM1.encoding,
733-
DwarfRegEncodingAMD64.XMM2.encoding,
734-
DwarfRegEncodingAMD64.XMM3.encoding,
735-
DwarfRegEncodingAMD64.XMM4.encoding,
736-
DwarfRegEncodingAMD64.XMM5.encoding,
737-
DwarfRegEncodingAMD64.XMM6.encoding,
738-
DwarfRegEncodingAMD64.XMM7.encoding,
739-
DwarfRegEncodingAMD64.XMM8.encoding,
740-
DwarfRegEncodingAMD64.XMM9.encoding,
741-
DwarfRegEncodingAMD64.XMM10.encoding,
742-
DwarfRegEncodingAMD64.XMM11.encoding,
743-
DwarfRegEncodingAMD64.XMM12.encoding,
744-
DwarfRegEncodingAMD64.XMM13.encoding,
745-
DwarfRegEncodingAMD64.XMM14.encoding,
746-
DwarfRegEncodingAMD64.XMM15.encoding,
723+
DwarfRegEncodingAMD64.RAX.encoding,
724+
DwarfRegEncodingAMD64.RCX.encoding,
725+
DwarfRegEncodingAMD64.RDX.encoding,
726+
DwarfRegEncodingAMD64.RBX.encoding,
727+
DwarfRegEncodingAMD64.RSP.encoding,
728+
DwarfRegEncodingAMD64.RBP.encoding,
729+
DwarfRegEncodingAMD64.RSI.encoding,
730+
DwarfRegEncodingAMD64.RDI.encoding,
731+
DwarfRegEncodingAMD64.R8.encoding,
732+
DwarfRegEncodingAMD64.R9.encoding,
733+
DwarfRegEncodingAMD64.R10.encoding,
734+
DwarfRegEncodingAMD64.R11.encoding,
735+
DwarfRegEncodingAMD64.R12.encoding,
736+
DwarfRegEncodingAMD64.R13.encoding,
737+
DwarfRegEncodingAMD64.R14.encoding,
738+
DwarfRegEncodingAMD64.R15.encoding,
739+
DwarfRegEncodingAMD64.XMM0.encoding,
740+
DwarfRegEncodingAMD64.XMM1.encoding,
741+
DwarfRegEncodingAMD64.XMM2.encoding,
742+
DwarfRegEncodingAMD64.XMM3.encoding,
743+
DwarfRegEncodingAMD64.XMM4.encoding,
744+
DwarfRegEncodingAMD64.XMM5.encoding,
745+
DwarfRegEncodingAMD64.XMM6.encoding,
746+
DwarfRegEncodingAMD64.XMM7.encoding,
747+
DwarfRegEncodingAMD64.XMM8.encoding,
748+
DwarfRegEncodingAMD64.XMM9.encoding,
749+
DwarfRegEncodingAMD64.XMM10.encoding,
750+
DwarfRegEncodingAMD64.XMM11.encoding,
751+
DwarfRegEncodingAMD64.XMM12.encoding,
752+
DwarfRegEncodingAMD64.XMM13.encoding,
753+
DwarfRegEncodingAMD64.XMM14.encoding,
754+
DwarfRegEncodingAMD64.XMM15.encoding,
747755
};
748756
}

0 commit comments

Comments
 (0)