From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26986 invoked by alias); 23 May 2011 10:29:39 -0000 Received: (qmail 26669 invoked by uid 22791); 23 May 2011 10:29:36 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,TW_BJ,TW_FN,TW_YM X-Spam-Check-By: sourceware.org Received: from mel.act-europe.fr (HELO mel.act-europe.fr) (194.98.77.210) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 23 May 2011 10:29:18 +0000 Received: from localhost (localhost [127.0.0.1]) by filtered-smtp.eu.adacore.com (Postfix) with ESMTP id 6D240CB0310; Mon, 23 May 2011 12:29:16 +0200 (CEST) Received: from mel.act-europe.fr ([127.0.0.1]) by localhost (smtp.eu.adacore.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id M43bhVRMM3IC; Mon, 23 May 2011 12:29:13 +0200 (CEST) Received: from ulanbator.act-europe.fr (ulanbator.act-europe.fr [10.10.1.67]) by mel.act-europe.fr (Postfix) with ESMTP id 4E2B8CB02F0; Mon, 23 May 2011 12:29:13 +0200 (CEST) Received: by ulanbator.act-europe.fr (Postfix, from userid 501) id 438ACFE0263; Mon, 23 May 2011 12:29:13 +0200 (CEST) From: Tristan Gingold To: gdb-patches@sourceware.org Cc: Tristan Gingold Subject: [PATCH 2/4] dwarf2read.c: handle alternate dwarf2 debug sections name. Date: Mon, 23 May 2011 10:29:00 -0000 Message-Id: <1306146544-3925-3-git-send-email-gingold@adacore.com> In-Reply-To: <1306146544-3925-1-git-send-email-gingold@adacore.com> References: <1306146544-3925-1-git-send-email-gingold@adacore.com> X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-05/txt/msg00515.txt.bz2 Unfortunately, some object file format cannot accept the standard dwarf2 debug section names. This is in particular the case of XCOFF (aix), which has only 8 chars section names. In order to support dwarf2 on aix, we need to allow alternate section names. The change is in fact simple as sections are localized by the dwarf2_has_info function. So I added a new parameter to this function to accept alternate names. In order to make this obvious, the value NULL means standard names. The alternate names is a record of 2 entries: one for normal section and one for uncompressed section. gdb/ 2011-05-23 Tristan Gingold * symfile.h (struct dwarf2_section_names): New type. (struct dwarf2_debug_sections): New type. (dwarf2_has_info): Add parameter. * dwarf2read.c (dwarf2_elf_names): New variable. (INFO_SECTION, ABBREV_SECTION, LINE_SECTION, LOC_SECTION) (MACINFO_SECTION, STR_SECTION, RANGES_SECTION, TYPES_SECTION) (FRAME_SECTION, EH_FRAME_SECTION, GDB_INDEX_SECTION): Remove. (dwarf2_has_info): Add names parameter. Pass names to dwarf2_locate_sections. (section_is_p): Rewrite using the names parameter. (dwarf2_locate_sections): Use section names from the names parameter. * coffread.c (coff_symfile_read): Adjust call to dwarf2_has_info. * elfread.c (read_psyms): Ditto. * machoread.c (macho_symfile_read): Ditto. --- gdb/coffread.c | 2 +- gdb/dwarf2read.c | 85 ++++++++++++++++++++++++++++++++--------------------- gdb/elfread.c | 4 +- gdb/machoread.c | 4 +- gdb/symfile.h | 24 ++++++++++++++- 5 files changed, 79 insertions(+), 40 deletions(-) diff --git a/gdb/coffread.c b/gdb/coffread.c index b11dd73..16fd58f 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -637,7 +637,7 @@ coff_symfile_read (struct objfile *objfile, int symfile_flags) info->stabsects, info->stabstrsect->filepos, stabstrsize); } - if (dwarf2_has_info (objfile)) + if (dwarf2_has_info (objfile, NULL)) { /* DWARF2 sections. */ dwarf2_build_psymtabs (objfile); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 2003c46..7495d1f 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -243,22 +243,24 @@ struct dwarf2_per_objfile static struct dwarf2_per_objfile *dwarf2_per_objfile; -/* names of the debugging sections */ +/* Default names of the debugging sections. */ /* Note that if the debugging section has been compressed, it might have a name like .zdebug_info. */ -#define INFO_SECTION "debug_info" -#define ABBREV_SECTION "debug_abbrev" -#define LINE_SECTION "debug_line" -#define LOC_SECTION "debug_loc" -#define MACINFO_SECTION "debug_macinfo" -#define STR_SECTION "debug_str" -#define RANGES_SECTION "debug_ranges" -#define TYPES_SECTION "debug_types" -#define FRAME_SECTION "debug_frame" -#define EH_FRAME_SECTION "eh_frame" -#define GDB_INDEX_SECTION "gdb_index" +static const struct dwarf2_debug_sections dwarf2_elf_names = { + { ".debug_info", ".zdebug_info" }, + { ".debug_abbrev", ".zdebug_abbrev" }, + { ".debug_line", ".zdebug_line" }, + { ".debug_loc", ".zdebug_loc" }, + { ".debug_macinfo", ".zdebug_macinfo" }, + { ".debug_str", ".zdebug_str" }, + { ".debug_ranges", ".zdebug_ranges" }, + { ".debug_types", ".zdebug_types" }, + { ".debug_frame", ".zdebug_frame" }, + { ".eh_frame", NULL }, + { ".gdb_index", ".zgdb_index" } +}; /* local data types */ @@ -1338,10 +1340,13 @@ static const char *dwarf2_physname (char *name, struct die_info *die, struct dwarf2_cu *cu); /* Try to locate the sections we need for DWARF 2 debugging - information and return true if we have enough to do something. */ + information and return true if we have enough to do something. + NAMES points to the dwarf2 section names, or is NULL if the standard + ELF names are used. */ int -dwarf2_has_info (struct objfile *objfile) +dwarf2_has_info (struct objfile *objfile, + const struct dwarf2_debug_sections *names) { dwarf2_per_objfile = objfile_data (objfile, dwarf2_objfile_data_key); if (!dwarf2_per_objfile) @@ -1354,23 +1359,28 @@ dwarf2_has_info (struct objfile *objfile) set_objfile_data (objfile, dwarf2_objfile_data_key, data); dwarf2_per_objfile = data; - bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, NULL); + bfd_map_over_sections (objfile->obfd, dwarf2_locate_sections, + (void *)names); dwarf2_per_objfile->objfile = objfile; } return (dwarf2_per_objfile->info.asection != NULL && dwarf2_per_objfile->abbrev.asection != NULL); } -/* When loading sections, we can either look for ".", or for - * ".z", which indicates a compressed section. */ +/* When loading sections, we look either for uncompressed section or for + compressed section names. */ static int -section_is_p (const char *section_name, const char *name) +section_is_p (const char *section_name, + const struct dwarf2_section_names *names) { - return (section_name[0] == '.' - && (strcmp (section_name + 1, name) == 0 - || (section_name[1] == 'z' - && strcmp (section_name + 2, name) == 0))); + if (names->normal != NULL + && strcmp (section_name, names->normal) == 0) + return 1; + if (names->compressed != NULL + && strcmp (section_name, names->compressed) == 0) + return 1; + return 0; } /* This function is mapped across the sections and remembers the @@ -1378,44 +1388,51 @@ section_is_p (const char *section_name, const char *name) in. */ static void -dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) +dwarf2_locate_sections (bfd *abfd, asection *sectp, void *vnames) { - if (section_is_p (sectp->name, INFO_SECTION)) + const struct dwarf2_debug_sections *names; + + if (vnames == NULL) + names = &dwarf2_elf_names; + else + names = (const struct dwarf2_debug_sections *)vnames; + + if (section_is_p (sectp->name, &names->info)) { dwarf2_per_objfile->info.asection = sectp; dwarf2_per_objfile->info.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, ABBREV_SECTION)) + else if (section_is_p (sectp->name, &names->abbrev)) { dwarf2_per_objfile->abbrev.asection = sectp; dwarf2_per_objfile->abbrev.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, LINE_SECTION)) + else if (section_is_p (sectp->name, &names->line)) { dwarf2_per_objfile->line.asection = sectp; dwarf2_per_objfile->line.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, LOC_SECTION)) + else if (section_is_p (sectp->name, &names->loc)) { dwarf2_per_objfile->loc.asection = sectp; dwarf2_per_objfile->loc.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, MACINFO_SECTION)) + else if (section_is_p (sectp->name, &names->macinfo)) { dwarf2_per_objfile->macinfo.asection = sectp; dwarf2_per_objfile->macinfo.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, STR_SECTION)) + else if (section_is_p (sectp->name, &names->str)) { dwarf2_per_objfile->str.asection = sectp; dwarf2_per_objfile->str.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, FRAME_SECTION)) + else if (section_is_p (sectp->name, &names->frame)) { dwarf2_per_objfile->frame.asection = sectp; dwarf2_per_objfile->frame.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, EH_FRAME_SECTION)) + else if (section_is_p (sectp->name, &names->eh_frame)) { flagword aflag = bfd_get_section_flags (ignore_abfd, sectp); @@ -1425,17 +1442,17 @@ dwarf2_locate_sections (bfd *abfd, asection *sectp, void *ignore_ptr) dwarf2_per_objfile->eh_frame.size = bfd_get_section_size (sectp); } } - else if (section_is_p (sectp->name, RANGES_SECTION)) + else if (section_is_p (sectp->name, &names->ranges)) { dwarf2_per_objfile->ranges.asection = sectp; dwarf2_per_objfile->ranges.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, TYPES_SECTION)) + else if (section_is_p (sectp->name, &names->types)) { dwarf2_per_objfile->types.asection = sectp; dwarf2_per_objfile->types.size = bfd_get_section_size (sectp); } - else if (section_is_p (sectp->name, GDB_INDEX_SECTION)) + else if (section_is_p (sectp->name, &names->gdb_index)) { dwarf2_per_objfile->gdb_index.asection = sectp; dwarf2_per_objfile->gdb_index.size = bfd_get_section_size (sectp); diff --git a/gdb/elfread.c b/gdb/elfread.c index 6c6a7af..825df0f 100644 --- a/gdb/elfread.c +++ b/gdb/elfread.c @@ -1391,7 +1391,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) bfd_section_size (abfd, str_sect)); } - if (dwarf2_has_info (objfile)) + if (dwarf2_has_info (objfile, NULL)) { /* elf_sym_fns_gdb_index cannot handle simultaneous non-DWARF debug information present in OBJFILE. If there is such debug info present @@ -1437,7 +1437,7 @@ elf_symfile_read (struct objfile *objfile, int symfile_flags) static void read_psyms (struct objfile *objfile) { - if (dwarf2_has_info (objfile)) + if (dwarf2_has_info (objfile, NULL)) dwarf2_build_psymtabs (objfile); } diff --git a/gdb/machoread.c b/gdb/machoread.c index 28cb958..1cfa21e 100644 --- a/gdb/machoread.c +++ b/gdb/machoread.c @@ -660,7 +660,7 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) /* Try to read .eh_frame / .debug_frame. */ /* First, locate these sections. We ignore the result status as it only checks for debug info. */ - dwarf2_has_info (objfile); + dwarf2_has_info (objfile, NULL); dwarf2_build_frame_info (objfile); /* Check for DSYM file. */ @@ -702,7 +702,7 @@ macho_symfile_read (struct objfile *objfile, int symfile_flags) } } - if (dwarf2_has_info (objfile)) + if (dwarf2_has_info (objfile, NULL)) { /* DWARF 2 sections */ dwarf2_build_psymtabs (objfile); diff --git a/gdb/symfile.h b/gdb/symfile.h index 83e807c..e6c4613 100644 --- a/gdb/symfile.h +++ b/gdb/symfile.h @@ -553,7 +553,29 @@ extern struct cleanup *increment_reading_symtab (void); /* From dwarf2read.c */ -extern int dwarf2_has_info (struct objfile *); +/* Name of the dwarf2 sections. */ + +struct dwarf2_section_names { + const char *normal; + const char *compressed; +}; + +struct dwarf2_debug_sections { + struct dwarf2_section_names info; + struct dwarf2_section_names abbrev; + struct dwarf2_section_names line; + struct dwarf2_section_names loc; + struct dwarf2_section_names macinfo; + struct dwarf2_section_names str; + struct dwarf2_section_names ranges; + struct dwarf2_section_names types; + struct dwarf2_section_names frame; + struct dwarf2_section_names eh_frame; + struct dwarf2_section_names gdb_index; +}; + +extern int dwarf2_has_info (struct objfile *, + const struct dwarf2_debug_sections *); /* Dwarf2 sections that can be accessed by dwarf2_get_section_info. */ enum dwarf2_section_enum { -- 1.7.3.GIT