Skip to content

Commit f1fbd82

Browse files
committed
[GR-29340] Fix CE dwarf debugtypes debuginfo for compressed refs usecase.
PullRequest: graal/8273
2 parents ac54e93 + 1b9aeaf commit f1fbd82

File tree

8 files changed

+72
-42
lines changed

8 files changed

+72
-42
lines changed

substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/debugentry/DebugInfoBase.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,19 @@
2626

2727
package com.oracle.objectfile.debugentry;
2828

29-
import com.oracle.objectfile.debuginfo.DebugInfoProvider;
30-
import com.oracle.objectfile.debuginfo.DebugInfoProvider.DebugTypeInfo.DebugTypeKind;
31-
import com.oracle.objectfile.elf.dwarf.DwarfDebugInfo;
32-
import org.graalvm.compiler.debug.DebugContext;
33-
3429
import java.nio.ByteOrder;
3530
import java.nio.file.Path;
3631
import java.nio.file.Paths;
3732
import java.util.HashMap;
3833
import java.util.LinkedList;
3934
import java.util.Map;
4035

36+
import org.graalvm.compiler.debug.DebugContext;
37+
38+
import com.oracle.objectfile.debuginfo.DebugInfoProvider;
39+
import com.oracle.objectfile.debuginfo.DebugInfoProvider.DebugTypeInfo.DebugTypeKind;
40+
import com.oracle.objectfile.elf.dwarf.DwarfDebugInfo;
41+
4142
/**
4243
* An abstract class which indexes the information presented by the DebugInfoProvider in an
4344
* organization suitable for use by subclasses targeting a specific binary format.
@@ -126,6 +127,10 @@ public abstract class DebugInfoBase {
126127
* Number of bytes used to store an oop reference.
127128
*/
128129
private int oopReferenceSize;
130+
/**
131+
* Number of bytes used to store a raw pointer.
132+
*/
133+
private int pointerSize;
129134
/**
130135
* Alignment of object memory area (and, therefore, of any oop) in bytes.
131136
*/
@@ -141,6 +146,7 @@ public DebugInfoBase(ByteOrder byteOrder) {
141146
this.oopTagsCount = 0;
142147
this.oopCompressShift = 0;
143148
this.oopReferenceSize = 0;
149+
this.pointerSize = 0;
144150
this.oopAlignment = 0;
145151
this.oopAlignShift = 0;
146152
}
@@ -185,6 +191,9 @@ public void installDebugInfo(DebugInfoProvider debugInfoProvider) {
185191
/* Save number of bytes in a reference field. */
186192
oopReferenceSize = debugInfoProvider.oopReferenceSize();
187193

194+
/* Save pointer size of current target. */
195+
pointerSize = debugInfoProvider.pointerSize();
196+
188197
/* Save alignment of a reference. */
189198
oopAlignment = debugInfoProvider.oopAlignment();
190199

@@ -484,6 +493,10 @@ public int oopReferenceSize() {
484493
return oopReferenceSize;
485494
}
486495

496+
public int pointerSize() {
497+
return pointerSize;
498+
}
499+
487500
public int oopAlignment() {
488501
return oopAlignment;
489502
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ public interface DebugInfoProvider {
5555
*/
5656
int oopReferenceSize();
5757

58+
/**
59+
* Number of bytes used to store a raw pointer.
60+
*/
61+
int pointerSize();
62+
5863
/**
5964
* Alignment of object memory area (and, therefore, of any oop) in bytes.
6065
*/

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

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,13 @@
2626

2727
package com.oracle.objectfile.elf.dwarf;
2828

29+
import java.lang.reflect.Modifier;
30+
import java.util.LinkedList;
31+
import java.util.Map;
32+
import java.util.Set;
33+
34+
import org.graalvm.compiler.debug.DebugContext;
35+
2936
import com.oracle.objectfile.BuildDependency;
3037
import com.oracle.objectfile.LayoutDecision;
3138
import com.oracle.objectfile.LayoutDecisionMap;
@@ -41,15 +48,8 @@
4148
import com.oracle.objectfile.debugentry.Range;
4249
import com.oracle.objectfile.debugentry.StructureTypeEntry;
4350
import com.oracle.objectfile.debugentry.TypeEntry;
44-
import com.oracle.objectfile.elf.ELFObjectFile;
45-
import org.graalvm.compiler.debug.DebugContext;
46-
47-
import java.lang.reflect.Modifier;
48-
import java.util.LinkedList;
49-
import java.util.Map;
50-
import java.util.Set;
51-
5251
import com.oracle.objectfile.debuginfo.DebugInfoProvider.DebugPrimitiveTypeInfo;
52+
import com.oracle.objectfile.elf.ELFObjectFile;
5353

5454
/**
5555
* Section generator for debug_info section.
@@ -851,9 +851,9 @@ private int writeClassType(DebugContext context, ClassEntry classEntry, byte[] b
851851
int abbrevCode = DwarfDebugInfo.DW_ABBREV_CODE_class_pointer;
852852
log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode);
853853
pos = writeAbbrevCode(abbrevCode, buffer, pos);
854-
int byteSize = dwarfSections.oopReferenceSize();
855-
log(context, " [0x%08x] byte_size 0x%x", pos, byteSize);
856-
pos = writeAttrData1((byte) byteSize, buffer, pos);
854+
int pointerSize = dwarfSections.pointerSize();
855+
log(context, " [0x%08x] byte_size 0x%x", pos, pointerSize);
856+
pos = writeAttrData1((byte) pointerSize, buffer, pos);
857857
int layoutOffset = getLayoutIndex(classEntry);
858858
log(context, " [0x%08x] type 0x%x", pos, layoutOffset);
859859
pos = writeAttrRefAddr(layoutOffset, buffer, pos);
@@ -865,8 +865,9 @@ private int writeClassType(DebugContext context, ClassEntry classEntry, byte[] b
865865
abbrevCode = DwarfDebugInfo.DW_ABBREV_CODE_indirect_pointer;
866866
log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode);
867867
pos = writeAbbrevCode(abbrevCode, buffer, pos);
868-
log(context, " [0x%08x] byte_size 0x%x", pos, byteSize);
869-
pos = writeAttrData1((byte) byteSize, buffer, pos);
868+
int oopReferenceSize = dwarfSections.oopReferenceSize();
869+
log(context, " [0x%08x] byte_size 0x%x", pos, oopReferenceSize);
870+
pos = writeAttrData1((byte) oopReferenceSize, buffer, pos);
870871
layoutOffset = getIndirectLayoutIndex(classEntry);
871872
log(context, " [0x%08x] type 0x%x", pos, layoutOffset);
872873
pos = writeAttrRefAddr(layoutOffset, buffer, pos);
@@ -887,9 +888,9 @@ private int writeInterfaceType(DebugContext context, InterfaceClassEntry interfa
887888
int abbrevCode = DwarfDebugInfo.DW_ABBREV_CODE_interface_pointer;
888889
log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode);
889890
pos = writeAbbrevCode(abbrevCode, buffer, pos);
890-
int byteSize = dwarfSections.oopReferenceSize();
891-
log(context, " [0x%08x] byte_size 0x%x", pos, byteSize);
892-
pos = writeAttrData1((byte) byteSize, buffer, pos);
891+
int pointerSize = dwarfSections.pointerSize();
892+
log(context, " [0x%08x] byte_size 0x%x", pos, pointerSize);
893+
pos = writeAttrData1((byte) pointerSize, buffer, pos);
893894
int layoutOffset = getLayoutIndex(interfaceClassEntry);
894895
log(context, " [0x%08x] type 0x%x", pos, layoutOffset);
895896
pos = writeAttrRefAddr(layoutOffset, buffer, pos);
@@ -901,6 +902,7 @@ private int writeInterfaceType(DebugContext context, InterfaceClassEntry interfa
901902
abbrevCode = DwarfDebugInfo.DW_ABBREV_CODE_indirect_pointer;
902903
log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode);
903904
pos = writeAbbrevCode(abbrevCode, buffer, pos);
905+
int byteSize = dwarfSections.oopReferenceSize();
904906
log(context, " [0x%08x] byte_size 0x%x", pos, byteSize);
905907
pos = writeAttrData1((byte) byteSize, buffer, pos);
906908
layoutOffset = getIndirectLayoutIndex(interfaceClassEntry);
@@ -1155,9 +1157,9 @@ private int writeArrayTypes(DebugContext context, ArrayTypeEntry arrayTypeEntry,
11551157
int abbrevCode = DwarfDebugInfo.DW_ABBREV_CODE_array_pointer;
11561158
log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode);
11571159
pos = writeAbbrevCode(abbrevCode, buffer, pos);
1158-
int byteSize = dwarfSections.oopReferenceSize();
1159-
log(context, " [0x%08x] byte_size 0x%x", pos, byteSize);
1160-
pos = writeAttrData1((byte) byteSize, buffer, pos);
1160+
int pointerSize = dwarfSections.pointerSize();
1161+
log(context, " [0x%08x] byte_size 0x%x", pos, pointerSize);
1162+
pos = writeAttrData1((byte) pointerSize, buffer, pos);
11611163
log(context, " [0x%08x] type (pointer) 0x%x (%s)", pos, layoutOffset, name);
11621164
pos = writeAttrRefAddr(layoutOffset, buffer, pos);
11631165

@@ -1168,6 +1170,7 @@ private int writeArrayTypes(DebugContext context, ArrayTypeEntry arrayTypeEntry,
11681170
abbrevCode = DwarfDebugInfo.DW_ABBREV_CODE_indirect_pointer;
11691171
log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode);
11701172
pos = writeAbbrevCode(abbrevCode, buffer, pos);
1173+
int byteSize = dwarfSections.oopReferenceSize();
11711174
log(context, " [0x%08x] byte_size 0x%x", pos, byteSize);
11721175
pos = writeAttrData1((byte) byteSize, buffer, pos);
11731176
log(context, " [0x%08x] type (pointer) 0x%x (%s)", pos, indirectLayoutOffset, name);

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,7 +451,7 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Integer o
451451
}
452452
};
453453

454-
private static void defaultDebugInfoValueUpdateHandler(EconomicMap<OptionKey<?>, Object> values, @SuppressWarnings("unused") Integer oldValue, Integer newValue) {
454+
public static void defaultDebugInfoValueUpdateHandler(EconomicMap<OptionKey<?>, Object> values, @SuppressWarnings("unused") Integer oldValue, Integer newValue) {
455455
// force update of TrackNodeSourcePosition and DeleteLocalSymbols
456456
TrackNodeSourcePosition.update(values, newValue > 0);
457457
DeleteLocalSymbols.update(values, newValue == 0);

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/NativeImageGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -663,7 +663,7 @@ private void doRun(Map<Method, CEntryPointData> entryPoints,
663663
featureHandler.forEachFeature(feature -> feature.afterHeapLayout(config));
664664

665665
this.image = AbstractBootImage.create(k, hUniverse, hMetaAccess, nativeLibraries, heap, codeCache, hostedEntryPoints, loader.getClassLoader());
666-
image.build(debug);
666+
image.build(imageName, debug);
667667
if (NativeImageOptions.PrintUniverse.getValue()) {
668668
/*
669669
* This debug output must be printed _after_ and not _during_ image

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/AbstractBootImage.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ public NativeLibraries getNativeLibs() {
123123
* Build the image. Calling this method is a precondition to calling {@link #write}. It
124124
* typically finalizes content of the object. It does not build debug information.
125125
*/
126-
public abstract void build(DebugContext debug);
126+
public abstract void build(String imageName, DebugContext debug);
127127

128128
/**
129129
* Write the image to the named file. This also writes debug information -- either to the same

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeBootImage.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262

6363
import com.oracle.graal.pointsto.meta.AnalysisMethod;
6464
import com.oracle.graal.pointsto.meta.AnalysisType;
65+
import com.oracle.graal.pointsto.util.Timer;
6566
import com.oracle.objectfile.BasicProgbitsSectionImpl;
6667
import com.oracle.objectfile.BuildDependency;
6768
import com.oracle.objectfile.LayoutDecision;
@@ -400,7 +401,7 @@ private ObjectFile.Symbol defineRelocationForSymbol(String name, long position)
400401
*/
401402
@Override
402403
@SuppressWarnings("try")
403-
public void build(DebugContext debug) {
404+
public void build(String imageName, DebugContext debug) {
404405
try (DebugContext.Scope buildScope = debug.scope("NativeBootImage.build")) {
405406
final CGlobalDataFeature cGlobals = CGlobalDataFeature.singleton();
406407

@@ -450,9 +451,11 @@ public void build(DebugContext debug) {
450451
* If we constructed debug info give the object file a chance to install it
451452
*/
452453
if (SubstrateOptions.GenerateDebugInfo.getValue(HostedOptionValues.singleton()) > 0) {
453-
ImageSingletons.add(SourceManager.class, new SourceManager());
454-
DebugInfoProvider provider = new NativeImageDebugInfoProvider(debug, codeCache, heap);
455-
objectFile.installDebugInfo(provider);
454+
try (Timer.StopTimer t = new Timer(imageName, "dbginfo").start()) {
455+
ImageSingletons.add(SourceManager.class, new SourceManager());
456+
DebugInfoProvider provider = new NativeImageDebugInfoProvider(debug, codeCache, heap);
457+
objectFile.installDebugInfo(provider);
458+
}
456459
}
457460
// - Write the heap to its own section.
458461
// Dynamic linkers/loaders generally don't ensure any alignment to more than page

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/image/NativeImageDebugInfoProvider.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,17 @@
3636
import java.util.function.Consumer;
3737
import java.util.stream.Stream;
3838

39+
import org.graalvm.compiler.code.CompilationResult;
40+
import org.graalvm.compiler.code.SourceMapping;
41+
import org.graalvm.compiler.core.common.CompressEncoding;
42+
import org.graalvm.compiler.debug.DebugContext;
43+
import org.graalvm.compiler.graph.NodeSourcePosition;
44+
import org.graalvm.nativeimage.ImageSingletons;
45+
3946
import com.oracle.graal.pointsto.infrastructure.OriginalClassProvider;
4047
import com.oracle.graal.pointsto.infrastructure.WrappedJavaMethod;
4148
import com.oracle.graal.pointsto.meta.AnalysisType;
4249
import com.oracle.objectfile.debuginfo.DebugInfoProvider;
43-
4450
import com.oracle.svm.core.StaticFieldsSupport;
4551
import com.oracle.svm.core.SubstrateOptions;
4652
import com.oracle.svm.core.config.ConfigurationValues;
@@ -57,26 +63,19 @@
5763
import com.oracle.svm.hosted.meta.HostedArrayClass;
5864
import com.oracle.svm.hosted.meta.HostedClass;
5965
import com.oracle.svm.hosted.meta.HostedField;
60-
import com.oracle.svm.hosted.meta.HostedMethod;
61-
import com.oracle.svm.hosted.meta.HostedType;
6266
import com.oracle.svm.hosted.meta.HostedInstanceClass;
6367
import com.oracle.svm.hosted.meta.HostedInterface;
68+
import com.oracle.svm.hosted.meta.HostedMethod;
6469
import com.oracle.svm.hosted.meta.HostedPrimitiveType;
65-
70+
import com.oracle.svm.hosted.meta.HostedType;
6671
import com.oracle.svm.hosted.substitute.InjectedFieldsType;
6772
import com.oracle.svm.hosted.substitute.SubstitutionField;
6873
import com.oracle.svm.hosted.substitute.SubstitutionMethod;
6974
import com.oracle.svm.hosted.substitute.SubstitutionType;
70-
import jdk.vm.ci.meta.ResolvedJavaField;
71-
import org.graalvm.compiler.code.CompilationResult;
72-
import org.graalvm.compiler.code.SourceMapping;
73-
import org.graalvm.compiler.core.common.CompressEncoding;
74-
import org.graalvm.compiler.debug.DebugContext;
75-
import org.graalvm.compiler.graph.NodeSourcePosition;
76-
import org.graalvm.nativeimage.ImageSingletons;
7775

7876
import jdk.vm.ci.meta.JavaKind;
7977
import jdk.vm.ci.meta.LineNumberTable;
78+
import jdk.vm.ci.meta.ResolvedJavaField;
8079
import jdk.vm.ci.meta.ResolvedJavaMethod;
8180
import jdk.vm.ci.meta.ResolvedJavaType;
8281
import jdk.vm.ci.meta.Signature;
@@ -93,6 +92,7 @@ class NativeImageDebugInfoProvider implements DebugInfoProvider {
9392
int compressShift;
9493
int tagsMask;
9594
int referenceSize;
95+
int pointerSize;
9696
int referenceAlignment;
9797
int primitiveStartOffset;
9898
int referenceStartOffset;
@@ -115,6 +115,7 @@ class NativeImageDebugInfoProvider implements DebugInfoProvider {
115115
this.compressShift = 0;
116116
}
117117
this.referenceSize = getObjectLayout().getReferenceSize();
118+
this.pointerSize = ConfigurationValues.getTarget().wordSize;
118119
this.referenceAlignment = getObjectLayout().getAlignment();
119120
/* Offsets need to be adjusted relative to the heap base plus partition-specific offset. */
120121
primitiveStartOffset = (int) primitiveFields.getOffset();
@@ -136,6 +137,11 @@ public int oopReferenceSize() {
136137
return referenceSize;
137138
}
138139

140+
@Override
141+
public int pointerSize() {
142+
return pointerSize;
143+
}
144+
139145
@Override
140146
public int oopAlignment() {
141147
return referenceAlignment;

0 commit comments

Comments
 (0)