* dwarf2dbg.c (DWARF2_USE_FIXED_ADVANCE_PC): Enable when using
authorNick Clifton <nickc@redhat.com>
Thu, 28 Jun 2012 11:31:14 +0000 (11:31 +0000)
committerNick Clifton <nickc@redhat.com>
Thu, 28 Jun 2012 11:31:14 +0000 (11:31 +0000)
linker relaxation.
(dwarf2_gen_line_info): Generate real, local, labels for line
numbers.
(dwarf2dbg_convert_frag): Do not finalize the computation of the
frag's symbol value when linker relaxation is enabled.
(ADDR_DELTA_LIMIT): Define.
(size_fixed_inc_line_addr): Use ADDR_DELTA_LIMIT.
(emit_fixed_inc_line_addr): Likewise.
* write.c (fixup_segment): If the subtraction of two symbols
cannot be resolved but is valid, then prevent bogus range warnings
by pre-biasing add_number.
* config/tc-h8300.h (DWARF2_USE_FIXED_ADVANCE_PC): Define to 0.

* gas/lns/lns.exp: Use alternate lns-common test for targets
enabling linker relaxation.
* gas/lns/lns-big-delta.d: Allow for output from architectures
with 32-bit addresses.

gas/ChangeLog
gas/config/tc-h8300.h
gas/dwarf2dbg.c
gas/testsuite/ChangeLog
gas/testsuite/gas/lns/lns-big-delta.d
gas/testsuite/gas/lns/lns.exp
gas/write.c

index 4149ba35b6f90561582b39ca9163b77ff3b70361..0d833a9e5fc1017b2f33d955785a0525bf11cef5 100644 (file)
@@ -1,3 +1,19 @@
+2012-06-28  Nick Clifton  <nickc@redhat.com>
+
+       * dwarf2dbg.c (DWARF2_USE_FIXED_ADVANCE_PC): Enable when using
+       linker relaxation.
+       (dwarf2_gen_line_info): Generate real, local, labels for line
+       numbers.
+       (dwarf2dbg_convert_frag): Do not finalize the computation of the
+       frag's symbol value when linker relaxation is enabled.
+       (ADDR_DELTA_LIMIT): Define.
+       (size_fixed_inc_line_addr): Use ADDR_DELTA_LIMIT.
+       (emit_fixed_inc_line_addr): Likewise.
+       * write.c (fixup_segment): If the subtraction of two symbols
+       cannot be resolved but is valid, then prevent bogus range warnings
+       by pre-biasing add_number.
+       * config/tc-h8300.h (DWARF2_USE_FIXED_ADVANCE_PC): Define to 0.
+
 2012-06-22  Roland McGrath  <mcgrathr@google.com>
 
        * NEWS: Mention 'rep ret' too.
index 73d48409631b5ba25ef0d241b250b27b27e61f9a..f86cf94a3e844a4dbc5775f788a15b7f7ad859b8 100644 (file)
@@ -51,6 +51,7 @@ struct internal_reloc;
 
 /* Minimum instruction is of 16 bits.  */
 #define DWARF2_LINE_MIN_INSN_LENGTH 2
+#define DWARF2_USE_FIXED_ADVANCE_PC 0
 
 #ifdef OBJ_ELF
 /* Provide mappings from the original H8 COFF relocation names to
index f428f0d12230ee3c17957ce857b64ff991c3228a..2ec329abc158deddcf4400f89f1673b508ce8c21 100644 (file)
    opcodes and variable-length operands cannot be used.  If this macro is
    nonzero, use the DW_LNS_fixed_advance_pc opcode instead.  */
 #ifndef DWARF2_USE_FIXED_ADVANCE_PC
-# define DWARF2_USE_FIXED_ADVANCE_PC   0
+# define DWARF2_USE_FIXED_ADVANCE_PC   linkrelax
 #endif
 
 /* First special line opcde - leave room for the standard opcodes.
@@ -361,7 +361,17 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
   filenum = loc->filenum;
 
   dwarf2_push_line (loc);
-  dwarf2_flush_pending_lines (symbol_temp_new (now_seg, ofs, frag_now));
+  if (linkrelax)
+    {
+      char name[120];
+
+      /* Use a non-fake name for the line number location,
+        so that it can be referred to by relocations.  */
+      sprintf (name, ".Loc.%u.%u", line, filenum);
+      dwarf2_flush_pending_lines (symbol_new (name, now_seg, ofs, frag_now));
+    }
+  else
+    dwarf2_flush_pending_lines (symbol_temp_new (now_seg, ofs, frag_now));
 }
 
 /* Returns the current source information.  If .file directives have
@@ -1064,6 +1074,7 @@ out_inc_line_addr (int line_delta, addressT addr_delta)
    line and address information, but it is required if linker relaxation
    could change the code offsets.  The following two routines *must* be
    kept in sync.  */
+#define ADDR_DELTA_LIMIT 50000
 
 static int
 size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
