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:
Alan Modra 2015-01-19 18:57:04 +10:30
parent 0ba38529f2
commit 740bdc67c0
7 changed files with 47 additions and 1 deletions

View File

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

View File

@ -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)
{

View File

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

View File

@ -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

View File

@ -0,0 +1,4 @@
#objdump: -r -w
#...
0+ .*(NONE|NULL|UNUSED0) +\*ABS\*

View File

@ -0,0 +1,2 @@
.text
.reloc 0, BFD_RELOC_NONE, 0

View File

@ -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;