diff --git a/substratevm/debug/gdbpy/gdb-debughelpers.py b/substratevm/debug/gdbpy/gdb-debughelpers.py index 56fa26de068f..561c06793d99 100644 --- a/substratevm/debug/gdbpy/gdb-debughelpers.py +++ b/substratevm/debug/gdbpy/gdb-debughelpers.py @@ -108,6 +108,7 @@ class SVMUtil: string_type = gdb.lookup_type("java.lang.String") enum_type = gdb.lookup_type("java.lang.Enum") object_type = gdb.lookup_type("java.lang.Object") + object_header_type = gdb.lookup_type("_objhdr") hub_type = gdb.lookup_type("Encoded$Dynamic$Hub") null = gdb.Value(0).cast(object_type.pointer()) classloader_type = gdb.lookup_type("java.lang.ClassLoader") @@ -670,7 +671,8 @@ def children(self) -> Iterable[object]: trace(' - children (class field iterator)') if self.__skip_children: return - fields = [str(f.name) for f in SVMUtil.get_all_fields(self.__obj.type, svm_print_static_fields.value) if f.name != SVMUtil.hub_field_name] + # hide fields from the object header + fields = [str(f.name) for f in SVMUtil.get_all_fields(self.__obj.type, svm_print_static_fields.value) if f.parent_type != SVMUtil.object_header_type] for index, f in enumerate(fields): trace(f' - children: field "{f}"') # apply custom limit only for java objects diff --git a/substratevm/mx.substratevm/testhello.py b/substratevm/mx.substratevm/testhello.py index eb5c6e6645c3..1eb5418a1839 100644 --- a/substratevm/mx.substratevm/testhello.py +++ b/substratevm/mx.substratevm/testhello.py @@ -88,7 +88,7 @@ def test(): execute("set print symbol off") exec_string = execute("ptype _objhdr") - fixed_idhash_field = "int idHash;" in exec_string + has_reserved_field = "reserved;" in exec_string # Print DefaultGreeter and check the modifiers of its methods and fields exec_string = execute("ptype 'hello.Hello$DefaultGreeter'") @@ -223,7 +223,7 @@ def test(): fr"{spaces_pattern} = {{", fr"{spaces_pattern}<_objhdr> = {{", fr"{spaces_pattern}hub = {address_pattern}", - fr"{spaces_pattern}idHash = {address_pattern}" if fixed_idhash_field else None, + fr"{spaces_pattern}reserved = {address_pattern}" if has_reserved_field else None, fr"{spaces_pattern}}}, }}, ", fr"{spaces_pattern}members of java\.lang\.String\[\]:", fr"{spaces_pattern}len = 0x0,", @@ -241,7 +241,7 @@ def test(): fr"{spaces_pattern} = {{", fr"{spaces_pattern}<_objhdr> = {{", fr"{spaces_pattern}hub = {address_pattern}", - fr"{spaces_pattern}idHash = {address_pattern}" if fixed_idhash_field else None, + fr"{spaces_pattern}reserved = {address_pattern}" if has_reserved_field else None, fr"{spaces_pattern}}}, }},", fr"{spaces_pattern}members of java\.lang\.Class:", fr"{spaces_pattern}name = {address_pattern},", @@ -278,7 +278,7 @@ def test(): fr"{spaces_pattern} = {{", fr"{spaces_pattern}<_objhdr> = {{", fr"{spaces_pattern}hub = {address_pattern}", - fr"{spaces_pattern}idHash = {address_pattern}" if fixed_idhash_field else None, + fr"{spaces_pattern}reserved = {address_pattern}" if has_reserved_field else None, fr"{spaces_pattern}}}, }},", fr"{spaces_pattern}members of java\.lang\.Class:", fr"{spaces_pattern}name = {address_pattern},", @@ -382,7 +382,7 @@ def test(): exec_string = execute("ptype _objhdr") rexp = [r"type = struct _objhdr {", fr"{spaces_pattern}Encoded\$Dynamic\$Hub \*hub;", - fr"{spaces_pattern}int idHash;" if fixed_idhash_field else None, + fr"{spaces_pattern}(int|long) reserved;" if has_reserved_field else None, r"}"] checker = Checker('ptype _objhdr', rexp) diff --git a/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfInfoSectionImpl.java b/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfInfoSectionImpl.java index ba509b7873d5..954ebb572637 100644 --- a/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfInfoSectionImpl.java +++ b/substratevm/src/com.oracle.objectfile/src/com/oracle/objectfile/elf/dwarf/DwarfInfoSectionImpl.java @@ -332,9 +332,9 @@ private int writeHeaderType(DebugContext context, HeaderTypeEntry headerTypeEntr String name = uniqueDebugString(DwarfDebugInfo.HUB_TYPE_NAME); log(context, " [0x%08x] name 0x%x (%s)", pos, debugStringIndex(name), name); pos = writeStrSectionOffset(name, buffer, pos); - int size = hubType.getSize(); - log(context, " [0x%08x] byte_size 0x%x", pos, size); - pos = writeAttrData2((short) size, buffer, pos); + int hubTypeSize = hubType.getSize(); + log(context, " [0x%08x] byte_size 0x%x", pos, hubTypeSize); + pos = writeAttrData2((short) hubTypeSize, buffer, pos); /* Write a data location expression to mask and/or rebase hub pointers. */ log(context, " [0x%08x] data_location", pos); pos = writeCompressedOopConversionExpression(true, buffer, pos); @@ -354,9 +354,9 @@ private int writeHeaderType(DebugContext context, HeaderTypeEntry headerTypeEntr abbrevCode = AbbrevCode.TYPE_POINTER; log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode.ordinal()); pos = writeAbbrevCode(abbrevCode, buffer, pos); - int pointerSize = dwarfSections.referenceSize(); - log(context, " [0x%08x] byte_size 0x%x", pos, pointerSize); - pos = writeAttrData1((byte) pointerSize, buffer, pos); + int hubSize = hubField.getSize(); + log(context, " [0x%08x] byte_size 0x%x", pos, hubSize); + pos = writeAttrData1((byte) hubSize, buffer, pos); log(context, " [0x%08x] type 0x%x", pos, hubLayoutTypeIdx); pos = writeAttrRef4(hubLayoutTypeIdx, buffer, pos); @@ -365,15 +365,15 @@ private int writeHeaderType(DebugContext context, HeaderTypeEntry headerTypeEntr /* Write the type representing the object header. */ name = headerTypeEntry.getTypeName(); - size = hubField.getSize(); + int headerSize = headerTypeEntry.getSize(); log(context, " [0x%08x] header type %s", pos, name); abbrevCode = AbbrevCode.OBJECT_HEADER; log(context, " [0x%08x] <1> Abbrev Number %d", pos, abbrevCode.ordinal()); pos = writeAbbrevCode(abbrevCode, buffer, pos); log(context, " [0x%08x] name 0x%x (%s)", pos, debugStringIndex(name), name); pos = writeStrSectionOffset(name, buffer, pos); - log(context, " [0x%08x] byte_size 0x%x", pos, size); - pos = writeAttrData1((byte) size, buffer, pos); + log(context, " [0x%08x] byte_size 0x%x", pos, headerSize); + pos = writeAttrData1((byte) headerSize, buffer, pos); pos = writeHubField(context, hubField, hubTypeIdx, buffer, pos); pos = writeStructFields(context, headerTypeEntry.fields(), buffer, pos);