* 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.

	* 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.
This commit is contained in:
Nick Clifton
2012-06-28 11:31:14 +00:00
parent 1d7975eb53
commit 453dc3f010
7 changed files with 69 additions and 9 deletions

View 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> 2012-06-22 Roland McGrath <mcgrathr@google.com>
* NEWS: Mention 'rep ret' too. * NEWS: Mention 'rep ret' too.

View File

@ -51,6 +51,7 @@ struct internal_reloc;
/* Minimum instruction is of 16 bits. */ /* Minimum instruction is of 16 bits. */
#define DWARF2_LINE_MIN_INSN_LENGTH 2 #define DWARF2_LINE_MIN_INSN_LENGTH 2
#define DWARF2_USE_FIXED_ADVANCE_PC 0
#ifdef OBJ_ELF #ifdef OBJ_ELF
/* Provide mappings from the original H8 COFF relocation names to /* Provide mappings from the original H8 COFF relocation names to

View File

@ -119,7 +119,7 @@
opcodes and variable-length operands cannot be used. If this macro is opcodes and variable-length operands cannot be used. If this macro is
nonzero, use the DW_LNS_fixed_advance_pc opcode instead. */ nonzero, use the DW_LNS_fixed_advance_pc opcode instead. */
#ifndef DWARF2_USE_FIXED_ADVANCE_PC #ifndef DWARF2_USE_FIXED_ADVANCE_PC
# define DWARF2_USE_FIXED_ADVANCE_PC 0 # define DWARF2_USE_FIXED_ADVANCE_PC linkrelax
#endif #endif
/* First special line opcde - leave room for the standard opcodes. /* First special line opcde - leave room for the standard opcodes.
@ -361,6 +361,16 @@ dwarf2_gen_line_info (addressT ofs, struct dwarf2_line_info *loc)
filenum = loc->filenum; filenum = loc->filenum;
dwarf2_push_line (loc); dwarf2_push_line (loc);
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)); dwarf2_flush_pending_lines (symbol_temp_new (now_seg, ofs, frag_now));
} }
@ -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 line and address information, but it is required if linker relaxation
could change the code offsets. The following two routines *must* be could change the code offsets. The following two routines *must* be
kept in sync. */ kept in sync. */
#define ADDR_DELTA_LIMIT 50000
static int static int
size_fixed_inc_line_addr (int line_delta, addressT addr_delta) 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) if (line_delta != INT_MAX)
len = 1 + sizeof_leb128 (line_delta, 1); len = 1 + sizeof_leb128 (line_delta, 1);
if (addr_delta > 50000) if (addr_delta > ADDR_DELTA_LIMIT)
{ {
/* DW_LNS_extended_op */ /* DW_LNS_extended_op */
len += 1 + sizeof_leb128 (sizeof_address + 1, 0); 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 which this function would not be used) could change the operand by
an unknown amount. If the address increment is getting close to an unknown amount. If the address increment is getting close to
the limit, just reset the address. */ the limit, just reset the address. */
if (addr_delta > 50000) if (addr_delta > ADDR_DELTA_LIMIT)
{ {
symbolS *to_sym; symbolS *to_sym;
expressionS exp; expressionS exp;
@ -1231,6 +1242,23 @@ dwarf2dbg_convert_frag (fragS *frag)
{ {
offsetT addr_diff; offsetT addr_diff;
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); addr_diff = resolve_symbol_value (frag->fr_symbol);
/* fr_var carries the max_chars that we created the fragment with. /* fr_var carries the max_chars that we created the fragment with.

View 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> 2012-06-27 Alan Modra <amodra@gmail.com>
* gas/i386/rep-ret.s: Zero pad section. * gas/i386/rep-ret.s: Zero pad section.

View File

@ -10,8 +10,8 @@ Raw dump of debug contents of section \.debug_line:
Advance PC by fixed size amount 0 to 0x0 Advance PC by fixed size amount 0 to 0x0
Copy Copy
Advance Line by 1 to 3 Advance Line by 1 to 3
Extended opcode 2: set Address to 0x124fc Extended opcode 2: set Address to 0x.....
Copy Copy
Advance PC by fixed size amount 4 to 0x12500 Advance PC by fixed size amount . to 0x.....
Extended opcode 1: End of Sequence Extended opcode 1: End of Sequence
#pass #pass

View File

@ -17,7 +17,10 @@ if {
&& ![istarget s390*-*-*] && ![istarget s390*-*-*]
} { } {
# Use alternate file for targets using DW_LNS_fixed_advance_pc opcodes. # 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-common-1-alt"
run_dump_test "lns-big-delta" run_dump_test "lns-big-delta"
} elseif { [istarget ia64*-*-*] } { } elseif { [istarget ia64*-*-*] } {

View File

@ -1004,7 +1004,12 @@ fixup_segment (fixS *fixP, segT this_segment)
fixP->fx_subsy = NULL; fixP->fx_subsy = NULL;
fixP->fx_pcrel = 1; 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 if (!md_register_arithmetic
&& (add_symbol_segment == reg_section && (add_symbol_segment == reg_section