Fix typo
[deliverable/binutils-gdb.git] / gas / symbols.c
index d1c7ad3021bdded21b1e94b3662db233d5eb9705..ebcad5bf21b564a4d837879f555c45813fa3a392 100644 (file)
@@ -17,8 +17,8 @@
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to the Free
-   Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-   02111-1307, USA.  */
+   Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
+   02110-1301, USA.  */
 
 /* #define DEBUG_SYMS / * to debug symbol list maintenance.  */
 
@@ -113,11 +113,6 @@ save_symbol_name (const char *name)
   obstack_grow (&notes, name, name_length);
   ret = obstack_finish (&notes);
 
-#ifdef STRIP_UNDERSCORE
-  if (ret[0] == '_')
-    ++ret;
-#endif
-
 #ifdef tc_canonicalize_symbol_name
   ret = tc_canonicalize_symbol_name (ret);
 #endif
@@ -202,7 +197,7 @@ static unsigned long local_symbol_conversion_count;
 
 /* Create a local symbol and insert it into the local hash table.  */
 
-struct local_symbol *
+static struct local_symbol *
 local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
 {
   char *name_copy;
@@ -599,16 +594,6 @@ symbol_temp_make (void)
    Out:        NULL if the name was not in the symbol table, else the address
    of a struct symbol associated with that name.  */
 
-symbolS *
-symbol_find (const char *name)
-{
-#ifdef STRIP_UNDERSCORE
-  return (symbol_find_base (name, 1));
-#else /* STRIP_UNDERSCORE */
-  return (symbol_find_base (name, 0));
-#endif /* STRIP_UNDERSCORE */
-}
-
 symbolS *
 symbol_find_exact (const char *name)
 {
@@ -626,11 +611,8 @@ symbol_find_exact (const char *name)
 }
 
 symbolS *
-symbol_find_base (const char *name, int strip_underscore)
+symbol_find (const char *name)
 {
-  if (strip_underscore && *name == '_')
-    name++;
-
 #ifdef tc_canonicalize_symbol_name
   {
     char *copy;
@@ -812,19 +794,6 @@ verify_symbol_chain (symbolS *rootP, symbolS *lastP)
   assert (lastP == symbolP);
 }
 
-void
-verify_symbol_chain_2 (symbolS *sym)
-{
-  symbolS *p = sym, *n = sym;
-#ifdef SYMBOLS_NEED_BACKPOINTERS
-  while (symbol_previous (p))
-    p = symbol_previous (p);
-#endif
-  while (symbol_next (n))
-    n = symbol_next (n);
-  verify_symbol_chain (p, n);
-}
-
 static void
 report_op_error (symbolS *symp, symbolS *left, symbolS *right)
 {
@@ -937,6 +906,7 @@ resolve_symbol_value (symbolS *symp)
       offsetT left, right;
       segT seg_left, seg_right;
       operatorT op;
+      int move_seg_ok;
 
       symp->sy_resolving = 1;
 
@@ -1122,18 +1092,15 @@ resolve_symbol_value (symbolS *symp)
                }
            }
 
+         move_seg_ok = 1;
          /* Equality and non-equality tests are permitted on anything.
             Subtraction, and other comparison operators are permitted if
             both operands are in the same section.  Otherwise, both
             operands must be absolute.  We already handled the case of
             addition or subtraction of a constant above.  This will
             probably need to be changed for an object file format which
-            supports arbitrary expressions, such as IEEE-695.
-
-            Don't emit messages unless we're finalizing the symbol value,
-            otherwise we may get the same message multiple times.  */
-         if (finalize_syms
-             && !(seg_left == absolute_section
+            supports arbitrary expressions, such as IEEE-695.  */
+         if (!(seg_left == absolute_section
                   && seg_right == absolute_section)
              && !(op == O_eq || op == O_ne)
              && !((op == O_subtract
@@ -1141,9 +1108,21 @@ resolve_symbol_value (symbolS *symp)
                   && seg_left == seg_right
                   && (seg_left != undefined_section
                       || add_symbol == op_symbol)))
-           report_op_error (symp, add_symbol, op_symbol);
+           {
+             /* Don't emit messages unless we're finalizing the symbol value,
+                otherwise we may get the same message multiple times.  */
+             if (finalize_syms)
+               report_op_error (symp, add_symbol, op_symbol);
+             /* However do not move the symbol into the absolute section
+                if it cannot currently be resolved - this would confuse
+                other parts of the assembler into believing that the
+                expression had been evaluated to zero.  */
+             else
+               move_seg_ok = 0;
+           }
 
-         if (final_seg == expr_section || final_seg == undefined_section)
+         if (move_seg_ok
+             && (final_seg == expr_section || final_seg == undefined_section))
            final_seg = absolute_section;
 
          /* Check for division by zero.  */
@@ -1561,13 +1540,11 @@ fb_label_name (long n,  /* We just saw "n:", "nf" or "nb" : n a number.  */
   char symbol_name_temporary[20];      /* Build up a number, BACKWARDS.  */
 
   know (n >= 0);
-  know (
 #ifdef TC_MMIX
-       (unsigned long) augend <= 2 /* See mmix_fb_label.  */
+  know ((unsigned long) augend <= 2 /* See mmix_fb_label.  */);
 #else
-       (unsigned long) augend <= 1
+  know ((unsigned long) augend <= 1);
 #endif
-       );
   p = symbol_name_build;
 #ifdef LOCAL_LABEL_PREFIX
   *p++ = LOCAL_LABEL_PREFIX;
@@ -1842,12 +1819,6 @@ S_IS_LOCAL (symbolS *s)
                          && name[1] == '?')))));
 }
 
-int
-S_IS_EXTERN (symbolS *s)
-{
-  return S_IS_EXTERNAL (s);
-}
-
 int
 S_IS_STABD (symbolS *s)
 {
@@ -2024,6 +1995,19 @@ symbol_set_value_expression (symbolS *s, const expressionS *exp)
   s->sy_value = *exp;
 }
 
+/* Return a pointer to the X_add_number component of a symbol.  */
+
+offsetT *
+symbol_X_add_number (symbolS *s)
+{
+#ifdef BFD_ASSEMBLER
+  if (LOCAL_SYMBOL_CHECK (s))
+    return (offsetT *) &((struct local_symbol *) s)->lsy_value;
+#endif
+
+  return &s->sy_value.X_add_number;
+}
+
 /* Set the value of SYM to the current position in the current segment.  */
 
 void
@@ -2374,7 +2358,7 @@ int indent_level;
 
 /* Maximum indent level.
    Available for modification inside a gdb session.  */
-int max_indent_level = 8;
+static int max_indent_level = 8;
 
 void
 print_symbol_value_1 (FILE *file, symbolS *sym)
@@ -2412,7 +2396,7 @@ print_symbol_value_1 (FILE *file, symbolS *sym)
        fprintf (file, " used");
       if (S_IS_LOCAL (sym))
        fprintf (file, " local");
-      if (S_IS_EXTERN (sym))
+      if (S_IS_EXTERNAL (sym))
        fprintf (file, " extern");
       if (S_IS_DEBUG (sym))
        fprintf (file, " debug");
This page took 0.02828 seconds and 4 git commands to generate.