* elflink.c (_bfd_elf_gc_mark_extra_sections): Remove mark from

fragmented .debug_line sections associated with unmarked code
	sections.

	* dwarf.c (read_debug_line_header): New function.  Reads in a
	header in a .debug_line section.
	(display_debug_lines_raw): Use new function.  Handle fragmentary
	.debug_line sections.
	(display_debug_lines_decoded): Likewise.
	* readelf.c (process_section_headers): Handle fragmenatry
	.debug_line sections.
	(display_debug_section): Likewise.

	* as.c (Options): Add -gdwarf-sections.
	(parse_args): Likewise.
	* as.h (flag_dwarf_sections): Declare.
	* dwarf2dbg.c (emit_fixed_inc_line_addr): Skip section changes.
	(process_entries): When -gdwarf-sections is enabled generate
	fragmentary .debug_line sections.
	(out_debug_line): Set the section for the .debug_line section end
	symbol.
	* doc/as.texinfo: Document -gdwarf-sections.
	* NEWS: Mention -gdwarf-sections.

	* gas/elf/dwarf2-3.d: Fix expected readelf output.

	* scripttempl/DWARF.sc: Add support for .debug_line.* and
	.debug_line_end.
This commit is contained in:
Nick Clifton 2013-04-29 13:38:59 +00:00
parent 09526ec1c2
commit b40bf0a255
15 changed files with 857 additions and 671 deletions

View File

@ -1,3 +1,9 @@
2013-04-29 Nick Clifton <nickc@redhat.com>
* elflink.c (_bfd_elf_gc_mark_extra_sections): Remove mark from
fragmented .debug_line sections associated with unmarked code
sections.
2013-04-29 Will Newton <will.newton@linaro.org>
* elf32-arm.c (elf32_arm_populate_plt_entry): Call

View File

@ -11814,23 +11814,30 @@ _bfd_elf_gc_mark_extra_sections (struct bfd_link_info *info,
{
asection *isec;
bfd_boolean some_kept;
bfd_boolean debug_frag_seen;
if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
continue;
/* Ensure all linker created sections are kept, and see whether
any other section is already marked. */
some_kept = FALSE;
/* Ensure all linker created sections are kept,
see if any other section is already marked,
and note if we have any fragmented debug sections. */
debug_frag_seen = some_kept = FALSE;
for (isec = ibfd->sections; isec != NULL; isec = isec->next)
{
if ((isec->flags & SEC_LINKER_CREATED) != 0)
isec->gc_mark = 1;
else if (isec->gc_mark)
some_kept = TRUE;
if (debug_frag_seen == FALSE
&& (isec->flags & SEC_DEBUGGING)
&& CONST_STRNEQ (isec->name, ".debug_line."))
debug_frag_seen = TRUE;
}
/* If no section in this file will be kept, then we can
toss out debug sections. */
toss out the debug and special sections. */
if (!some_kept)
continue;
@ -11842,6 +11849,45 @@ _bfd_elf_gc_mark_extra_sections (struct bfd_link_info *info,
&& ((isec->flags & SEC_DEBUGGING) != 0
|| (isec->flags & (SEC_ALLOC | SEC_LOAD | SEC_RELOC)) == 0))
isec->gc_mark = 1;
if (! debug_frag_seen)
continue;
/* Look for CODE sections which are going to be discarded,
and find and discard any fragmented debug sections which
are associated with that code section. */
for (isec = ibfd->sections; isec != NULL; isec = isec->next)
if ((isec->flags & SEC_CODE) != 0
&& isec->gc_mark == 0)
{
unsigned int ilen;
asection *dsec;
ilen = strlen (isec->name);
/* Association is determined by the name of the debug section
containing the name of the code section as a suffix. For
example .debug_line.text.foo is a debug section associated
with .text.foo. */
for (dsec = ibfd->sections; dsec != NULL; dsec = dsec->next)
{
unsigned int dlen;
if (dsec->gc_mark == 0
|| (dsec->flags & SEC_DEBUGGING) == 0)
continue;
dlen = strlen (dsec->name);
if (dlen > ilen
&& strncmp (dsec->name + (dlen - ilen),
isec->name, ilen) == 0)
{
dsec->gc_mark = 0;
break;
}
}
}
}
return TRUE;
}

