* 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:
parent
09526ec1c2
commit
b40bf0a255
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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.
|
||||
|
1324
binutils/dwarf.c
1324
binutils/dwarf.c
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||
|
@ -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
|
||||
|
3
gas/NEWS
3
gas/NEWS
@ -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.
|
||||
|
13
gas/as.c
13
gas/as.c
@ -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;
|
||||
|
5
gas/as.h
5
gas/as.h
@ -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;
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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*.
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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) }
|
||||
|
Loading…
Reference in New Issue
Block a user