From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20675 invoked by alias); 10 May 2012 20:13:25 -0000 Received: (qmail 20645 invoked by uid 22791); 10 May 2012 20:13:15 -0000 X-SWARE-Spam-Status: No, hits=-6.4 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,TW_BJ,TW_GD,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 10 May 2012 20:13:01 +0000 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q4AKD1Yu012045 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 10 May 2012 16:13:01 -0400 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id q4AKCxT1026940 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 10 May 2012 16:12:59 -0400 From: Tom Tromey To: gdb-patches@sourceware.org Subject: Re: [7/10] keep track of dependencies References: <87zk9zabho.fsf@fleche.redhat.com> Date: Thu, 10 May 2012 20:13:00 -0000 In-Reply-To: <87zk9zabho.fsf@fleche.redhat.com> (Tom Tromey's message of "Wed, 25 Apr 2012 12:54:11 -0600") Message-ID: <87aa1faj79.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.95 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain 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: 2012-05/txt/msg00386.txt.bz2 >>>>> "Tom" == Tom Tromey writes: Tom> This patch introduces the dependency-tracking code for psymtabs and Tom> symtabs. This patch changed a little while rebasing it on top of the Fission series. I'm going to put it into the big final commit, but here it is split out for easier reading. Tom >From e63a675d1fa95ec6a12d3f84e31bab2273098204 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 17 Apr 2012 05:20:56 -0600 Subject: [PATCH 07/10] make each partial unit into a psymtab and then a symtab * dwarf2read.c (struct dwarf2_per_cu_data) : Update comment. (struct partial_die_info) : Remove. : New field. (process_psymtab_comp_unit): Add 'read_partial' argument. Update. (process_type_comp_unit, dwarf2_build_psymtabs_hard): Update. (scan_partial_symbols): Handle DW_TAG_imported_unit. (add_partial_symbol): Update. (process_die): Handle DW_TAG_partial_unit. (read_file_scope): Update comment. (load_partial_dies): Handle DW_TAG_imported_unit. (read_partial_die): Handle DW_TAG_partial_unit, DW_AT_import. (determine_prefix, dwarf2_name): Handle DW_TAG_partial_unit. --- gdb/dwarf2read.c | 73 ++++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 54 insertions(+), 19 deletions(-) diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 8964b00..d34c048 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -483,8 +483,7 @@ struct dwarf2_per_cu_data union { /* The partial symbol table associated with this compilation unit, - or NULL for partial units (which do not have an associated - symtab). */ + or NULL for unread partial units. */ struct partial_symtab *psymtab; /* Data needed by the "quick" functions. */ @@ -695,8 +694,15 @@ struct partial_die_info when this compilation unit leaves the cache. */ char *scope; - /* The location description associated with this DIE, if any. */ - struct dwarf_block *locdesc; + /* Some data associated with the partial DIE. The tag determines + which field is live. */ + union + { + /* The location description associated with this DIE, if any. */ + struct dwarf_block *locdesc; + /* The offset of an import, for DW_TAG_imported_unit. */ + sect_offset offset; + } d; /* If HAS_PC_INFO, the PC range associated with this DIE. */ CORE_ADDR lowpc; @@ -1407,7 +1413,7 @@ static void init_cutu_and_read_dies_simple static htab_t allocate_signatured_type_table (struct objfile *objfile); -static void process_psymtab_comp_unit (struct dwarf2_per_cu_data *); +static void process_psymtab_comp_unit (struct dwarf2_per_cu_data *, int); static htab_t allocate_dwo_unit_table (struct objfile *objfile); @@ -4014,8 +4020,11 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, 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) + if (comp_unit_die->tag == DW_TAG_partial_unit + && (want_partial_unit_ptr == NULL + || !*want_partial_unit_ptr)) return; prepare_one_comp_unit (cu, comp_unit_die); @@ -4117,7 +4126,8 @@ process_psymtab_comp_unit_reader (const struct die_reader_specs *reader, Process compilation unit THIS_CU for a psymtab. */ static void -process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu) +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 @@ -4129,7 +4139,7 @@ process_psymtab_comp_unit (struct dwarf2_per_cu_data *this_cu) gdb_assert (! this_cu->is_debug_types); init_cutu_and_read_dies (this_cu, 0, 0, process_psymtab_comp_unit_reader, - NULL); + &want_partial_unit); /* Age out any secondary CUs. */ age_cached_comp_units (); @@ -4220,7 +4230,7 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile) { struct dwarf2_per_cu_data *per_cu = dw2_get_cu (i); - process_psymtab_comp_unit (per_cu); + process_psymtab_comp_unit (per_cu, 0); } objfile->psymtabs_addrmap = addrmap_create_fixed (objfile->psymtabs_addrmap, @@ -4350,7 +4360,8 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, enums. */ if (pdi->name != NULL || pdi->tag == DW_TAG_namespace - || pdi->tag == DW_TAG_module || pdi->tag == DW_TAG_enumeration_type) + || pdi->tag == DW_TAG_module || pdi->tag == DW_TAG_enumeration_type + || pdi->tag == DW_TAG_imported_unit) { switch (pdi->tag) { @@ -4390,6 +4401,18 @@ scan_partial_symbols (struct partial_die_info *first_die, CORE_ADDR *lowpc, case DW_TAG_module: add_partial_module (pdi, lowpc, highpc, need_pc, cu); break; + case DW_TAG_imported_unit: + { + struct dwarf2_per_cu_data *per_cu; + + per_cu = dwarf2_find_containing_comp_unit (pdi->d.offset, + cu->objfile); + + /* Go read the partial unit, if needed. */ + if (per_cu->v.psymtab == NULL) + process_psymtab_comp_unit (per_cu, 1); + } + break; default: break; } @@ -4598,10 +4621,10 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) } break; case DW_TAG_variable: - if (pdi->locdesc) - addr = decode_locdesc (pdi->locdesc, cu); + if (pdi->d.locdesc) + addr = decode_locdesc (pdi->d.locdesc, cu); - if (pdi->locdesc + if (pdi->d.locdesc && addr == 0 && !dwarf2_per_objfile->has_section_at_zero) { @@ -4625,7 +4648,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) used by GDB, but it comes in handy for debugging partial symbol table building. */ - if (pdi->locdesc || pdi->has_type) + if (pdi->d.locdesc || pdi->has_type) add_psymbol_to_list (actual_name, strlen (actual_name), built_actual_name, VAR_DOMAIN, LOC_STATIC, @@ -4636,7 +4659,7 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu) else { /* Static Variable. Skip symbols without location descriptors. */ - if (pdi->locdesc == NULL) + if (pdi->d.locdesc == NULL) { if (built_actual_name) xfree (actual_name); @@ -5484,6 +5507,7 @@ process_die (struct die_info *die, struct dwarf2_cu *cu) case DW_TAG_padding: break; case DW_TAG_compile_unit: + case DW_TAG_partial_unit: read_file_scope (die, cu); break; case DW_TAG_type_unit: @@ -6226,7 +6250,7 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu, } } -/* Process DW_TAG_compile_unit. */ +/* Process DW_TAG_compile_unit or DW_TAG_partial_unit. */ static void read_file_scope (struct die_info *die, struct dwarf2_cu *cu) @@ -10688,7 +10712,8 @@ load_partial_dies (const struct die_reader_specs *reader, && abbrev->tag != DW_TAG_variable && abbrev->tag != DW_TAG_namespace && abbrev->tag != DW_TAG_module - && abbrev->tag != DW_TAG_member) + && abbrev->tag != DW_TAG_member + && abbrev->tag != DW_TAG_imported_unit) { /* Otherwise we skip to the next sibling, if any. */ info_ptr = skip_one_die (reader, info_ptr + bytes_read, abbrev); @@ -10906,6 +10931,7 @@ read_partial_die (const struct die_reader_specs *reader, switch (part_die->tag) { case DW_TAG_compile_unit: + case DW_TAG_partial_unit: case DW_TAG_type_unit: /* Compilation units have a DW_AT_name that is a filename, not a source language identifier. */ @@ -10950,7 +10976,7 @@ read_partial_die (const struct die_reader_specs *reader, /* Support the .debug_loc offsets. */ if (attr_form_is_block (&attr)) { - part_die->locdesc = DW_BLOCK (&attr); + part_die->d.locdesc = DW_BLOCK (&attr); } else if (attr_form_is_section_offset (&attr)) { @@ -11019,6 +11045,12 @@ read_partial_die (const struct die_reader_specs *reader, || DW_UNSND (&attr) == DW_INL_declared_inlined) part_die->may_be_inlined = 1; break; + + case DW_AT_import: + if (part_die->tag == DW_TAG_imported_unit) + part_die->d.offset = dwarf2_get_ref_die_offset (&attr); + break; + default: break; } @@ -14021,6 +14053,7 @@ determine_prefix (struct die_info *die, struct dwarf2_cu *cu) So it does not need a prefix. */ return ""; case DW_TAG_compile_unit: + case DW_TAG_partial_unit: /* gcc-4.5 -gdwarf-4 can drop the enclosing namespace. Cope. */ if (cu->language == language_cplus && !VEC_empty (dwarf2_section_info_def, dwarf2_per_objfile->types) @@ -14141,6 +14174,7 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) switch (die->tag) { case DW_TAG_compile_unit: + case DW_TAG_partial_unit: /* Compilation units have a DW_AT_name that is a filename, not a source language identifier. */ case DW_TAG_enumeration_type: @@ -14174,7 +14208,8 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu) if (die->tag == DW_TAG_class_type) return dwarf2_name (die, cu); } - while (die->tag != DW_TAG_compile_unit); + while (die->tag != DW_TAG_compile_unit + && die->tag != DW_TAG_partial_unit); } break; -- 1.7.7.6