Recent versions of the AIX toolchain now support the debug_macinfo
section.  The section header of the macinfo_section includes a
reference to the debug lineptr. As with the earlier adjustment to the
debug line reference in the debug_info section, the debug_macinfo
section requires a similar adjustment.

The adjustment is necessary because the AIX assembler inserts the
debug line section length, which causes the GCC generated label for
the beginning of the section to point to the incorrect location
expected by debuggers, such as GDB.

This patch mirrors the earlier patch to copy debug_section_label into
dl_section_ref and append the adjustment when necessary.  With this
patch, GDB is able to report correct macro information.

Bootstrapped on powerpc-ibm-aix7.2.0.0

Okay?

Thanks, David

        * dwarf2out.c (output_macinfo): Copy debug_line_section_label
to dl_section_ref.  On AIX, append an expression to subtract the size
of the section length to dl_section_ref.

Index: dwarf2out.c
===================================================================
--- dwarf2out.c (revision 250453)
+++ dwarf2out.c (working copy)
@@ -26975,6 +26975,7 @@ output_macinfo (void)
   macinfo_entry *ref;
   vec<macinfo_entry, va_gc> *files = NULL;
   macinfo_hash_type *macinfo_htab = NULL;
+  char dl_section_ref[MAX_ARTIFICIAL_LABEL_BYTES];

   if (! length)
     return;
@@ -26985,6 +26986,12 @@ output_macinfo (void)
              && (int) DW_MACINFO_start_file == (int) DW_MACRO_start_file
              && (int) DW_MACINFO_end_file == (int) DW_MACRO_end_file);

+  /* AIX Assembler inserts the length, so adjust the reference to match the
+     offset expected by debuggers.  */
+  strcpy (dl_section_ref, debug_line_section_label);
+  if (XCOFF_DEBUGGING_INFO)
+    strcat (dl_section_ref, DWARF_INITIAL_LENGTH_SIZE_STR);
+
   /* For .debug_macro emit the section header.  */
   if (!dwarf_strict || dwarf_version >= 5)
     {
@@ -26995,7 +27002,7 @@ output_macinfo (void)
       else
        dw2_asm_output_data (1, 2, "Flags: 32-bit, lineptr present");
       dw2_asm_output_offset (DWARF_OFFSET_SIZE,
-                             (!dwarf_split_debug_info ?
debug_line_section_label
+                             (!dwarf_split_debug_info ? dl_section_ref
                               : debug_skeleton_line_section_label),
                              debug_line_section, NULL);

Reply via email to