This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC,PATCH] DWARF support for AIX


On Sun, Sep 20, 2015 at 4:25 PM, David Edelsohn <dje.gcc@gmail.com> wrote:
> Appended is an initial implementation of DWARF support for AIX.  The
> patch emits the correct sections and works with the existing DWARF
> support for AIX XCOFF in GDB ... somewhat.
>
> First, AIX only supports a subset of DWARF sections.  AIX does not
> support DWARF debug frame sections, although DWARF unwind frame
> sections are produced and consumed internally by GCC.  I initially
> tried bracketing dwarf2out.c:output_call_frame_info() with #ifdef, but
> then changed to setting targetm.debug_unwind_info() to UI_NONE.  This
> change prevents the debug frame info, but the debug location section
> newly appeared, which AIX also does not support.  So I must bracket
> output_location_lists with #ifdef AIX.  Setting and checking for
> something like a NULL section name specifically for AIX seems more
> complicated and cumbersome.
>
> Second, recent releases of XLC support DWARF debug info.  GDB
> understands the DWARF information from XLC.  GDB xcoffread.c performs
> the mostly normal
>
>   if (dwarf2_has_info (objfile, &dwarf2_xcoff_names))
>     dwarf2_build_psymtabs (objfile);
>
>   dwarf2_build_frame_info (objfile);
>
> so I do not see anything unusual in what it expects to parse.
> HOWEVER, XLC DWARF sections begin with the DWARF version number, not
> the length, e.g.,
>
>        .dwsect 0x00020000              # section name .dwline
> .dwline:
> #               0x00000400              # section address
> #       .long   0x00000049              # section length
>         .short  0x0002                  # dwarf version
>
>         .dwsect 0x00010000              # section name .dwinfo
> .dwinfo:
> #               0x00000500              # section address
> #       .long   0x0000013e              # section length
>         .short  0x0002                  # dwarf version
>
> And that is exactly the way the XLC disassembly appears, comments and
> everything.  The section length is commented out.
>
> If I manually comment out the section length information in the GCC
> DWARF debugging information, trivial tests of GDB on AIX function
> correctly, e.g., it shows the correct file, function and line numbers.
>
> GDB accepts and understands XLC DWARF debug information WITHOUT
> section length but does not understand GCC DWARF debug information
> WITH section length.  DWARF for other ELF targets includes the section
> length and does appear to hinder GDB.
>
> How can I adjust the DWARF produced by GCC or the DWARF consumed by
> GDB to address the section length information?

You probably need to add a target hook to do that.  Note this isn't
"section length"
but the size of the CU header.  At least on all other targets I know of:

        .section        .debug_info,"",@progbits
.Ldebug_info0:
        .long   0x64    # Length of Compilation Unit Info
        .value  0x4     # DWARF version number

and the format of that header is specified by the DWARF standard.  So I wonder
why XLC chose to do sth non-conforming here (again :/)

Richard.

