GAS ARM: Warn if the user creates a symbol with the same name as an instruction.
authorNick Clifton <nickc@redhat.com>
Thu, 30 Apr 2015 10:17:55 +0000 (11:17 +0100)
committerNick Clifton <nickc@redhat.com>
Thu, 30 Apr 2015 10:17:55 +0000 (11:17 +0100)
PR gas/18347
gas * config/tc-arm.c (md_undefined_symbol): Issue a warning message
(if enabled) when the user creates a symbol with the same name as
an ARM instruction.
(flag_warn_syms): New static variable.
(arm_opts): Add mwarn-syms and mno-warn-syms.
* doc/c-arm.texi (ARM Options): Document the -m[no-]warn-syms
options.

tests * gas/arm/pr18347.s: New file: Test case.
* gas/arm/pr18347.l: New file: Expected assembler output.
* gas/arm/pr18347.d: New file: Test driver.

gas/ChangeLog
gas/config/tc-arm.c
gas/doc/c-arm.texi
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/pr18347.d [new file with mode: 0644]
gas/testsuite/gas/arm/pr18347.l [new file with mode: 0644]
gas/testsuite/gas/arm/pr18347.s [new file with mode: 0644]

index 062e13d..9764a24 100644 (file)
@@ -1,5 +1,14 @@
 2015-04-30  Nick Clifton  <nickc@redhat.com>
 
+       PR gas/18347
+       * config/tc-arm.c (md_undefined_symbol): Issue a warning message
+       (if enabled) when the user creates a symbol with the same name as
+       an ARM instruction.
+       (flag_warn_syms): New static variable.
+       (arm_opts): Add mwarn-syms and mno-warn-syms.
+       * doc/c-arm.texi (ARM Options): Document the -m[no-]warn-syms
+       options.
+
        PR gas/18353
        * doc/as.texinfo (Zero): Add documentation of the .zero pseudo-op.
 
index bc8f775..2f6fea6 100644 (file)
@@ -21623,6 +21623,8 @@ md_pcrel_from_section (fixS * fixP, segT seg)
     }
 }
 
+static bfd_boolean flag_warn_syms = TRUE;
+
 /* Under ELF we need to default _GLOBAL_OFFSET_TABLE.
    Otherwise we have no need to default values of symbols.  */
 
@@ -21646,6 +21648,52 @@ md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
     }
 #endif
 
+  /* PR 18347 - Warn if the user attempts to create a symbol with the same
+     name as an ARM instruction.  Whilst strictly speaking it is allowed, it
+     does mean that the resulting code might be very confusing to the reader.
+     Also this warning can be triggered if the user omits an operand before
+     an immediate address, eg:
+
+       LDR =foo
+
+     GAS treats this as an assignment of the value of the symbol foo to a
+     symbol LDR, and so (without this code) it will not issue any kind of
+     warning or error message.
+
+     Note - ARM instructions are case-insensitive but the strings in the hash
+     table are all stored in lower case, so we must first ensure that name is
+     lower case too.
+
+     Some names are problematical.  Several gas tests for example use:
+
+       b:
+
+     as a label, but of course this matches the branch instruction.  For now
+     we punt and only check names longer than 1.
+
+     FIXME: Should this be made into generic code for all targets ?  */
+  if (flag_warn_syms && arm_ops_hsh && strlen (name) > 1)
+    {
+      char * nbuf = strdup (name);
+      char * p;
+
+      for (p = nbuf; *p; p++)
+       *p = TOLOWER (*p);
+      if (hash_find (arm_ops_hsh, nbuf) != NULL)
+       {
+         static struct hash_control * already_warned = NULL;
+
+         if (already_warned == NULL)
+           already_warned = hash_new ();
+         /* Only warn about the symbol once.  To keep the code
+            simple we let hash_insert do the lookup for us.  */
+         if (hash_insert (already_warned, name, NULL) == NULL)
+           as_warn (_("[-mwarn-syms]: Symbol '%s' matches an ARM instruction - is this intentional ?"), name);
+       }
+      else
+       free (nbuf);
+    }
+  
   return NULL;
 }
 
@@ -24116,6 +24164,7 @@ md_begin (void)
              -mthumb-interwork          Code supports ARM/Thumb interworking
 
              -m[no-]warn-deprecated     Warn about deprecated features
+             -m[no-]warn-syms           Warn when symbols match instructions
 
       For now we will also provide support for:
 
@@ -24184,6 +24233,7 @@ struct option md_longopts[] =
   {NULL, no_argument, NULL, 0}
 };
 
+
 size_t md_longopts_size = sizeof (md_longopts);
 
 struct arm_option_table
@@ -24218,6 +24268,8 @@ struct arm_option_table arm_opts[] =
   {"mwarn-deprecated", NULL, &warn_on_deprecated, 1, NULL},
   {"mno-warn-deprecated", N_("do not warn on use of deprecated feature"),
    &warn_on_deprecated, 0, NULL},
+  {"mwarn-syms", N_("warn about symbols that match instruction names [default]"), (int *) (& flag_warn_syms), TRUE, NULL},
+  {"mno-warn-syms", N_("disable warnings about symobls that match instructions"), (int *) (& flag_warn_syms), FALSE, NULL},
   {NULL, NULL, NULL, 0, NULL}
 };
 
index f07aa62..d31ba02 100644 (file)
@@ -394,6 +394,12 @@ features.  The default is to warn.
 @item -mccs
 Turns on CodeComposer Studio assembly syntax compatibility mode.
 
+@cindex @code{-mwarn-syms} command line option, ARM
+@item -mwarn-syms
+@itemx -mno-warn-syms
+Enable or disable warnings about symbols that match the names of ARM
+instructions.  The default is to warn.
+
 @end table
 
 
index aed518a..6608a80 100644 (file)
@@ -1,3 +1,10 @@
+2015-04-30  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/18347
+       * gas/arm/pr18347.s: New file: Test case.
+       * gas/arm/pr18347.l: New file: Expected assembler output.
+       * gas/arm/pr18347.d: New file: Test driver.
+
 2015-04-29  Nick Clifton  <nickc@redhat.com>
 
        PR gas/18265
diff --git a/gas/testsuite/gas/arm/pr18347.d b/gas/testsuite/gas/arm/pr18347.d
new file mode 100644 (file)
index 0000000..b9f042a
--- /dev/null
@@ -0,0 +1,3 @@
+# name: PR18347 - GAS silently ignores a misconstructed LDR instruction
+#as:
+#error-output: pr18347.l
diff --git a/gas/testsuite/gas/arm/pr18347.l b/gas/testsuite/gas/arm/pr18347.l
new file mode 100644 (file)
index 0000000..12e223d
--- /dev/null
@@ -0,0 +1,2 @@
+[^:]*: Assembler messages:
+[^:]*:2: Warning: \[-mwarn-syms\]: Symbol 'LDR' matches an ARM instruction - is this intentional \?
diff --git a/gas/testsuite/gas/arm/pr18347.s b/gas/testsuite/gas/arm/pr18347.s
new file mode 100644 (file)
index 0000000..ac22b45
--- /dev/null
@@ -0,0 +1,3 @@
+    MOV r1, r0
+    LDR =garbage // no destination register
+    MOV r2, r3