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. */
obstack_grow (¬es, name, name_length);
ret = obstack_finish (¬es);
-#ifdef STRIP_UNDERSCORE
- if (ret[0] == '_')
- ++ret;
-#endif
-
#ifdef tc_canonicalize_symbol_name
ret = tc_canonicalize_symbol_name (ret);
#endif
/* 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;
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)
{
}
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;
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)
{
offsetT left, right;
segT seg_left, seg_right;
operatorT op;
+ int move_seg_ok;
symp->sy_resolving = 1;
}
}
+ 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
&& 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. */
&& name[1] == '?')))));
}
-int
-S_IS_EXTERN (symbolS *s)
-{
- return S_IS_EXTERNAL (s);
-}
-
int
S_IS_STABD (symbolS *s)
{
/* Return a pointer to the X_add_number component of a symbol. */
-valueT *
+offsetT *
symbol_X_add_number (symbolS *s)
{
#ifdef BFD_ASSEMBLER
if (LOCAL_SYMBOL_CHECK (s))
- return &((struct local_symbol *) s)->lsy_value;
+ return (offsetT *) &((struct local_symbol *) s)->lsy_value;
#endif
- return (valueT *)&s->sy_value.X_add_number;
+ return &s->sy_value.X_add_number;
}
/* Set the value of SYM to the current position in the current segment. */
/* 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)
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");