From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9551 invoked by alias); 23 Apr 2008 21:31:51 -0000 Received: (qmail 9537 invoked by uid 22791); 23 Apr 2008 21:31:49 -0000 X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Wed, 23 Apr 2008 21:31:05 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id m3NLV3ZW024413 for ; Wed, 23 Apr 2008 17:31:03 -0400 Received: from pobox.stuttgart.redhat.com (pobox.stuttgart.redhat.com [172.16.2.10]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id m3NLV2la008468 for ; Wed, 23 Apr 2008 17:31:02 -0400 Received: from host0.dyn.jankratochvil.net (sebastian-int.corp.redhat.com [172.16.52.221]) by pobox.stuttgart.redhat.com (8.13.1/8.13.1) with ESMTP id m3NLUxSs009663 for ; Wed, 23 Apr 2008 17:31:00 -0400 Received: from host0.dyn.jankratochvil.net (localhost [127.0.0.1]) by host0.dyn.jankratochvil.net (8.14.2/8.14.1) with ESMTP id m3NLUxYX022347 for ; Wed, 23 Apr 2008 23:30:59 +0200 Received: (from jkratoch@localhost) by host0.dyn.jankratochvil.net (8.14.2/8.14.2/Submit) id m3NLUxkB022346 for gdb-patches@sources.redhat.com; Wed, 23 Apr 2008 23:30:59 +0200 Date: Wed, 23 Apr 2008 22:24:00 -0000 From: Jan Kratochvil To: gdb-patches@sources.redhat.com Subject: [patch] [2/2] Discontiguous PSYMTABs (psymtabs->symtabs by addrmap) Message-ID: <20080423213059.GC11894@host0.dyn.jankratochvil.net> References: <20071009181701.GA30757@caradoc.them.org> <20071009185434.GA27810@host0.dyn.jankratochvil.net> <20071009185931.GA1220@caradoc.them.org> <20071124154339.GA14913@host0.dyn.jankratochvil.net> <20071130111021.GA17867@host0.dyn.jankratochvil.net> <20071130145613.GA5941@caradoc.them.org> <20071209203138.GA23339@host0.dyn.jankratochvil.net> <20071217005641.GA14690@caradoc.them.org> <20071217010217.GB14690@caradoc.them.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="+jhVVhN62yS6hEJ8" Content-Disposition: inline In-Reply-To: <20071217010217.GB14690@caradoc.them.org> User-Agent: Mutt/1.5.17 (2007-11-01) 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: 2008-04/txt/msg00536.txt.bz2 --+jhVVhN62yS6hEJ8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-length: 317 Hi, fix + a testcase for DWARF/non-DWARF debuginfos with continuous sections for childless CUs. Going to post the results of some more verifications, posting as Doug Evans has asked. It is only a minor update against its previous version: http://sourceware.org/ml/gdb-patches/2007-12/msg00143.html Regards, Jan --+jhVVhN62yS6hEJ8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="gdb-cvs-psymtab-ranges-stabs.patch" Content-length: 22662 2008-04-23 Jan Kratochvil * Makefile.in: Update dependencies. * dwarf2read.c: Include "addrmap.h" (struct dwarf2_cu): New fields RANGES_OFFSET and HAS_RANGES_OFFSET. (dwarf2_ranges_read): New prototype. (dwarf2_build_psymtabs_hard): Initialize and prepare PSYMTABS_ADDRMAP. Add discontiguous range to PSYMTABS_ADDRMAP by DWARF2_RANGES_READ on HAS_RANGES_OFFSET, otherwise add there the contiguous range. (dwarf2_ranges_read): New parameter RANGES_PST, update the function comment for it. Add the found ranges to RANGES_PST. New variable BASEADDR, initialize it the common way. (dwarf2_get_pc_bounds): Update the caller for the new parameter. (read_partial_die): `DW_AT_ranges' now only sets RANGES_OFFSET and HAS_RANGES_OFFSET for the later processing. * objfiles.h (struct objfile): New field PSYMTABS_ADDRMAP. * symtab.c: Include "addrmap.h" (find_pc_sect_psymtab): Support reading the field PSYMTABS_ADDRMAP. Move the psymtab locator into ... (find_pc_sect_psymtab_closer): ... a new function. 2008-04-23 Jan Kratochvil * gdb.dwarf2/dw2-ranges.S: Merge the secondary section with `.fini'. * gdb.dwarf2/dw2-ranges.exp: Compile also `dw2-ranges2.S' and `dw2-ranges3.S' and test also their MAIN2, FUNC2 and MAIN3 symbols. * gdb.dwarf2/dw2-ranges2.S, gdb.dwarf2/dw2-ranges3.S: New files. --- ./gdb/Makefile.in 2008-04-20 16:37:51.000000000 +0200 +++ ./gdb/Makefile.in 2008-04-23 10:28:05.000000000 +0200 @@ -2085,7 +2085,8 @@ dwarf2-frame.o: dwarf2-frame.c $(defs_h) dwarf2loc.o: dwarf2loc.c $(defs_h) $(ui_out_h) $(value_h) $(frame_h) \ $(gdbcore_h) $(target_h) $(inferior_h) $(ax_h) $(ax_gdb_h) \ $(regcache_h) $(objfiles_h) $(exceptions_h) $(elf_dwarf2_h) \ - $(dwarf2expr_h) $(dwarf2loc_h) $(gdb_string_h) $(gdb_assert_h) + $(dwarf2expr_h) $(dwarf2loc_h) $(gdb_string_h) $(gdb_assert_h) \ + $(addrmap_h) dwarf2read.o: dwarf2read.c $(defs_h) $(bfd_h) $(symtab_h) $(gdbtypes_h) \ $(objfiles_h) $(elf_dwarf2_h) $(buildsym_h) $(demangle_h) \ $(expression_h) $(filenames_h) $(macrotab_h) $(language_h) \ @@ -2893,7 +2894,7 @@ symtab.o: symtab.c $(defs_h) $(symtab_h) $(filenames_h) $(objc_lang_h) $(ada_lang_h) $(hashtab_h) \ $(gdb_obstack_h) $(block_h) $(dictionary_h) $(gdb_string_h) \ $(gdb_stat_h) $(cp_abi_h) $(observer_h) $(gdb_assert_h) \ - $(solist_h) $(p_lang_h) + $(solist_h) $(p_lang_h) $(addrmap_h) target.o: target.c $(defs_h) $(gdb_string_h) $(target_h) $(gdbcmd_h) \ $(symtab_h) $(inferior_h) $(bfd_h) $(symfile_h) $(objfiles_h) \ $(gdb_wait_h) $(dcache_h) $(regcache_h) $(gdb_assert_h) $(gdbcore_h) \ --- ./gdb/dwarf2read.c 2008-04-23 00:16:47.000000000 +0200 +++ ./gdb/dwarf2read.c 2008-04-23 11:47:02.000000000 +0200 @@ -45,6 +45,7 @@ #include "hashtab.h" #include "command.h" #include "gdbcmd.h" +#include "addrmap.h" #include #include "gdb_string.h" @@ -303,6 +304,9 @@ struct dwarf2_cu /* Hash table holding all the loaded partial DIEs. */ htab_t partial_dies; + /* `.debug_ranges' offset for this `DW_TAG_compile_unit' DIE. */ + unsigned long ranges_offset; + /* Storage for things with the same lifetime as this read-in compilation unit, including partial DIEs. */ struct obstack comp_unit_obstack; @@ -345,6 +349,9 @@ struct dwarf2_cu DIEs for namespaces, we don't need to try to infer them from mangled names. */ unsigned int has_namespace_info : 1; + + /* Field `ranges_offset' is filled in; flag as the value may be zero. */ + unsigned int has_ranges_offset : 1; }; /* Persistent data held for a compilation unit, even when not @@ -894,6 +901,9 @@ static void read_func_scope (struct die_ static void read_lexical_block_scope (struct die_info *, struct dwarf2_cu *); +static int dwarf2_ranges_read (unsigned, CORE_ADDR *, CORE_ADDR *, + struct dwarf2_cu *, struct partial_symtab *); + static int dwarf2_get_pc_bounds (struct die_info *, CORE_ADDR *, CORE_ADDR *, struct dwarf2_cu *); @@ -1472,6 +1482,9 @@ dwarf2_build_psymtabs_hard (struct objfi create_all_comp_units (objfile); + objfile->psymtabs_addrmap = addrmap_create_mutable + (&objfile->objfile_obstack); + /* Since the objects we're extracting from .debug_info vary in length, only the individual functions to extract them (like read_comp_unit_head and load_partial_die) can really know whether @@ -1537,7 +1550,8 @@ dwarf2_build_psymtabs_hard (struct objfi /* Allocate a new partial symbol table structure */ pst = start_psymtab_common (objfile, objfile->section_offsets, comp_unit_die.name ? comp_unit_die.name : "", - comp_unit_die.lowpc, + /* TEXTLOW and TEXTHIGH are set below. */ + 0, objfile->global_psymbols.next, objfile->static_psymbols.next); @@ -1570,6 +1584,15 @@ dwarf2_build_psymtabs_hard (struct objfi this_cu->psymtab = pst; + /* Possibly set the default values of LOWPC and HIGHPC from + `DW_AT_ranges'. */ + if (cu.has_ranges_offset) + { + if (dwarf2_ranges_read (cu.ranges_offset, &comp_unit_die.lowpc, + &comp_unit_die.highpc, &cu, pst)) + comp_unit_die.has_pc_info = 1; + } + /* 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. */ @@ -1600,6 +1623,12 @@ dwarf2_build_psymtabs_hard (struct objfi pst->textlow = comp_unit_die.lowpc + baseaddr; pst->texthigh = comp_unit_die.highpc + baseaddr; + /* Store the contiguous range; `DW_AT_ranges' range is stored above. The + range can be also empty for CUs with no code. */ + if (!cu.has_ranges_offset && pst->textlow < pst->texthigh) + addrmap_set_empty (objfile->psymtabs_addrmap, pst->textlow, + pst->texthigh - 1, pst); + pst->n_global_syms = objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset); pst->n_static_syms = objfile->static_psymbols.next - @@ -1623,6 +1652,10 @@ dwarf2_build_psymtabs_hard (struct objfi do_cleanups (back_to_inner); } + + objfile->psymtabs_addrmap = addrmap_create_fixed (objfile->psymtabs_addrmap, + &objfile->objfile_obstack); + do_cleanups (back_to); } @@ -3143,11 +3176,13 @@ read_lexical_block_scope (struct die_inf } /* Get low and high pc attributes from DW_AT_ranges attribute value OFFSET. - Return 1 if the attributes are present and valid, otherwise, return 0. */ + Return 1 if the attributes are present and valid, otherwise, return 0. + If RANGES_PST is not NULL we should setup `objfile->psymtabs_addrmap'. */ static int dwarf2_ranges_read (unsigned offset, CORE_ADDR *low_return, - CORE_ADDR *high_return, struct dwarf2_cu *cu) + CORE_ADDR *high_return, struct dwarf2_cu *cu, + struct partial_symtab *ranges_pst) { struct objfile *objfile = cu->objfile; struct comp_unit_head *cu_header = &cu->header; @@ -3163,6 +3198,7 @@ dwarf2_ranges_read (unsigned offset, COR int low_set; CORE_ADDR low = 0; CORE_ADDR high = 0; + CORE_ADDR baseaddr; found_base = cu_header->base_known; base = cu_header->base_address; @@ -3190,6 +3226,9 @@ dwarf2_ranges_read (unsigned offset, COR low_set = 0; + if (ranges_pst != NULL) + baseaddr = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + while (1) { CORE_ADDR range_beginning, range_end; @@ -3229,6 +3268,11 @@ dwarf2_ranges_read (unsigned offset, COR range_beginning += base; range_end += base; + if (ranges_pst != NULL && range_beginning < range_end) + addrmap_set_empty (objfile->psymtabs_addrmap, + range_beginning + baseaddr, range_end - 1 + baseaddr, + ranges_pst); + /* FIXME: This is recording everything as a low-high segment of consecutive addresses. We should have a data structure for discontiguous block ranges @@ -3293,7 +3337,7 @@ dwarf2_get_pc_bounds (struct die_info *d { /* Value of the DW_AT_ranges attribute is the offset in the .debug_ranges section. */ - if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu)) + if (!dwarf2_ranges_read (DW_UNSND (attr), &low, &high, cu, NULL)) return 0; /* Found discontinuous range of addresses. */ ret = -1; @@ -5857,9 +5901,11 @@ read_partial_die (struct partial_die_inf part_die->highpc = DW_ADDR (&attr); break; case DW_AT_ranges: - if (dwarf2_ranges_read (DW_UNSND (&attr), &part_die->lowpc, - &part_die->highpc, cu)) - has_low_pc_attr = has_high_pc_attr = 1; + if (part_die->tag == DW_TAG_compile_unit) + { + cu->ranges_offset = DW_UNSND (&attr); + cu->has_ranges_offset = 1; + } break; case DW_AT_location: /* Support the .debug_loc offsets */ --- ./gdb/objfiles.h 2008-04-20 16:37:53.000000000 +0200 +++ ./gdb/objfiles.h 2008-04-23 10:28:05.000000000 +0200 @@ -220,6 +220,13 @@ struct objfile struct partial_symtab *psymtabs; + /* Map addresses to the entries of PSYMTABS. It would be more efficient to + have a map per the whole process but ADDRMAP cannot selectively remove + its items during FREE_OBJFILE. This mapping is already present even for + PARTIAL_SYMTABs which still have no corresponding full SYMTABs read. */ + + struct addrmap *psymtabs_addrmap; + /* List of freed partial symtabs, available for re-use */ struct partial_symtab *free_psymtabs; --- ./gdb/symtab.c 2008-04-20 16:37:53.000000000 +0200 +++ ./gdb/symtab.c 2008-04-23 10:28:05.000000000 +0200 @@ -41,6 +41,7 @@ #include "objc-lang.h" #include "ada-lang.h" #include "p-lang.h" +#include "addrmap.h" #include "hashtab.h" @@ -801,6 +802,83 @@ matching_bfd_sections (asection *first, return 0; } +/* Find which partial symtab contains PC and SECTION starting at psymtab PST. + We may find a different psymtab than PST. See FIND_PC_SECT_PSYMTAB. */ + +struct partial_symtab * +find_pc_sect_psymtab_closer (CORE_ADDR pc, asection *section, + struct partial_symtab *pst, + struct minimal_symbol *msymbol) +{ + struct objfile *objfile = pst->objfile; + struct partial_symtab *tpst; + struct partial_symtab *best_pst = pst; + CORE_ADDR best_addr = pst->textlow; + + /* An objfile that has its functions reordered might have + many partial symbol tables containing the PC, but + we want the partial symbol table that contains the + function containing the PC. */ + if (!(objfile->flags & OBJF_REORDERED) && + section == 0) /* can't validate section this way */ + return pst; + + if (msymbol == NULL) + return (pst); + + /* The code range of partial symtabs sometimes overlap, so, in + the loop below, we need to check all partial symtabs and + find the one that fits better for the given PC address. We + select the partial symtab that contains a symbol whose + address is closest to the PC address. By closest we mean + that find_pc_sect_symbol returns the symbol with address + that is closest and still less than the given PC. */ + for (tpst = pst; tpst != NULL; tpst = tpst->next) + { + if (pc >= tpst->textlow && pc < tpst->texthigh) + { + struct partial_symbol *p; + CORE_ADDR this_addr; + + /* NOTE: This assumes that every psymbol has a + corresponding msymbol, which is not necessarily + true; the debug info might be much richer than the + object's symbol table. */ + p = find_pc_sect_psymbol (tpst, pc, section); + if (p != NULL + && SYMBOL_VALUE_ADDRESS (p) + == SYMBOL_VALUE_ADDRESS (msymbol)) + return tpst; + + /* Also accept the textlow value of a psymtab as a + "symbol", to provide some support for partial + symbol tables with line information but no debug + symbols (e.g. those produced by an assembler). */ + if (p != NULL) + this_addr = SYMBOL_VALUE_ADDRESS (p); + else + this_addr = tpst->textlow; + + /* Check whether it is closer than our current + BEST_ADDR. Since this symbol address is + necessarily lower or equal to PC, the symbol closer + to PC is the symbol which address is the highest. + This way we return the psymtab which contains such + best match symbol. This can help in cases where the + symbol information/debuginfo is not complete, like + for instance on IRIX6 with gcc, where no debug info + is emitted for statics. (See also the nodebug.exp + testcase.) */ + if (this_addr > best_addr) + { + best_addr = this_addr; + best_pst = tpst; + } + } + } + return best_pst; +} + /* Find which partial symtab contains PC and SECTION. Return 0 if none. We return the psymtab that contains a symbol whose address exactly matches PC, or, if we cannot find an exact match, the @@ -808,7 +886,6 @@ matching_bfd_sections (asection *first, struct partial_symtab * find_pc_sect_psymtab (CORE_ADDR pc, asection *section) { - struct partial_symtab *pst; struct objfile *objfile; struct minimal_symbol *msymbol; @@ -824,79 +901,53 @@ find_pc_sect_psymtab (CORE_ADDR pc, asec || msymbol->type == mst_file_bss)) return NULL; - ALL_PSYMTABS (objfile, pst) - { - if (pc >= pst->textlow && pc < pst->texthigh) + /* Try just the PSYMTABS_ADDRMAP mapping first as it has better granularity + than the later used TEXTLOW/TEXTHIGH one. */ + + ALL_OBJFILES (objfile) + if (objfile->psymtabs_addrmap != NULL) { - struct partial_symtab *tpst; - struct partial_symtab *best_pst = pst; - CORE_ADDR best_addr = pst->textlow; - - /* An objfile that has its functions reordered might have - many partial symbol tables containing the PC, but - we want the partial symbol table that contains the - function containing the PC. */ - if (!(objfile->flags & OBJF_REORDERED) && - section == 0) /* can't validate section this way */ - return (pst); - - if (msymbol == NULL) - return (pst); - - /* The code range of partial symtabs sometimes overlap, so, in - the loop below, we need to check all partial symtabs and - find the one that fits better for the given PC address. We - select the partial symtab that contains a symbol whose - address is closest to the PC address. By closest we mean - that find_pc_sect_symbol returns the symbol with address - that is closest and still less than the given PC. */ - for (tpst = pst; tpst != NULL; tpst = tpst->next) + struct partial_symtab *pst; + + pst = addrmap_find (objfile->psymtabs_addrmap, pc); + if (pst != NULL) { - if (pc >= tpst->textlow && pc < tpst->texthigh) - { - struct partial_symbol *p; - CORE_ADDR this_addr; + /* We do not try to call FIND_PC_SECT_PSYMTAB_CLOSER as + PSYMTABS_ADDRMAP we used has already the best 1-byte + granularity and FIND_PC_SECT_PSYMTAB_CLOSER may mislead us into + a worse chosen section due to the TEXTLOW/TEXTHIGH ranges + overlap. */ - /* NOTE: This assumes that every psymbol has a - corresponding msymbol, which is not necessarily - true; the debug info might be much richer than the - object's symbol table. */ - p = find_pc_sect_psymbol (tpst, pc, section); - if (p != NULL - && SYMBOL_VALUE_ADDRESS (p) - == SYMBOL_VALUE_ADDRESS (msymbol)) - return (tpst); - - /* Also accept the textlow value of a psymtab as a - "symbol", to provide some support for partial - symbol tables with line information but no debug - symbols (e.g. those produced by an assembler). */ - if (p != NULL) - this_addr = SYMBOL_VALUE_ADDRESS (p); - else - this_addr = tpst->textlow; - - /* Check whether it is closer than our current - BEST_ADDR. Since this symbol address is - necessarily lower or equal to PC, the symbol closer - to PC is the symbol which address is the highest. - This way we return the psymtab which contains such - best match symbol. This can help in cases where the - symbol information/debuginfo is not complete, like - for instance on IRIX6 with gcc, where no debug info - is emitted for statics. (See also the nodebug.exp - testcase.) */ - if (this_addr > best_addr) - { - best_addr = this_addr; - best_pst = tpst; - } - } + return pst; } - return (best_pst); } - } - return (NULL); + + /* Existing PSYMTABS_ADDRMAP mapping is present even for PARTIAL_SYMTABs + which still have no corresponding full SYMTABs read. But it is not + present for non-DWARF2 debug infos not supporting PSYMTABS_ADDRMAP in GDB + so far. */ + + ALL_OBJFILES (objfile) + { + struct partial_symtab *pst; + + /* Check even OBJFILE with non-zero PSYMTABS_ADDRMAP as only several of + its CUs may be missing in PSYMTABS_ADDRMAP as they may be varying + debug info type in single OBJFILE. */ + + ALL_OBJFILE_PSYMTABS (objfile, pst) + if (pc >= pst->textlow && pc < pst->texthigh) + { + struct partial_symtab *best_pst; + + best_pst = find_pc_sect_psymtab_closer (pc, section, pst, + msymbol); + if (best_pst != NULL) + return best_pst; + } + } + + return NULL; } /* Find which partial symtab contains PC. Return 0 if none. --- ./gdb/testsuite/gdb.dwarf2/dw2-ranges.S 2008-04-20 16:38:19.000000000 +0200 +++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges.S 2008-04-23 10:28:05.000000000 +0200 @@ -35,7 +35,10 @@ main: .int 0 .endfunc .size main, . - main - .section .text.func, "ax", @progbits + /* `.fini' section is here to make sure `dw2-ranges.S' + vs. `dw2-ranges2.S' overlap their DW_AT_ranges with each other. */ + .section .fini, "ax", @progbits + .globl func .func func func: .int 0 --- ./gdb/testsuite/gdb.dwarf2/dw2-ranges.exp 2008-04-20 16:38:19.000000000 +0200 +++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges.exp 2008-04-23 10:28:05.000000000 +0200 @@ -30,9 +30,23 @@ if {![istarget *-*-linux*] set testfile "dw2-ranges" set srcfile ${testfile}.S -set binfile ${objdir}/${subdir}/${testfile}.o +set srcfile2 ${testfile}2.S +set srcfile3 ${testfile}3.S +set objfile ${objdir}/${subdir}/${testfile}.o +set objfile2 ${objdir}/${subdir}/${testfile}2.o +set objfile3 ${objdir}/${subdir}/${testfile}3.o +set binfile ${objdir}/${subdir}/${testfile} -if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" object debug] != "" } { +if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object {additional_flags=-gdwarf-2}] != "" } { + return -1 +} +if {[gdb_compile "${srcdir}/${subdir}/${srcfile2}" "${objfile2}" object {additional_flags=-gdwarf-2}] != "" } { + return -1 +} +if {[gdb_compile "${srcdir}/${subdir}/${srcfile3}" "${objfile3}" object {additional_flags=-gstabs}] != "" } { + return -1 +} +if {[gdb_compile "${objfile} ${objfile2} ${objfile3}" "${binfile}" executable {}] != "" } { return -1 } @@ -46,4 +60,8 @@ gdb_load ${binfile} # Wrong output: # No line number information available for address 0x4 +gdb_test "info line main" "Line \[0-9\]* of .* starts at address .* and ends at .*" gdb_test "info line func" "Line \[0-9\]* of .* starts at address .* and ends at .*" +gdb_test "info line main2" "Line \[0-9\]* of .* starts at address .* and ends at .*" +gdb_test "info line func2" "Line \[0-9\]* of .* starts at address .* and ends at .*" +gdb_test "info line main3" "Line \[0-9\]* of .* starts at address .* and ends at .*" --- ./gdb/testsuite/gdb.dwarf2/dw2-ranges2.S 1970-01-01 01:00:00.000000000 +0100 +++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges2.S 2008-04-23 10:28:05.000000000 +0200 @@ -0,0 +1,46 @@ +/* + Copyright 2007 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +/* Despite the sections below will be adjacent the assembler has to produce + DW_AT_ranges as the linker could place both sections at arbitrary locations. + */ + + /* Such directive is required by GAS for builds without `-g'. */ + .file 1 "dw2-ranges2.S" + + /* Without this directive GAS will not emit DWARF2 unless we provide an + instruction to assemble. We want to avoid any instructions to + remain architecture independent. */ + .loc_mark_labels 1 + + .text + + .globl main2 + .func main2 +main2: .int 0 + .endfunc + .size main2, . - main2 + + /* `.fini' section is here to make sure `dw2-ranges.S' + vs. `dw2-ranges2.S' overlap their DW_AT_ranges with each other. */ + .section .fini, "ax", @progbits + + .globl func2 + .func func2 +func2: .int 0 + .endfunc + .size func2, . - func2 --- ./gdb/testsuite/gdb.dwarf2/dw2-ranges3.S 1970-01-01 01:00:00.000000000 +0100 +++ ./gdb/testsuite/gdb.dwarf2/dw2-ranges3.S 2008-04-23 10:28:05.000000000 +0200 @@ -0,0 +1,36 @@ +/* + Copyright 2007, 2008 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + */ + +/* Despite the sections below will be adjacent the assembler has to produce + DW_AT_ranges as the linker could place both sections at arbitrary locations. + */ + + /* Such directive is required by GAS for builds without `-g'. */ + .file 1 "dw2-ranges3.S" + + /* Without this directive GAS will not emit DWARF2 unless we provide an + instruction to assemble. We want to avoid any instructions to + remain architecture independent. */ + .loc_mark_labels 1 + + .text + + .globl main3 + .func main3 +main3: .int 0 + .endfunc + .size main3, . - main3 --+jhVVhN62yS6hEJ8--