From: Doug Evans Date: Thu, 28 Mar 2013 17:41:03 +0000 (+0000) Subject: * dwarf2read.c (create_partial_symtab): Add forward decl. X-Git-Tag: sid-snapshot-20130401~29 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0018ea6f8f26a1b49226f2ea83161c66cc1bf798;p=platform%2Fupstream%2Fbinutils.git * dwarf2read.c (create_partial_symtab): Add forward decl. (create_partial_symtab): Move to be closer to other psymtab functions. (process_psymtab_comp_unit_reader, process_psymtab_comp_unit): Ditto. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1baa365..5a165c2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 2013-03-28 Doug Evans + * dwarf2read.c (create_partial_symtab): Add forward decl. + (create_partial_symtab): Move to be closer to other psymtab functions. + (process_psymtab_comp_unit_reader, process_psymtab_comp_unit): Ditto. + * dwarf2read.c (dwarf2_physname): Move declaration to better spot. (compute_symtab_includes): Remove unnecessary forward declaration. (die_needs_namespace): Add comment marking group of functions for diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index a23b579..4bdd645 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -1278,6 +1278,9 @@ static void dwarf2_create_include_psymtab (char *, struct partial_symtab *, static void dwarf2_find_base_address (struct die_info *die, struct dwarf2_cu *cu); +static struct partial_symtab *create_partial_symtab + (struct dwarf2_per_cu_data *per_cu, const char *name); + static void dwarf2_build_psymtabs_hard (struct objfile *); static void scan_partial_symbols (struct partial_die_info *, @@ -4873,193 +4876,14 @@ init_cutu_and_read_dies_simple (struct dwarf2_per_cu_data *this_cu, NULL, die_reader_func, data); } + +/* Type Unit Groups. -/* Create a psymtab named NAME and assign it to PER_CU. - - The caller must fill in the following details: - dirname, textlow, texthigh. */ - -static struct partial_symtab * -create_partial_symtab (struct dwarf2_per_cu_data *per_cu, const char *name) -{ - struct objfile *objfile = per_cu->objfile; - struct partial_symtab *pst; - - pst = start_psymtab_common (objfile, objfile->section_offsets, - name, 0, - objfile->global_psymbols.next, - objfile->static_psymbols.next); - - pst->psymtabs_addrmap_supported = 1; - - /* This is the glue that links PST into GDB's symbol API. */ - pst->read_symtab_private = per_cu; - pst->read_symtab = dwarf2_read_symtab; - per_cu->v.psymtab = pst; - - return pst; -} - -/* die_reader_func for process_psymtab_comp_unit. */ - -static void -process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, - gdb_byte *info_ptr, - struct die_info *comp_unit_die, - int has_children, - void *data) -{ - struct dwarf2_cu *cu = reader->cu; - struct objfile *objfile = cu->objfile; - struct dwarf2_per_cu_data *per_cu = cu->per_cu; - struct attribute *attr; - CORE_ADDR baseaddr; - CORE_ADDR best_lowpc = 0, best_highpc = 0; - struct partial_symtab *pst; - int has_pc_info; - const char *filename; - int *want_partial_unit_ptr = data; - - if (comp_unit_die->tag == DW_TAG_partial_unit - && (want_partial_unit_ptr == NULL - || !*want_partial_unit_ptr)) - return; - - gdb_assert (! per_cu->is_debug_types); - - prepare_one_comp_unit (cu, comp_unit_die, language_minimal); - - cu->list_in_scope = &file_symbols; - - /* Allocate a new partial symbol table structure. */ - attr = dwarf2_attr (comp_unit_die, DW_AT_name, cu); - if (attr == NULL || !DW_STRING (attr)) - filename = ""; - else - filename = DW_STRING (attr); - - pst = create_partial_symtab (per_cu, filename); - - /* This must be done before calling dwarf2_build_include_psymtabs. */ - attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, cu); - if (attr != NULL) - pst->dirname = DW_STRING (attr); - - baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); - - dwarf2_find_base_address (comp_unit_die, cu); - - /* Possibly set the default values of LOWPC and HIGHPC from - `DW_AT_ranges'. */ - has_pc_info = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc, - &best_highpc, cu, pst); - if (has_pc_info == 1 && best_lowpc < best_highpc) - /* Store the contiguous range if it is not empty; it can be empty for - CUs with no code. */ - addrmap_set_empty (objfile->psymtabs_addrmap, - best_lowpc + baseaddr, - best_highpc + baseaddr - 1, pst); - - /* Check if comp unit has_children. - If so, read the rest of the partial symbols from this comp unit. - If not, there's no more debug_info for this comp unit. */ - if (has_children) - { - struct partial_die_info *first_die; - CORE_ADDR lowpc, highpc; - - lowpc = ((CORE_ADDR) -1); - highpc = ((CORE_ADDR) 0); - - first_die = load_partial_dies (reader, info_ptr, 1); - - scan_partial_symbols (first_die, &lowpc, &highpc, - ! has_pc_info, cu); - - /* If we didn't find a lowpc, set it to highpc to avoid - complaints from `maint check'. */ - if (lowpc == ((CORE_ADDR) -1)) - lowpc = highpc; - - /* If the compilation unit didn't have an explicit address range, - then use the information extracted from its child dies. */ - if (! has_pc_info) - { - best_lowpc = lowpc; - best_highpc = highpc; - } - } - pst->textlow = best_lowpc + baseaddr; - pst->texthigh = best_highpc + baseaddr; - - pst->n_global_syms = objfile->global_psymbols.next - - (objfile->global_psymbols.list + pst->globals_offset); - pst->n_static_syms = objfile->static_psymbols.next - - (objfile->static_psymbols.list + pst->statics_offset); - sort_pst_symbols (objfile, pst); - - if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs)) - { - int i; - int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs); - struct dwarf2_per_cu_data *iter; - - /* Fill in 'dependencies' here; we fill in 'users' in a - post-pass. */ - pst->number_of_dependencies = len; - pst->dependencies = obstack_alloc (&objfile->objfile_obstack, - len * sizeof (struct symtab *)); - for (i = 0; - VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs, - i, iter); - ++i) - pst->dependencies[i] = iter->v.psymtab; - - VEC_free (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs); - } - - /* Get the list of files included in the current compilation unit, - and build a psymtab for each of them. */ - dwarf2_build_include_psymtabs (cu, comp_unit_die, pst); - - if (dwarf2_read_debug) - { - struct gdbarch *gdbarch = get_objfile_arch (objfile); - - fprintf_unfiltered (gdb_stdlog, - "Psymtab for %s unit @0x%x: %s - %s" - ", %d global, %d static syms\n", - per_cu->is_debug_types ? "type" : "comp", - per_cu->offset.sect_off, - paddress (gdbarch, pst->textlow), - paddress (gdbarch, pst->texthigh), - pst->n_global_syms, pst->n_static_syms); - } -} - -/* Subroutine of dwarf2_build_psymtabs_hard to simplify it. - Process compilation unit THIS_CU for a psymtab. */ - -static void -process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu, - int want_partial_unit) -{ - /* If this compilation unit was already read in, free the - cached copy in order to read it in again. This is - necessary because we skipped some symbols when we first - read in the compilation unit (see load_partial_dies). - This problem could be avoided, but the benefit is unclear. */ - if (this_cu->cu != NULL) - free_one_cached_comp_unit (this_cu); - - gdb_assert (! this_cu->is_debug_types); - init_cutu_and_read_dies (this_cu, NULL, 0, 0, - process_psymtab_comp_unit_reader, - &want_partial_unit); - - /* Age out any secondary CUs. */ - age_cached_comp_units (); -} + Type Unit Groups are a way to collapse the set of all TUs (type units) into + a more manageable set. The grouping is done by DW_AT_stmt_list entry + so that all types coming from the same compilation (.o file) are grouped + together. A future step could be to put the types in the same symtab as + the CU the types ultimately came from. */ static hashval_t hash_type_unit_group (const void *item) @@ -5380,6 +5204,195 @@ build_type_unit_groups (die_reader_func_ftype *func, void *data) tu_stats->nr_stmt_less_type_units); } } + +/* Partial symbol tables. */ + +/* Create a psymtab named NAME and assign it to PER_CU. + + The caller must fill in the following details: + dirname, textlow, texthigh. */ + +static struct partial_symtab * +create_partial_symtab (struct dwarf2_per_cu_data *per_cu, const char *name) +{ + struct objfile *objfile = per_cu->objfile; + struct partial_symtab *pst; + + pst = start_psymtab_common (objfile, objfile->section_offsets, + name, 0, + objfile->global_psymbols.next, + objfile->static_psymbols.next); + + pst->psymtabs_addrmap_supported = 1; + + /* This is the glue that links PST into GDB's symbol API. */ + pst->read_symtab_private = per_cu; + pst->read_symtab = dwarf2_read_symtab; + per_cu->v.psymtab = pst; + + return pst; +} + +/* die_reader_func for process_psymtab_comp_unit. */ + +static void +process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, + gdb_byte *info_ptr, + struct die_info *comp_unit_die, + int has_children, + void *data) +{ + struct dwarf2_cu *cu = reader->cu; + struct objfile *objfile = cu->objfile; + struct dwarf2_per_cu_data *per_cu = cu->per_cu; + struct attribute *attr; + CORE_ADDR baseaddr; + CORE_ADDR best_lowpc = 0, best_highpc = 0; + struct partial_symtab *pst; + int has_pc_info; + const char *filename; + int *want_partial_unit_ptr = data; + + if (comp_unit_die->tag == DW_TAG_partial_unit + && (want_partial_unit_ptr == NULL + || !*want_partial_unit_ptr)) + return; + + gdb_assert (! per_cu->is_debug_types); + + prepare_one_comp_unit (cu, comp_unit_die, language_minimal); + + cu->list_in_scope = &file_symbols; + + /* Allocate a new partial symbol table structure. */ + attr = dwarf2_attr (comp_unit_die, DW_AT_name, cu); + if (attr == NULL || !DW_STRING (attr)) + filename = ""; + else + filename = DW_STRING (attr); + + pst = create_partial_symtab (per_cu, filename); + + /* This must be done before calling dwarf2_build_include_psymtabs. */ + attr = dwarf2_attr (comp_unit_die, DW_AT_comp_dir, cu); + if (attr != NULL) + pst->dirname = DW_STRING (attr); + + baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + + dwarf2_find_base_address (comp_unit_die, cu); + + /* Possibly set the default values of LOWPC and HIGHPC from + `DW_AT_ranges'. */ + has_pc_info = dwarf2_get_pc_bounds (comp_unit_die, &best_lowpc, + &best_highpc, cu, pst); + if (has_pc_info == 1 && best_lowpc < best_highpc) + /* Store the contiguous range if it is not empty; it can be empty for + CUs with no code. */ + addrmap_set_empty (objfile->psymtabs_addrmap, + best_lowpc + baseaddr, + best_highpc + baseaddr - 1, pst); + + /* Check if comp unit has_children. + If so, read the rest of the partial symbols from this comp unit. + If not, there's no more debug_info for this comp unit. */ + if (has_children) + { + struct partial_die_info *first_die; + CORE_ADDR lowpc, highpc; + + lowpc = ((CORE_ADDR) -1); + highpc = ((CORE_ADDR) 0); + + first_die = load_partial_dies (reader, info_ptr, 1); + + scan_partial_symbols (first_die, &lowpc, &highpc, + ! has_pc_info, cu); + + /* If we didn't find a lowpc, set it to highpc to avoid + complaints from `maint check'. */ + if (lowpc == ((CORE_ADDR) -1)) + lowpc = highpc; + + /* If the compilation unit didn't have an explicit address range, + then use the information extracted from its child dies. */ + if (! has_pc_info) + { + best_lowpc = lowpc; + best_highpc = highpc; + } + } + pst->textlow = best_lowpc + baseaddr; + pst->texthigh = best_highpc + baseaddr; + + pst->n_global_syms = objfile->global_psymbols.next - + (objfile->global_psymbols.list + pst->globals_offset); + pst->n_static_syms = objfile->static_psymbols.next - + (objfile->static_psymbols.list + pst->statics_offset); + sort_pst_symbols (objfile, pst); + + if (!VEC_empty (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs)) + { + int i; + int len = VEC_length (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs); + struct dwarf2_per_cu_data *iter; + + /* Fill in 'dependencies' here; we fill in 'users' in a + post-pass. */ + pst->number_of_dependencies = len; + pst->dependencies = obstack_alloc (&objfile->objfile_obstack, + len * sizeof (struct symtab *)); + for (i = 0; + VEC_iterate (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs, + i, iter); + ++i) + pst->dependencies[i] = iter->v.psymtab; + + VEC_free (dwarf2_per_cu_ptr, cu->per_cu->imported_symtabs); + } + + /* Get the list of files included in the current compilation unit, + and build a psymtab for each of them. */ + dwarf2_build_include_psymtabs (cu, comp_unit_die, pst); + + if (dwarf2_read_debug) + { + struct gdbarch *gdbarch = get_objfile_arch (objfile); + + fprintf_unfiltered (gdb_stdlog, + "Psymtab for %s unit @0x%x: %s - %s" + ", %d global, %d static syms\n", + per_cu->is_debug_types ? "type" : "comp", + per_cu->offset.sect_off, + paddress (gdbarch, pst->textlow), + paddress (gdbarch, pst->texthigh), + pst->n_global_syms, pst->n_static_syms); + } +} + +/* Subroutine of dwarf2_build_psymtabs_hard to simplify it. + Process compilation unit THIS_CU for a psymtab. */ + +static void +process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu, + int want_partial_unit) +{ + /* If this compilation unit was already read in, free the + cached copy in order to read it in again. This is + necessary because we skipped some symbols when we first + read in the compilation unit (see load_partial_dies). + This problem could be avoided, but the benefit is unclear. */ + if (this_cu->cu != NULL) + free_one_cached_comp_unit (this_cu); + + gdb_assert (! this_cu->is_debug_types); + init_cutu_and_read_dies (this_cu, NULL, 0, 0, + process_psymtab_comp_unit_reader, + &want_partial_unit); + + /* Age out any secondary CUs. */ + age_cached_comp_units (); +} /* Reader function for build_type_psymtabs. */