This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] ARM gas: handle {...} operands in macros


On 28/05/13 20:18, Roland McGrath wrote:
Here's another case where the presumptions about whitespace stripping don't
mesh with macros quite right.  There may be more cases affected; I didn't
try to add test cases for all of them.

OK for trunk and 2.23?



This seems all wrong to me. If you're having to pretend that all these special characters are symbol characters, then something else must be fundamentally wrong. That makes this patch a crutch for something else that's broken.

I think you need to dig further into why macros aren't working properly. Is it the implementation of macros, the documentation, or your expectations that are wrong?

R.

Thanks,
Roland


gas/
2013-05-28  Roland McGrath  <mcgrathr@google.com>

	* config/tc-arm.c (arm_symbol_chars): Include '{' and '}'.
	(arm_reg_parse_multi): Skip whitespace first.

gas/testsuite/
2013-05-28  Roland McGrath  <mcgrathr@google.com>

	* gas/arm/macro-pld.s: Add a 'push {r0}' case.
	* gas/arm/macro-pld.d: Update expected output.
	* gas/arm/macro-vld1.s: New file.
	* gas/arm/macro-vld1.d: New file.

--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -323,8 +323,9 @@ static bfd_boolean unified_syntax = FALSE;

  /* An immediate operand can start with #, and ld*, st*, pld operands
     can contain [ and ].  We need to tell APP not to elide whitespace
-   before a [, which can appear as the first operand for pld.  */
-const char arm_symbol_chars[] = "#[]";
+   before a [, which can appear as the first operand for pld.
+   Likewise, a { can appear as the first operand for push, pop, vld*, etc.  */
+const char arm_symbol_chars[] = "#[]{}";

  enum neon_el_type
  {
@@ -1158,6 +1159,8 @@ arm_reg_parse_multi (char **ccp)
    char *p;
    struct reg_entry *reg;

+  skip_whitespace (start);
+
  #ifdef REGISTER_PREFIX
    if (*start != REGISTER_PREFIX)
      return NULL;
--- a/gas/testsuite/gas/arm/macro-pld.d
+++ b/gas/testsuite/gas/arm/macro-pld.d
@@ -6,3 +6,4 @@ Disassembly of section \.text:

  0+ <.*>:
  \s*0:\s+f5d0f000\s+pld\s+\[r0\]
+\s*4:\s+e52d0004\s+push\s+{r0}\s*.*
--- a/gas/testsuite/gas/arm/macro-pld.s
+++ b/gas/testsuite/gas/arm/macro-pld.s
@@ -2,3 +2,4 @@
  	\rest
  .endm
  	foo r0, pld [r0]
+	foo r0, push {r0}
--- /dev/null
+++ b/gas/testsuite/gas/arm/macro-vld1.d
@@ -0,0 +1,8 @@
+#objdump: -dr
+
+.*:     file format .*
+
+Disassembly of section \.text:
+
+0+ <.*>:
+\s*0:\s+f420070f\s+vld1.8\s+{d0},\s*\[r0\]
--- /dev/null
+++ b/gas/testsuite/gas/arm/macro-vld1.s
@@ -0,0 +1,9 @@
+	.fpu neon
+        .macro sfi_breg basereg, insn, operands:vararg
+                .macro _sfi_breg_doit B
+                \insn \operands
+                .endm
+                _sfi_breg_doit \basereg
+                .purgem _sfi_breg_doit
+        .endm
+	sfi_breg r0, vld1.8 {d0}, [\B]






Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]