> Thanks, David
>
>        * dwarf2out.c (dwarf2out_finish): Don't output location
>         lists on AIX.
>         * config/rs6000/rs6000.c (rs6000_xcoff_debug_unwind_info):
>         New.
>         (rs6000_xcoff_asm_named_section): Emit .dwsect pseudo-op
>         for SECTION_DEBUG.
>         (rs6000_xcoff_declare_function_name): Emit different
>         .function pseudo-op when DWARF2_DEBUG.
>         * config/rs6000/xcoff.h (TARGET_DEBUG_UNWIND_INFO):
>         Redefine.
>         * config/rs6000/aix71.h (DWARF2_DEBUGGING_INFO): Define.
>         (PREFERRED_DEBUGGING_TYPE): Define.
>         (DEBUG_INFO_SECTION): Define.
>         (DEBUG_ABBREV_SECTION): Define.
>         (DEBUG_ARANGES_SECTION): Define.
>         (DEBUG_LINE_SECTION): Define.
>         (DEBUG_PUBNAMES_SECTION): Define.
>         (DEBUG_PUBTYPES_SECTION): Define.
>         (DEBUG_STR_SECTION): Define.
>         (DEBUG_RANGES_SECTION): Define.
>
> Index: dwarf2out.c
> ===================================================================
> --- dwarf2out.c (revision 227937)
> +++ dwarf2out.c (working copy)
> @@ -25486,6 +25486,7 @@
>        output_abbrev_section ();
>      }
>
> +#ifndef TARGET_AIX_VERSION
>    /* Output location list section if necessary.  */
>    if (have_location_lists)
>      {
> @@ -25494,6 +25495,7 @@
>        ASM_OUTPUT_LABEL (asm_out_file, loc_section_label);
>        output_location_lists (comp_unit_die ());
>      }
> +#endif
>
>    output_pubtables ();
>
> Index: config/rs6000/rs6000.c
> ===================================================================
> --- config/rs6000/rs6000.c      (revision 227937)
> +++ config/rs6000/rs6000.c      (working copy)
> @@ -30684,6 +30684,12 @@
>  #endif
>
>  #if TARGET_XCOFF
> +static enum unwind_info_type
> +rs6000_xcoff_debug_unwind_info (void)
> +{
> +  return UI_NONE;
> +}
> +
>  static void
>  rs6000_xcoff_asm_output_anchor (rtx symbol)
>  {
> @@ -30805,6 +30811,11 @@
>    int smclass;
>    static const char * const suffix[4] = { "PR", "RO", "RW", "TL" };
>
> +  if (flags & SECTION_DEBUG)
> +    {
> +      fprintf (asm_out_file, "\t.dwsect %s\n", name);
> +      return;
> +    }
>    if (flags & SECTION_CODE)
>      smclass = 0;
>    else if (flags & SECTION_TLS)
> @@ -31140,8 +31151,16 @@
>    fputs (":\n", file);
>    data.function_descriptor = true;
>    symtab_node::get (decl)->call_for_symbol_and_aliases
> (rs6000_declare_alias, &data, true);
> -  if (write_symbols != NO_DEBUG && !DECL_IGNORED_P (decl))
> -    xcoffout_declare_function (file, decl, buffer);
> +  if (!DECL_IGNORED_P (decl))
> +    {
>
> +      if (write_symbols == DBX_DEBUG || write_symbols == XCOFF_DEBUG)
> +       xcoffout_declare_function (file, decl, buffer);
> +      else if (write_symbols == DWARF2_DEBUG)
> +       {
> +         name = (*targetm.strip_name_encoding) (name);
> +         fprintf (file, "\t.function .%s,.%s,2,0\n", name, name);
> +       }
> +    }
>    return;
>  }
>
> Index: config/rs6000/xcoff.h
> ===================================================================
> --- config/rs6000/xcoff.h       (revision 227937)
> +++ config/rs6000/xcoff.h       (working copy)
> @@ -86,6 +86,8 @@
>                || (SCALAR_FLOAT_MODE_P (GET_MODE (X))                   \
>                    && ! TARGET_NO_FP_IN_TOC)))))
>
> +#undef TARGET_DEBUG_UNWIND_INFO
> +#define TARGET_DEBUG_UNWIND_INFO  rs6000_xcoff_debug_unwind_info
>  #define TARGET_ASM_OUTPUT_ANCHOR  rs6000_xcoff_asm_output_anchor
>  #define TARGET_ASM_GLOBALIZE_LABEL  rs6000_xcoff_asm_globalize_label
>  #define TARGET_ASM_INIT_SECTIONS  rs6000_xcoff_asm_init_sections
>
> Index: config/rs6000/aix71.h
> ===================================================================
> +/* AIX 7.1 supports DWARF debugging, but XCOFF remains the default.  */
> +#define DWARF2_DEBUGGING_INFO 1
> +#define PREFERRED_DEBUGGING_TYPE XCOFF_DEBUG
> +#define DEBUG_INFO_SECTION      "0x10000"
> +#define DEBUG_ABBREV_SECTION    "0x60000"
> +#define DEBUG_ARANGES_SECTION   "0x50000"
> +#define DEBUG_LINE_SECTION      "0x20000"
> +#define DEBUG_PUBNAMES_SECTION  "0x30000"
> +#define DEBUG_PUBTYPES_SECTION  "0x40000"
> +#define DEBUG_STR_SECTION       "0x70000"
> +#define DEBUG_RANGES_SECTION    "0x80000"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]