Browse Source

Fixes the generation of dwarf line debug information for the msp430, even in the presence of function sections and linker garbage collection.

PR 17940
	* dwarf2dbg.c (out_header): When generating dwarf sections use
	real symbols not temps for the start and end symbols.
	* config/tc-msp430.h (TC_FORCE_RELOCATION_SUB_SAME): Also prevent
	adjustments to relocations in debug sections.
	(TC_LINKRELAX_FIXUP): Likewise.

	* elf32-msp430.c (msp430_elf_relax_delete_bytes): Adjust debug
	symbols at end of sections.  Adjust function sizes.
gdb-7.10-branch
Nick Clifton 12 years ago
parent
commit
0f8f0c57ea
  1. 4
      bfd/ChangeLog
  2. 49
      bfd/elf32-msp430.c
  3. 9
      gas/ChangeLog
  4. 5
      gas/config/tc-msp430.h
  5. 18
      gas/dwarf2dbg.c

4
bfd/ChangeLog

@ -3,6 +3,10 @@
PR 17914
* cpu-w65.c: Correct typos in license notice.
PR 17940
* elf32-msp430.c (msp430_elf_relax_delete_bytes): Adjust debug
symbols at end of sections. Adjust function sizes.
2015-02-20 Andreas Arnez <arnez@linux.vnet.ibm.com>
* elf-bfd.h (elfcore_write_s390_vxrs_low): Add prototype.

49
bfd/elf32-msp430.c

@ -1656,9 +1656,38 @@ msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr,
symtab_hdr = & elf_tdata (abfd)->symtab_hdr;
isym = (Elf_Internal_Sym *) symtab_hdr->contents;
for (isymend = isym + symtab_hdr->sh_info; isym < isymend; isym++)
if (isym->st_shndx == sec_shndx
&& isym->st_value > addr && isym->st_value < toaddr)
isym->st_value -= count;
{
const char * name;
name = bfd_elf_string_from_elf_section
(abfd, symtab_hdr->sh_link, isym->st_name);
name = (name == NULL || * name == 0) ? bfd_section_name (abfd, sec) : name;
if (isym->st_shndx != sec_shndx)
continue;
if (isym->st_value > addr
&& (isym->st_value < toaddr
/* We also adjust a symbol at the end of the section if its name is
on the list below. These symbols are used for debug info
generation and they refer to the end of the current section, not
the start of the next section. */
|| (isym->st_value == toaddr
&& name != NULL
&& (CONST_STRNEQ (name, ".Letext")
|| CONST_STRNEQ (name, ".LFE")))))
{
if (isym->st_value < addr + count)
isym->st_value = addr;
else
isym->st_value -= count;
}
/* Adjust the function symbol's size as well. */
else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC
&& isym->st_value + isym->st_size > addr
&& isym->st_value + isym->st_size < toaddr)
isym->st_size -= count;
}
/* Now adjust the global symbols defined in this section. */
symcount = (symtab_hdr->sh_size / sizeof (Elf32_External_Sym)
@ -1674,7 +1703,19 @@ msp430_elf_relax_delete_bytes (bfd * abfd, asection * sec, bfd_vma addr,
&& sym_hash->root.u.def.section == sec
&& sym_hash->root.u.def.value > addr
&& sym_hash->root.u.def.value < toaddr)
sym_hash->root.u.def.value -= count;
{
if (sym_hash->root.u.def.value < addr + count)
sym_hash->root.u.def.value = addr;
else
sym_hash->root.u.def.value -= count;
}
/* Adjust the function symbol's size as well. */
else if (sym_hash->root.type == bfd_link_hash_defined
&& sym_hash->root.u.def.section == sec
&& sym_hash->type == STT_FUNC
&& sym_hash->root.u.def.value + sym_hash->size > addr
&& sym_hash->root.u.def.value + sym_hash->size < toaddr)
sym_hash->size -= count;
}
return TRUE;

9
gas/ChangeLog

@ -1,3 +1,12 @@
2015-02-23 Nick Clifton <nickc@redhat.com>
PR 17940
* dwarf2dbg.c (out_header): When generating dwarf sections use
real symbols not temps for the start and end symbols.
* config/tc-msp430.h (TC_FORCE_RELOCATION_SUB_SAME): Also prevent
adjustments to relocations in debug sections.
(TC_LINKRELAX_FIXUP): Likewise.
2015-02-19 Alan Modra <amodra@gmail.com>
* doc/as.texinfo (Local Symbol Names): Don't use ':' in pxref.

5
gas/config/tc-msp430.h

@ -159,7 +159,8 @@ extern bfd_boolean msp430_allow_local_subtract (expressionS *, expressionS *, se
linker, but this fix is simpler, and it pretty much only affects
object size a little bit. */
#define TC_FORCE_RELOCATION_SUB_SAME(FIX, SEC) \
(((SEC)->flags & SEC_CODE) != 0 \
( ((SEC)->flags & SEC_CODE) != 0 \
|| ((SEC)->flags & SEC_DEBUGGING) != 0 \
|| ! SEG_NORMAL (SEC) \
|| TC_FORCE_RELOCATION (FIX))
@ -169,4 +170,4 @@ extern bfd_boolean msp430_allow_local_subtract (expressionS *, expressionS *, se
#define DWARF2_USE_FIXED_ADVANCE_PC 1
#define TC_LINKRELAX_FIXUP(seg) (seg->flags & SEC_CODE)
#define TC_LINKRELAX_FIXUP(seg) ((seg->flags & SEC_CODE) || (seg->flags & SEC_DEBUGGING))

18
gas/dwarf2dbg.c

@ -1467,8 +1467,22 @@ out_header (asection *sec, expressionS *exp)
symbolS *end_sym;
subseg_set (sec, 0);
start_sym = symbol_temp_new_now ();
end_sym = symbol_temp_make ();
#if 1
if (flag_dwarf_sections)
{
/* If we are going to put the start and end symbols in different
sections, then we need real symbols, not just fake, local ones. */
frag_now_fix ();
start_sym = symbol_make (".Ldebug_line_start");
end_sym = symbol_make (".Ldebug_line_end");
symbol_set_value_now (start_sym);
}
else
#endif
{
start_sym = symbol_temp_new_now ();
end_sym = symbol_temp_make ();
}
/* Total length of the information. */
exp->X_op = O_subtract;

Loading…
Cancel
Save