+2016-04-07 Nick Clifton <nickc@redhat.com>
+
+ PR gas/19910
+ * config/tc-sparc.c (sparc_ip): Report an error if the expression
+ inside a %-macro could not be fully parsed.
+ * expr.c (integer_constant): Accept and ignore U suffixes to
+ integers.
+ (operand): When a missing closing parenthesis is encountered,
+ report the character that was found instead.
+ * testsuite/gas/mips/tls-ill.l: Update expected error message.
+ * testsuite/gas/sparc/pr19910-1.d: New test driver.
+ * testsuite/gas/sparc/pr19910-1.s: New test.
+ * testsuite/gas/sparc/pr19910-2.l: Expected error output.
+ * testsuite/gas/sparc/pr19910-2.s: New test.
+ * testsuite/gas/sparc/sparc.exp: Run the new tests.
+
2016-04-06 Nick Clifton <nickc@redhat.com>
* config/tc-msp430.c (msp430_operands): Check for a NOP preceding
*s1 = '\0';
(void) get_expression (s);
*s1 = ')';
+ if (expr_end != s1)
+ {
+ as_bad (_("Expression inside %%%s could not be parsed"), op_arg);
+ return special_case;
+ }
s = s1 + 1;
if (*s == ',' || *s == ']' || !*s)
continue;
&& input_line_pointer - 1 == suffix)
c = *input_line_pointer++;
+#ifndef tc_allow_U_suffix
+#define tc_allow_U_suffix 1
+#endif
+ /* PR 19910: Look for, and ignore, a U suffix to the number. */
+ if (tc_allow_U_suffix && (c == 'U' || c == 'u'))
+ c = * input_line_pointer++;
+
if (small)
{
/* Here with number, in correct radix. c is the next char.
/* expression () will pass trailing whitespace. */
if ((c == '(' && *input_line_pointer != ')')
|| (c == '[' && *input_line_pointer != ']'))
- as_bad (_("missing '%c'"), c == '(' ? ')' : ']');
+ {
+ if (* input_line_pointer)
+ as_bad (_("found '%c', expected: '%c'"),
+ * input_line_pointer, c == '(' ? ')' : ']');
+ else
+ as_bad (_("missing '%c'"), c == '(' ? ')' : ']');
+ }
else
input_line_pointer++;
SKIP_WHITESPACE ();
.*:7: Error: bad expression
.*:7: Error: invalid operands `addiu \$4,\$28,%tprel\(tlsvar\)'
.*:8: Error: bad expression
-.*:8: Error: missing '\)'
+.*:8: Error: found 'g', expected: '\)'
.*:8: Error: invalid operands `addiu \$4,\$28,%lo\(%gottprel\(tlsvar\)\)'
.*:9: Error: bad expression
-.*:9: Error: missing '\)'
+.*:9: Error: found 'g', expected: '\)'
.*:9: Error: invalid operands `addiu \$4,\$28,%hi\(%gottprel\(tlsvar\)\)'
--- /dev/null
+#as:
+#objdump: -dr --prefix-addresses
+#name: PR19910 - make sure that U suffix is accepted
+
+.*: +file format .*
+
+Disassembly of section .text:
+0x0+000 sethi[ ]+%hi\(0x4000\), %g1
+0x0+004 mov[ ]+0x40, %g1
+0x0+008 mov[ ]+4, %g1
--- /dev/null
+ # U suffix should not trigger an error.
+ sethi %hi(0x4000U), %g1
+
+ # U suffix should not prevent evaluation of the expression.
+ or %g0, %lo(0x400U + 0x40U), %g1
+
+ # U suffix should not confuse multiple layers of parentheses.
+ or %g0, %lo((0x4000U + 0x4U)), %g1
--- /dev/null
+.*pr19910-2.s: Assembler messages:
+.*pr19910-2.s:2: Error: Expression inside %hi could not be parsed
+.*pr19910-2.s:5: Error: found 'V', expected: '\)'
+.*pr19910-2.s:5: Error: Expression inside %lo could not be parsed
--- /dev/null
+ # Mistyping V instead of U should trigger an error message
+ sethi %hi(0x4000V), %g1
+
+ # A different error can be expected when there are multiple layers of parentheses.
+ or %g0, %lo((0x4000V + 0x4U)), %g1
run_dump_test "natural-32"
run_list_test "pr4587" ""
+
+ run_dump_test "pr19910-1"
+ run_list_test "pr19910-2"
}
if [istarget sparc-*-vxworks*] {