@@ -1074,7 +1085,7 @@ size_fixed_inc_line_addr (int line_delta, addressT addr_delta)
   if (line_delta != INT_MAX)
     len = 1 + sizeof_leb128 (line_delta, 1);
 
-  if (addr_delta > 50000)
+  if (addr_delta > ADDR_DELTA_LIMIT)
     {
       /* DW_LNS_extended_op */
       len += 1 + sizeof_leb128 (sizeof_address + 1, 0);
@@ -1122,7 +1133,7 @@ emit_fixed_inc_line_addr (int line_delta, addressT addr_delta, fragS *frag,
      which this function would not be used) could change the operand by
      an unknown amount.  If the address increment is getting close to
      the limit, just reset the address.  */
-  if (addr_delta > 50000)
+  if (addr_delta > ADDR_DELTA_LIMIT)
     {
       symbolS *to_sym;
       expressionS exp;
@@ -1231,7 +1242,24 @@ dwarf2dbg_convert_frag (fragS *frag)
 {
   offsetT addr_diff;
 
-  addr_diff = resolve_symbol_value (frag->fr_symbol);
+  if (DWARF2_USE_FIXED_ADVANCE_PC)
+    {
+      /* If linker relaxation is enabled then the distance bewteen the two
+        symbols in the frag->fr_symbol expression might change.  Hence we
+        cannot rely upon the value computed by resolve_symbol_value.
+        Instead we leave the expression unfinalized and allow
+        emit_fixed_inc_line_addr to create a fixup (which later becomes a
+        relocation) that will allow the linker to correctly compute the
+        actual address difference.  We have to use a fixed line advance for
+        this as we cannot (easily) relocate leb128 encoded values.  */
+      int saved_finalize_syms = finalize_syms;
+
+      finalize_syms = 0;
+      addr_diff = resolve_symbol_value (frag->fr_symbol);
+      finalize_syms = saved_finalize_syms;
+    }
+  else
+    addr_diff = resolve_symbol_value (frag->fr_symbol);
 
   /* fr_var carries the max_chars that we created the fragment with.
      fr_subtype carries the current expected length.  We must, of
index 729b748bb9e961acc4a464437367d085f389ad81..d76f013451b456394878a531a5d8d5c3cfa6f801 100644 (file)
@@ -1,3 +1,10 @@
+2012-06-28  Nick Clifton  <nickc@redhat.com>
+
+       * gas/lns/lns.exp: Use alternate lns-common test for targets
+       enabling linker relaxation.
+       * gas/lns/lns-big-delta.d: Allow for output from architectures
+       with 32-bit addresses.
+
 2012-06-27  Alan Modra  <amodra@gmail.com>
 
        * gas/i386/rep-ret.s: Zero pad section.
index 43b48d89e251c4cac00eda7d126ef394b2c2ca4c..b6a113e811aa19ab3778510deaa1c7fc4758cef6 100644 (file)
@@ -10,8 +10,8 @@ Raw dump of debug contents of section \.debug_line:
   Advance PC by fixed size amount 0 to 0x0
   Copy
   Advance Line by 1 to 3
-  Extended opcode 2: set Address to 0x124fc
+  Extended opcode 2: set Address to 0x.....
   Copy
-  Advance PC by fixed size amount 4 to 0x12500
+  Advance PC by fixed size amount . to 0x.....
   Extended opcode 1: End of Sequence
 #pass
index 4fba663c85aa536b5652fde5882b2c022c807c8a..30e2688245bc5c0c9226312a091f9194abd4f5bf 100644 (file)
@@ -17,7 +17,10 @@ if {
      && ![istarget s390*-*-*]
 } {
     # Use alternate file for targets using DW_LNS_fixed_advance_pc opcodes.
-    if { [istarget xtensa*-*-*] } {
+    if {    [istarget xtensa*-*-*]
+        || [istarget am3*-*-*]
+        || [istarget cr16-*-*]
+        || [istarget mn10*-*-*] } {
       run_dump_test "lns-common-1-alt"
       run_dump_test "lns-big-delta"
     } elseif { [istarget ia64*-*-*] } {
index 23d4334289fc2c515f49104ce7f4e710b57c0e1b..7fb2e8bb3b97683152c9a70903a1aed1fd907271 100644 (file)
@@ -1004,7 +1004,12 @@ fixup_segment (fixS *fixP, segT this_segment)
              fixP->fx_subsy = NULL;
              fixP->fx_pcrel = 1;
            }
-         else if (!TC_VALIDATE_FIX_SUB (fixP, add_symbol_segment))
+         else if (TC_VALIDATE_FIX_SUB (fixP, add_symbol_segment))
+           /* If the fix is valid, subtract fx_subsy here.  The addition of
+              fx_addsy will be performed below.  Doing this prevents bogus
+              warnings from the range check below.  */
+             add_number -= S_GET_VALUE (fixP->fx_subsy);
+         else
            {
              if (!md_register_arithmetic
                  && (add_symbol_segment == reg_section