Ensure that %func() expressions are outermost terms

This is to avoid expressions like:  %hi(foo) + 1, which will
not do what you expect.  The complex relocations can handle it,
but the internal fixups can't.
This commit is contained in:
DJ Delorie
2014-01-21 15:12:19 -05:00
parent 4869db5e97
commit c9d665580e
2 changed files with 42 additions and 1 deletions

View File

@ -1,3 +1,10 @@
2014-01-21 DJ Delorie <dj@redhat.com>
* config/tc-rl78.c (require_end_of_expr): New.
(md_operand): Call it.
(rl78_cons_fix_new): Mark LO16, HI16, ahd HI8 internal relocations
as not overflowing.
2014-01-17 Will Newton <will.newton@linaro.org>
* config/tc-arm.c (do_vfp_nsyn_cvt_fpv8): Set OP to 1

View File

@ -347,6 +347,23 @@ md_number_to_chars (char * buf, valueT val, int n)
number_to_chars_littleendian (buf, val, n);
}
static void
require_end_of_expr (char *fname)
{
while (* input_line_pointer == ' '
|| * input_line_pointer == '\t')
input_line_pointer ++;
if (! * input_line_pointer
|| strchr ("\n\r,", * input_line_pointer)
|| strchr (comment_chars, * input_line_pointer)
|| strchr (line_comment_chars, * input_line_pointer)
|| strchr (line_separator_chars, * input_line_pointer))
return;
as_bad (_("%%%s() must be outermost term in expression"), fname);
}
static struct
{
char * fname;
@ -388,6 +405,8 @@ md_operand (expressionS * exp ATTRIBUTE_UNUSED)
input_line_pointer ++;
exp->X_md = reloc;
require_end_of_expr (reloc_functions[i].fname);
}
void
@ -552,6 +571,7 @@ rl78_cons_fix_new (fragS * frag,
expressionS * exp)
{
bfd_reloc_code_real_type type;
fixS *fixP;
switch (size)
{
@ -601,7 +621,21 @@ rl78_cons_fix_new (fragS * frag,
type = BFD_RELOC_RL78_DIFF;
}
fix_new_exp (frag, where, (int) size, exp, 0, type);
fixP = fix_new_exp (frag, where, (int) size, exp, 0, type);
switch (exp->X_md)
{
/* These are intended to have values larger than the container,
since the backend puts only the portion we need in it.
However, we don't have a backend-specific reloc for them as
they're handled with complex relocations. */
case BFD_RELOC_RL78_LO16:
case BFD_RELOC_RL78_HI16:
case BFD_RELOC_RL78_HI8:
fixP->fx_no_overflow = 1;
break;
default:
break;
}
}
/* No relaxation just yet */