@@ -172,6 +172,7 @@ private int writeBuiltInTypes(DebugContext context, byte[] buffer, int p) {
172172 // Write the single Java builtin unit header
173173 int lengthPos = pos ;
174174 log (context , " [0x%08x] <0> Java Builtin Compile Unit" , pos );
175+ cuStart = p ;
175176 pos = writeCUHeader (buffer , pos );
176177 assert pos == lengthPos + DW_DIE_HEADER_SIZE ;
177178 int abbrevCode = DwarfDebugInfo .DW_ABBREV_CODE_builtin_unit ;
@@ -736,21 +737,19 @@ private int writeMethodDeclaration(DebugContext context, ClassEntry classEntry,
736737 pos = writeFlag ((byte ) 1 , buffer , pos );
737738 int typeIdx = getLayoutIndex (classEntry );
738739 log (context , " [0x%08x] containing_type 0x%x (%s)" , pos , typeIdx , classEntry .getTypeName ());
739- pos = writeInfoSectionOffset (typeIdx , buffer , pos );
740+ pos = writeAttrRef4 (typeIdx , buffer , pos );
740741 if (abbrevCode == DwarfDebugInfo .DW_ABBREV_CODE_method_declaration ) {
741742 /* Record the current position so we can back patch the object pointer. */
742743 int objectPointerIndex = pos ;
743744 /*
744745 * Write a dummy ref address to move pos on to where the first parameter gets written.
745- *
746- * n.b. buffer is passed as null so we don't attempt to create a reloc!
747746 */
748- pos = writeInfoSectionOffset (0 , null , pos );
747+ pos = writeAttrRef4 (0 , null , pos );
749748 /*
750749 * Now backpatch object pointer slot with current pos, identifying the first parameter.
751750 */
752751 log (context , " [0x%08x] object_pointer 0x%x" , objectPointerIndex , pos );
753- writeInfoSectionOffset (pos , buffer , objectPointerIndex );
752+ writeAttrRef4 (pos , buffer , objectPointerIndex );
754753 }
755754 /* Write method parameter declarations. */
756755 pos = writeMethodParameterDeclarations (context , method , fileIdx , 3 , buffer , pos );
@@ -1116,7 +1115,7 @@ private int writeClassType(DebugContext context, ClassEntry classEntry, byte[] b
11161115 pos = writeAttrData1 ((byte ) pointerSize , buffer , pos );
11171116 int layoutOffset = getLayoutIndex (classEntry );
11181117 log (context , " [0x%08x] type 0x%x" , pos , layoutOffset );
1119- pos = writeInfoSectionOffset (layoutOffset , buffer , pos );
1118+ pos = writeAttrRef4 (layoutOffset , buffer , pos );
11201119
11211120 if (dwarfSections .useHeapBase ()) {
11221121 /* Define an indirect pointer type referring to the indirect layout. */
@@ -1130,7 +1129,7 @@ private int writeClassType(DebugContext context, ClassEntry classEntry, byte[] b
11301129 pos = writeAttrData1 ((byte ) oopReferenceSize , buffer , pos );
11311130 layoutOffset = getIndirectLayoutIndex (classEntry );
11321131 log (context , " [0x%08x] type 0x%x" , pos , layoutOffset );
1133- pos = writeInfoSectionOffset (layoutOffset , buffer , pos );
1132+ pos = writeAttrRef4 (layoutOffset , buffer , pos );
11341133 } else {
11351134 setIndirectTypeIndex (classEntry , typeIdx );
11361135 }
@@ -1153,7 +1152,7 @@ private int writeInterfaceType(DebugContext context, InterfaceClassEntry interfa
11531152 pos = writeAttrData1 ((byte ) pointerSize , buffer , pos );
11541153 int layoutOffset = getLayoutIndex (interfaceClassEntry );
11551154 log (context , " [0x%08x] type 0x%x" , pos , layoutOffset );
1156- pos = writeInfoSectionOffset (layoutOffset , buffer , pos );
1155+ pos = writeAttrRef4 (layoutOffset , buffer , pos );
11571156
11581157 if (dwarfSections .useHeapBase ()) {
11591158 /* Define an indirect pointer type referring to the indirect layout. */
@@ -1167,7 +1166,7 @@ private int writeInterfaceType(DebugContext context, InterfaceClassEntry interfa
11671166 pos = writeAttrData1 ((byte ) byteSize , buffer , pos );
11681167 layoutOffset = getIndirectLayoutIndex (interfaceClassEntry );
11691168 log (context , " [0x%08x] type 0x%x" , pos , layoutOffset );
1170- pos = writeInfoSectionOffset (layoutOffset , buffer , pos );
1169+ pos = writeAttrRef4 (layoutOffset , buffer , pos );
11711170 } else {
11721171 setIndirectTypeIndex (interfaceClassEntry , typeIdx );
11731172 }
@@ -1192,6 +1191,8 @@ private int writeForeignType(DebugContext context, ForeignTypeEntry foreignTypeE
11921191 int pointerSize = dwarfSections .pointerSize ();
11931192 log (context , " [0x%08x] byte_size 0x%x" , pos , pointerSize );
11941193 pos = writeAttrData1 ((byte ) pointerSize , buffer , pos );
1194+ // Note that we write a ref_addr offset here because an unknown (void *)
1195+ // foreign type can have a layout offset that is not in its CU
11951196 log (context , " [0x%08x] type 0x%x" , pos , layoutOffset );
11961197 pos = writeInfoSectionOffset (layoutOffset , buffer , pos );
11971198
@@ -1205,7 +1206,7 @@ private int writeForeignType(DebugContext context, ForeignTypeEntry foreignTypeE
12051206 log (context , " [0x%08x] name %s" , pos , name );
12061207 pos = writeStrSectionOffset (name , buffer , pos );
12071208 log (context , " [0x%08x] type 0x%x" , pos , refTypeIdx );
1208- pos = writeInfoSectionOffset (refTypeIdx , buffer , pos );
1209+ pos = writeAttrRef4 (refTypeIdx , buffer , pos );
12091210
12101211 setTypeIndex (foreignTypeEntry , typedefIdx );
12111212 // foreign pointers are never stored compressed so don't need a separate indirect type
@@ -1253,6 +1254,7 @@ private int writeArrays(DebugContext context, byte[] buffer, int p) {
12531254 log (context , " [0x%08x] array classes" , p );
12541255 Cursor cursor = new Cursor (p );
12551256 arrayTypeStream ().forEach (arrayTypeEntry -> {
1257+ cuStart = cursor .get ();
12561258 cursor .set (writeArray (context , arrayTypeEntry , buffer , cursor .get ()));
12571259 });
12581260 return cursor .get ();
@@ -1484,7 +1486,7 @@ private int writeArrayTypes(DebugContext context, ArrayTypeEntry arrayTypeEntry,
14841486 log (context , " [0x%08x] byte_size 0x%x" , pos , pointerSize );
14851487 pos = writeAttrData1 ((byte ) pointerSize , buffer , pos );
14861488 log (context , " [0x%08x] type (pointer) 0x%x (%s)" , pos , layoutOffset , name );
1487- pos = writeInfoSectionOffset (layoutOffset , buffer , pos );
1489+ pos = writeAttrRef4 (layoutOffset , buffer , pos );
14881490
14891491 if (dwarfSections .useHeapBase ()) {
14901492 setIndirectTypeIndex (arrayTypeEntry , pos );
@@ -1497,7 +1499,7 @@ private int writeArrayTypes(DebugContext context, ArrayTypeEntry arrayTypeEntry,
14971499 log (context , " [0x%08x] byte_size 0x%x" , pos , byteSize );
14981500 pos = writeAttrData1 ((byte ) byteSize , buffer , pos );
14991501 log (context , " [0x%08x] type (pointer) 0x%x (%s)" , pos , indirectLayoutOffset , name );
1500- pos = writeInfoSectionOffset (indirectLayoutOffset , buffer , pos );
1502+ pos = writeAttrRef4 (indirectLayoutOffset , buffer , pos );
15011503 } else {
15021504 setIndirectTypeIndex (arrayTypeEntry , typeIdx );
15031505 }
@@ -1532,7 +1534,7 @@ private int writeMethodLocation(DebugContext context, ClassEntry classEntry, Com
15321534 String methodKey = primary .getSymbolName ();
15331535 int methodSpecOffset = getMethodDeclarationIndex (primary .getMethodEntry ());
15341536 log (context , " [0x%08x] specification 0x%x (%s)" , pos , methodSpecOffset , methodKey );
1535- pos = writeInfoSectionOffset (methodSpecOffset , buffer , pos );
1537+ pos = writeAttrRef4 (methodSpecOffset , buffer , pos );
15361538 HashMap <DebugLocalInfo , List <SubRange >> varRangeMap = primary .getVarRangeMap ();
15371539 pos = writeMethodParameterLocations (context , varRangeMap , primary , 2 , buffer , pos );
15381540 pos = writeMethodLocalLocations (context , varRangeMap , primary , 2 , buffer , pos );
0 commit comments