Mention symbol name in non-constant .size expression.
authorH.J. Lu <hjl.tools@gmail.com>
Sun, 6 Mar 2011 14:05:25 +0000 (14:05 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Sun, 6 Mar 2011 14:05:25 +0000 (14:05 +0000)
gas/

2011-03-05  H.J. Lu  <hongjiu.lu@intel.com>

* config/obj-elf.c (elf_frob_symbol): Mention symbol name in
non-constant .size expression.

gas/testsuite/

2011-03-05  H.J. Lu  <hongjiu.lu@intel.com>

* gas/elf/bad-size.err: Updated.

gas/ChangeLog
gas/config/obj-elf.c
gas/testsuite/ChangeLog
gas/testsuite/gas/elf/bad-size.err

index f53dd03ff2e3335a3cd153dff4307eeb22573535..cb5cfa67b0e0979938aa1128769bc1e48d24947e 100644 (file)
@@ -1,3 +1,8 @@
+2011-03-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/obj-elf.c (elf_frob_symbol): Mention symbol name in
+       non-constant .size expression.
+
 2011-03-02  Nick Clifton  <nickc@redhat.com>
 
        * ecoff.c: Incldue filenames.h
index 969a5091e8e8f70f1e17214d98a68bd65aef9d80..d43409a2f86fc8b58bb0af57d53d2b2caa1e44d0 100644 (file)
@@ -1879,6 +1879,7 @@ void
 elf_frob_symbol (symbolS *symp, int *puntp)
 {
   struct elf_obj_sy *sy_obj;
+  expressionS *size;
 
 #ifdef NEED_ECOFF_DEBUG
   if (ECOFF_DEBUGGING)
@@ -1887,13 +1888,50 @@ elf_frob_symbol (symbolS *symp, int *puntp)
 
   sy_obj = symbol_get_obj (symp);
 
-  if (sy_obj->size != NULL)
+  size = sy_obj->size;
+  if (size != NULL)
     {
-      if (resolve_expression (sy_obj->size)
-         && sy_obj->size->X_op == O_constant)
-       S_SET_SIZE (symp, sy_obj->size->X_add_number);
+      if (resolve_expression (size)
+         && size->X_op == O_constant)
+       S_SET_SIZE (symp, size->X_add_number);
       else
-       as_bad (_(".size expression does not evaluate to a constant"));
+       {
+         const char *op_name = NULL;
+         const char *add_name = NULL;
+
+         if (size->X_op == O_subtract)
+           {
+             op_name = S_GET_NAME (size->X_op_symbol);
+             add_name = S_GET_NAME (size->X_add_symbol);
+             if (strcmp (op_name, FAKE_LABEL_NAME) == 0)
+               op_name = NULL;
+             if (strcmp (add_name, FAKE_LABEL_NAME) == 0)
+               add_name = NULL;
+
+             if (op_name && add_name)
+               as_bad (_(".size expression with symbols `%s' and `%s' "
+                         "does not evaluate to a constant"),
+                       op_name, add_name);
+             else
+               {
+                 const char *name;
+
+                 if (op_name)
+                   name = op_name;
+                 else if (add_name)
+                   name = add_name;
+                 else
+                   name = NULL;
+
+                 if (name)
+                   as_bad (_(".size expression with symbol `%s' "
+                             "does not evaluate to a constant"), name);
+               }
+           }
+         
+         if (!op_name && !add_name)
+           as_bad (_(".size expression does not evaluate to a constant"));
+       }
       free (sy_obj->size);
       sy_obj->size = NULL;
     }
index c4fbd0a2e106a06e27cbf7e1d5e05369d6b28bdd..da5243e84dc5ed357bb42e80c8f817e8bb440722 100644 (file)
@@ -1,3 +1,7 @@
+2011-03-05  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * gas/elf/bad-size.err: Updated.
+
 2011-02-28  Maciej W. Rozycki  <macro@codesourcery.com>
 
        * gas/mips/alnv_ps-swap.d: New test for ALNV.PS instruction
index 5e01ef273e17c275560aeebd486a0de2dfd90d89..a5bfc31f35623342485c300653fcc882b4de3154 100644 (file)
@@ -1,2 +1,2 @@
 .*bad-size\.s: Assembler messages:
-.*bad-size\.s:6: Error: .*
+.*bad-size\.s:6: Error:.*`_test_nop'.*