aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog13
-rw-r--r--gas/NEWS3
-rw-r--r--gas/as.c13
-rw-r--r--gas/as.h5
-rw-r--r--gas/doc/as.texinfo24
-rw-r--r--gas/dwarf2dbg.c54
-rw-r--r--gas/testsuite/ChangeLog4
-rw-r--r--gas/testsuite/gas/elf/dwarf2-3.d2
8 files changed, 94 insertions, 24 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 1eb995d..ec756d8 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -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
diff --git a/gas/NEWS b/gas/NEWS
index f453b49..202db36 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 2caca70..1b1d34e 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=<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;
diff --git a/gas/as.h b/gas/as.h
index 9cdf7ae..1fefee9 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 1476c14..9c55ef4 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 76b5fe0..df93bac 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 <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);
}
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 48ef178..ed42859 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -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*.
diff --git a/gas/testsuite/gas/elf/dwarf2-3.d b/gas/testsuite/gas/elf/dwarf2-3.d
index 0e728dd..0d6c580 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.