View File

@ -1,3 +1,14 @@
2013-04-29 Nick Clifton <nickc@redhat.com>
* dwarf.c (read_debug_line_header): New function. Reads in a
header in a .debug_line section.
(display_debug_lines_raw): Use new function. Handle fragmentary
.debug_line sections.
(display_debug_lines_decoded): Likewise.
* readelf.c (process_section_headers): Handle fragmenatry
.debug_line sections.
(display_debug_section): Likewise.
2013-04-26 Ian Lance Taylor <iant@google.com>
* MAINTAINERS: Add myself and Cary as gold maintainers.

File diff suppressed because it is too large Load Diff

View File

@ -4838,7 +4838,8 @@ process_section_headers (FILE * file)
|| (do_debug_info && const_strneq (name, "info"))
|| (do_debug_info && const_strneq (name, "types"))
|| (do_debug_abbrevs && const_strneq (name, "abbrev"))
|| (do_debug_lines && const_strneq (name, "line"))
|| (do_debug_lines && strcmp (name, "line") == 0)
|| (do_debug_lines && const_strneq (name, "line."))
|| (do_debug_pubnames && const_strneq (name, "pubnames"))
|| (do_debug_pubtypes && const_strneq (name, "pubtypes"))
|| (do_debug_aranges && const_strneq (name, "aranges"))
@ -10972,6 +10973,7 @@ display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
/* See if we know how to display the contents of this section. */
for (i = 0; i < max; i++)
if (streq (debug_displays[i].section.uncompressed_name, name)
|| (i == line && const_strneq (name, ".debug_line."))
|| streq (debug_displays[i].section.compressed_name, name))
{
struct dwarf_section * sec = &debug_displays [i].section;
@ -10980,7 +10982,9 @@ display_debug_section (int shndx, Elf_Internal_Shdr * section, FILE * file)
if (secondary)
free_debug_section ((enum dwarf_section_display_enum) i);
if (streq (sec->uncompressed_name, name))
if (i == line && const_strneq (name, ".debug_line."))
sec->name = name;
else if (streq (sec->uncompressed_name, name))
sec->name = sec->uncompressed_name;
else
sec->name = sec->compressed_name;

View File

@ -1,3 +1,16 @@
2013-04-29 Nick Clifton <nickc@redhat.com>
* as.c (Options): Add -gdwarf-sections.
(parse_args): Likewise.
* as.h (flag_dwarf_sections): Declare.
* dwarf2dbg.c (emit_fixed_inc_line_addr): Skip section changes.
(process_entries): When -gdwarf-sections is enabled generate
fragmentary .debug_line sections.
(out_debug_line): Set the section for the .debug_line section end
symbol.
* doc/as.texinfo: Document -gdwarf-sections.
* NEWS: Mention -gdwarf-sections.
2013-04-26 Christian Groessler <chris@groessler.org>
* config/tc-z8k.c (md_parse_option): Set z8k_target_from_cmdline

View File

@ -1,5 +1,8 @@
-*- text -*-
* Add -gdwarf-sections command line option to enable per-code-section
generation of DWARF .debug_line sections.
* Add support for Altera Nios II.
* Add support for the Imagination Technologies Meta processor.

View File

@ -1,8 +1,5 @@
/* as.c - GAS main program.
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
2010, 2011, 2012, 2013
Free Software Foundation, Inc.
Copyright 1987-2013 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -302,6 +299,8 @@ Options:\n\
fprintf (stream, _("\
--gdwarf-2 generate DWARF2 debugging information\n"));
fprintf (stream, _("\
--gdwarf-sections generate per-function section names for DWARF line information\n"));
fprintf (stream, _("\
--hash-size=<value> set the hash table size close to <value>\n"));
fprintf (stream, _("\
--help show this message and exit\n"));
@ -443,6 +442,7 @@ parse_args (int * pargc, char *** pargv)
OPTION_GSTABS,
OPTION_GSTABS_PLUS,
OPTION_GDWARF2,
OPTION_GDWARF_SECTIONS,
OPTION_STRIP_LOCAL_ABSOLUTE,
OPTION_TRADITIONAL_FORMAT,
OPTION_WARN,
@ -490,6 +490,7 @@ parse_args (int * pargc, char *** pargv)
/* GCC uses --gdwarf-2 but GAS uses to use --gdwarf2,
so we keep it here for backwards compatibility. */
,{"gdwarf2", no_argument, NULL, OPTION_GDWARF2}
,{"gdwarf-sections", no_argument, NULL, OPTION_GDWARF_SECTIONS}
,{"gen-debug", no_argument, NULL, 'g'}
,{"gstabs", no_argument, NULL, OPTION_GSTABS}
,{"gstabs+", no_argument, NULL, OPTION_GSTABS_PLUS}
@ -753,6 +754,10 @@ This program has absolutely no warranty.\n"));
debug_type = DEBUG_DWARF2;
break;
case OPTION_GDWARF_SECTIONS:
flag_dwarf_sections = TRUE;
break;
case 'J':
flag_signed_overflow_ok = 1;
break;

View File

@ -1,7 +1,5 @@
/* as.h - global header file
Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2012
Free Software Foundation, Inc.
Copyright 1987-2013 Free Software Foundation, Inc.
This file is part of GAS, the GNU Assembler.
@ -417,6 +415,7 @@ enum debug_info_type
extern enum debug_info_type debug_type;
extern int use_gnu_debug_info_extensions;
COMMON bfd_boolean flag_dwarf_sections;
/* Maximum level of macro nesting. */
extern int max_macro_nest;

View File

@ -1,7 +1,5 @@
\input texinfo @c -*-Texinfo-*-
@c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
@c 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
@c Free Software Foundation, Inc.
@c Copyright 1991-2013 Free Software Foundation, Inc.
@c UPDATE!! On future updates--
@c (1) check for new machine-dep cmdline options in
@c md_parse_option definitions in config/tc-*.c
@ -102,9 +100,7 @@
This file documents the GNU Assembler "@value{AS}".
@c man begin COPYRIGHT
Copyright @copyright{} 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
Inc.
Copyright @copyright{} 1991-2013 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
@ -153,9 +149,7 @@ done.
@end tex
@vskip 0pt plus 1filll
Copyright @copyright{} 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
2000, 2001, 2002, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation,
Inc.
Copyright @copyright{} 1991-2013 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
@ -236,7 +230,8 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
[@b{--compress-debug-sections}] [@b{--nocompress-debug-sections}]
[@b{--debug-prefix-map} @var{old}=@var{new}]
[@b{--defsym} @var{sym}=@var{val}] [@b{-f}] [@b{-g}] [@b{--gstabs}]
[@b{--gstabs+}] [@b{--gdwarf-2}] [@b{--help}] [@b{-I} @var{dir}] [@b{-J}]
[@b{--gstabs+}] [@b{--gdwarf-2}] [@b{--gdwarf-sections}]
[@b{--help}] [@b{-I} @var{dir}] [@b{-J}]
[@b{-K}] [@b{-L}] [@b{--listing-lhs-width}=@var{NUM}]
[@b{--listing-lhs-width2}=@var{NUM}] [@b{--listing-rhs-width}=@var{NUM}]
[@b{--listing-cont-lines}=@var{NUM}] [@b{--keep-locals}] [@b{-o}
@ -648,6 +643,15 @@ Generate DWARF2 debugging information for each assembler line. This
may help debugging assembler code, if the debugger can handle it. Note---this
option is only supported by some targets, not all of them.
@item --gdwarf-sections
Instead of creating a .debug_line section, create a series of
.debug_line.@var{foo} sections where @var{foo} is the name of the
corresponding code section. For example a code section called @var{.text.func}
will have its dwarf line number information placed into a section called
@var{.debug_line.text.func}. If the code section is just called @var{.text}
then debug line section will still be called just @var{.debug_line} without any
suffix.
@item --size-check=error
@itemx --size-check=warning
Issue an error or warning for invalid ELF .size directive.

View File

@ -1,6 +1,5 @@
/* dwarf2dbg.c - DWARF2 debug support
Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
Free Software Foundation, Inc.
Copyright 1999-2013 Free Software Foundation, Inc.
Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
This file is part of GAS, the GNU Assembler.
@ -1109,13 +1108,15 @@ emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
char *p, int len)
{
expressionS *pexp;
segT line_seg;
char *end = p + len;
/* Line number sequences cannot go backward in addresses. This means
we've incorrectly ordered the statements in the sequence. */
gas_assert ((offsetT) addr_delta >= 0);
/* Verify that we have kept in sync with size_fixed_inc_line_addr. */
gas_assert (len == size_fixed_inc_line_addr (line_delta, addr_delta));
/* INT_MAX is a signal that this is actually a DW_LNE_end_sequence. */
if (line_delta != INT_MAX)
{
@ -1124,7 +1125,6 @@ emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
}
pexp = symbol_get_value_expression (frag->fr_symbol);
line_seg = subseg_get (".debug_line", 0);
/* The DW_LNS_fixed_advance_pc opcode has a 2-byte operand so it can
advance the address by at most 64K. Linker relaxation (without
@ -1145,14 +1145,12 @@ emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
exp.X_op = O_symbol;
exp.X_add_symbol = to_sym;
exp.X_add_number = 0;
subseg_change (line_seg, 0);
emit_expr_fix (&exp, sizeof_address, frag, p);
p += sizeof_address;
}
else
{
*p++ = DW_LNS_fixed_advance_pc;
subseg_change (line_seg, 0);
emit_expr_fix (pexp, 2, frag, p);
p += 2;
}
@ -1294,6 +1292,40 @@ process_entries (segT seg, struct line_entry *e)
symbolS *last_lab = NULL, *lab;
struct line_entry *next;
if (flag_dwarf_sections)
{
char * name;
const char * sec_name;
/* Switch to the relevent sub-section before we start to emit
the line number table.
FIXME: These sub-sections do not have a normal Line Number
Program Header, thus strictly speaking they are not valid
DWARF sections. Unfortunately the DWARF standard assumes
a one-to-one relationship between compilation units and
line number tables. Thus we have to have a .debug_line
section, as well as our sub-sections, and we have to ensure
that all of the sub-sections are merged into a proper
.debug_line section before a debugger sees them. */
sec_name = bfd_get_section_name (stdoutput, seg);
if (strcmp (sec_name, ".text") != 0)
{
unsigned int len;
len = strlen (sec_name);
name = xmalloc (len + 11 + 2);
sprintf (name, ".debug_line%s", sec_name);
subseg_set (subseg_get (name, FALSE), 0);
}
else
/* Don't create a .debug_line.text section -
that is redundant. Instead just switch back to the
normal .debug_line section. */
subseg_set (subseg_get (".debug_line", FALSE), 0);
}
do
{
int line_delta;
@ -1534,6 +1566,16 @@ out_debug_line (segT line_seg)
as_warn ("dwarf line number information for %s ignored",
segment_name (s->seg));
if (flag_dwarf_sections)
/* We have to switch to the special .debug_line_end section
before emitting the end-of-debug_line symbol. The linker
script arranges for this section to be placed after all the
(potentially garbage collected) .debug_line.<foo> sections.
This section contains the line_end symbol which is used to
compute the size of the linked .debug_line section, as seen
in the DWARF Line Number header. */
subseg_set (subseg_get (".debug_line_end", FALSE), 0);
symbol_set_value_now (line_end);
}

View File

@ -1,3 +1,7 @@
2013-04-29 Nick Clifton <nickc@redhat.com>
* gas/elf/dwarf2-3.d: Fix expected readelf output.
2013-04-24 H.J. Lu <hongjiu.lu@intel.com>
* gas/i386/rex.d: Skip x86_64-*-elf*.

View File

@ -34,5 +34,5 @@ Raw dump of debug contents of section \.z?debug_line:
Entry Dir Time Size Name
1 0 0 0 /beginwarn.c
Line Number Statements:
No Line Number Statements.

View File

@ -1,3 +1,8 @@
2013-04-29 Nick Clifton <nickc@redhat.com>
* scripttempl/DWARF.sc: Add support for .debug_line.* and
.debug_line_end.
2013-04-29 Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
* emultempl/pe.em [cygwin]: Do not merge rdata with v2

View File

@ -18,7 +18,7 @@ cat <<EOF
/* DWARF 2 */
.debug_info 0 : { *(.debug_info${RELOCATING+ .gnu.linkonce.wi.*}) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end ) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }