From b40bf0a25574c43114b906ba151b7895b2348794 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 29 Apr 2013 13:38:59 +0000 Subject: * 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. --- gas/ChangeLog | 13 ++++++++++ gas/NEWS | 3 +++ gas/as.c | 13 +++++++--- gas/as.h | 5 ++-- gas/doc/as.texinfo | 24 ++++++++++-------- gas/dwarf2dbg.c | 54 +++++++++++++++++++++++++++++++++++----- gas/testsuite/ChangeLog | 4 +++ gas/testsuite/gas/elf/dwarf2-3.d | 2 +- 8 files changed, 94 insertions(+), 24 deletions(-) (limited to 'gas') diff --git a/gas/ChangeLog b/gas/ChangeLog index 1eb995dd40..ec756d8fc7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,16 @@ +2013-04-29 Nick Clifton + + * 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 * config/tc-z8k.c (md_parse_option): Set z8k_target_from_cmdline diff --git a/gas/NEWS b/gas/NEWS index f453b4942f..202db36aa2 100644 --- a/gas/NEWS +++ b/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. diff --git a/gas/as.c b/gas/as.c index 2caca70e5f..1b1d34e3cb 100644 --- a/gas/as.c +++ b/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= set the hash table size close to \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; diff --git a/gas/as.h b/gas/as.h index 9cdf7ae02b..1fefee98fd 100644 --- a/gas/as.h +++ b/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; diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 1476c14676..9c55ef4e4b 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -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. diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 76b5fe0fe7..df93bac2c7 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -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 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. 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); } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 48ef178a59..ed428596b5 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-04-29 Nick Clifton + + * gas/elf/dwarf2-3.d: Fix expected readelf output. + 2013-04-24 H.J. Lu * gas/i386/rex.d: Skip x86_64-*-elf*. diff --git a/gas/testsuite/gas/elf/dwarf2-3.d b/gas/testsuite/gas/elf/dwarf2-3.d index 0e728dda18..0d6c580ea5 100644 --- a/gas/testsuite/gas/elf/dwarf2-3.d +++ b/gas/testsuite/gas/elf/dwarf2-3.d @@ -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. -- cgit v1.2.1