Extend .reloc to accept some BFD_RELOCs
Tests that bfd_perform_reloc doesn't freak over a NONE reloc at end of section. gas/ * read.c (s_reloc): Match BFD_RELOC_NONE, BFD_RELOC{8,16,32,64}. * write.c (get_frag_for_reloc): Allow match just past end of frag. gas/testsuite/ * gas/all/none.s, * gas/all/none.d: New test. * gas/all/gas.exp: Run it.
This commit is contained in:
parent
0ba38529f2
commit
740bdc67c0
@ -1,3 +1,8 @@
|
||||
2015-01-19 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* read.c (s_reloc): Match BFD_RELOC_NONE, BFD_RELOC{8,16,32,64}.
|
||||
* write.c (get_frag_for_reloc): Allow match just past end of frag.
|
||||
|
||||
2015-01-16 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* config/tc-s390.c (struct pd_reg): Remove.
|
||||
|
23
gas/read.c
23
gas/read.c
@ -3993,6 +3993,14 @@ s_reloc (int ignore ATTRIBUTE_UNUSED)
|
||||
char *r_name;
|
||||
int c;
|
||||
struct reloc_list *reloc;
|
||||
struct _bfd_rel { char *name; bfd_reloc_code_real_type code; };
|
||||
static struct _bfd_rel bfd_relocs[] = {
|
||||
{ "NONE", BFD_RELOC_NONE },
|
||||
{ "8", BFD_RELOC_8 },
|
||||
{ "16", BFD_RELOC_16 },
|
||||
{ "32", BFD_RELOC_32 },
|
||||
{ "64", BFD_RELOC_64 }
|
||||
};
|
||||
|
||||
reloc = (struct reloc_list *) xmalloc (sizeof (*reloc));
|
||||
|
||||
@ -4035,7 +4043,20 @@ s_reloc (int ignore ATTRIBUTE_UNUSED)
|
||||
SKIP_WHITESPACE ();
|
||||
r_name = input_line_pointer;
|
||||
c = get_symbol_end ();
|
||||
reloc->u.a.howto = bfd_reloc_name_lookup (stdoutput, r_name);
|
||||
if (strncasecmp (r_name, "BFD_RELOC_", 10) == 0)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (reloc->u.a.howto = NULL, i = 0; i < ARRAY_SIZE (bfd_relocs); i++)
|
||||
if (strcasecmp (r_name + 10, bfd_relocs[i].name) == 0)
|
||||
{
|
||||
reloc->u.a.howto = bfd_reloc_type_lookup (stdoutput,
|
||||
bfd_relocs[i].code);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
reloc->u.a.howto = bfd_reloc_name_lookup (stdoutput, r_name);
|
||||
*input_line_pointer = c;
|
||||
if (reloc->u.a.howto == NULL)
|
||||
{
|
||||
|
@ -1,3 +1,9 @@
|
||||
2015-01-19 Alan Modra <amodra@gmail.com>
|
||||
|
||||
* gas/all/none.s,
|
||||
* gas/all/none.d: New test.
|
||||
* gas/all/gas.exp: Run it.
|
||||
|
||||
2015-01-16 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
|
||||
|
||||
* gas/s390/esa-g5.d: Add a variant without the optional operand.
|
||||
|
@ -430,6 +430,9 @@ gas_test_error "weakref3.s" "" "a: would close weakref loop: a => b => c => d =>
|
||||
gas_test_error "weakref4.s" "" "is already defined"
|
||||
|
||||
run_dump_test string
|
||||
if [is_elf_format] {
|
||||
run_dump_test none
|
||||
}
|
||||
|
||||
load_lib gas-dg.exp
|
||||
dg-init
|
||||
|
4
gas/testsuite/gas/all/none.d
Normal file
4
gas/testsuite/gas/all/none.d
Normal file
@ -0,0 +1,4 @@
|
||||
#objdump: -r -w
|
||||
|
||||
#...
|
||||
0+ .*(NONE|NULL|UNUSED0) +\*ABS\*
|
2
gas/testsuite/gas/all/none.s
Normal file
2
gas/testsuite/gas/all/none.s
Normal file
@ -0,0 +1,2 @@
|
||||
.text
|
||||
.reloc 0, BFD_RELOC_NONE, 0
|
@ -1184,6 +1184,11 @@ get_frag_for_reloc (fragS *last_frag,
|
||||
&& r->u.b.r.address < f->fr_address + f->fr_fix)
|
||||
return f;
|
||||
|
||||
for (f = seginfo->frchainP->frch_root; f != NULL; f = f->fr_next)
|
||||
if (f->fr_address <= r->u.b.r.address
|
||||
&& r->u.b.r.address <= f->fr_address + f->fr_fix)
|
||||
return f;
|
||||
|
||||
as_bad_where (r->file, r->line,
|
||||
_("reloc not within (fixed part of) section"));
|
||||
return NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user