bfd/
[deliverable/binutils-gdb.git] / gas / symbols.c
CommitLineData
252b5132 1/* symbols.c -symbol table-
f7e42eb4 2 Copyright 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
a76903bf 3 1999, 2000, 2001, 2002, 2003, 2004, 2005
252b5132
RH
4 Free Software Foundation, Inc.
5
6 This file is part of GAS, the GNU Assembler.
7
8 GAS is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2, or (at your option)
11 any later version.
12
13 GAS is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GAS; see the file COPYING. If not, write to the Free
4b4da160
NC
20 Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
252b5132 22
7c743825 23/* #define DEBUG_SYMS / * to debug symbol list maintenance. */
252b5132 24
252b5132
RH
25#include "as.h"
26
3882b010 27#include "safe-ctype.h"
252b5132
RH
28#include "obstack.h" /* For "symbols.h" */
29#include "subsegs.h"
30
49309057
ILT
31#include "struc-symbol.h"
32
252b5132
RH
33/* This is non-zero if symbols are case sensitive, which is the
34 default. */
35int symbols_case_sensitive = 1;
36
37#ifndef WORKING_DOT_WORD
38extern int new_broken_words;
39#endif
40
41/* symbol-name => struct symbol pointer */
42static struct hash_control *sy_hash;
43
49309057
ILT
44/* Table of local symbols. */
45static struct hash_control *local_hash;
46
7c743825 47/* Below are commented in "symbols.h". */
252b5132
RH
48symbolS *symbol_rootP;
49symbolS *symbol_lastP;
50symbolS abs_symbol;
51
52#ifdef DEBUG_SYMS
53#define debug_verify_symchain verify_symbol_chain
54#else
55#define debug_verify_symchain(root, last) ((void) 0)
56#endif
57
aa257fcd
NC
58#define DOLLAR_LABEL_CHAR '\001'
59#define LOCAL_LABEL_CHAR '\002'
60
252b5132 61struct obstack notes;
977cdf5a
NC
62#ifdef USE_UNIQUE
63/* The name of an external symbol which is
64 used to make weak PE symbol names unique. */
65const char * an_external_name;
66#endif
252b5132 67
74937d39
KH
68static char *save_symbol_name (const char *);
69static void fb_label_init (void);
70static long dollar_label_instance (long);
71static long fb_label_instance (long);
252b5132 72
74937d39
KH
73static void print_binary (FILE *, const char *, expressionS *);
74static void report_op_error (symbolS *, symbolS *, symbolS *);
252b5132 75
7c743825 76/* Return a pointer to a new symbol. Die if we can't make a new
252b5132
RH
77 symbol. Fill in the symbol's values. Add symbol to end of symbol
78 chain.
7c743825 79
252b5132
RH
80 This function should be called in the general case of creating a
81 symbol. However, if the output file symbol table has already been
82 set, and you are certain that this symbol won't be wanted in the
83 output file, you can call symbol_create. */
84
85symbolS *
74937d39 86symbol_new (const char *name, segT segment, valueT valu, fragS *frag)
252b5132
RH
87{
88 symbolS *symbolP = symbol_create (name, segment, valu, frag);
89
7c743825 90 /* Link to end of symbol chain. */
252b5132
RH
91 {
92 extern int symbol_table_frozen;
93 if (symbol_table_frozen)
94 abort ();
95 }
252b5132
RH
96 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
97
98 return symbolP;
99}
100
49309057
ILT
101/* Save a symbol name on a permanent obstack, and convert it according
102 to the object file format. */
103
104static char *
74937d39 105save_symbol_name (const char *name)
252b5132
RH
106{
107 unsigned int name_length;
49309057 108 char *ret;
252b5132 109
7c743825 110 name_length = strlen (name) + 1; /* +1 for \0. */
252b5132 111 obstack_grow (&notes, name, name_length);
49309057
ILT
112 ret = obstack_finish (&notes);
113
252b5132 114#ifdef tc_canonicalize_symbol_name
49309057 115 ret = tc_canonicalize_symbol_name (ret);
252b5132
RH
116#endif
117
118 if (! symbols_case_sensitive)
119 {
3882b010 120 char *s;
252b5132 121
3882b010
L
122 for (s = ret; *s != '\0'; s++)
123 *s = TOUPPER (*s);
252b5132
RH
124 }
125
49309057
ILT
126 return ret;
127}
128
129symbolS *
74937d39
KH
130symbol_create (const char *name, /* It is copied, the caller can destroy/modify. */
131 segT segment, /* Segment identifier (SEG_<something>). */
132 valueT valu, /* Symbol value. */
133 fragS *frag /* Associated fragment. */)
49309057
ILT
134{
135 char *preserved_copy_of_name;
136 symbolS *symbolP;
137
138 preserved_copy_of_name = save_symbol_name (name);
139
252b5132
RH
140 symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
141
7c743825 142 /* symbol must be born in some fixed state. This seems as good as any. */
252b5132
RH
143 memset (symbolP, 0, sizeof (symbolS));
144
252b5132
RH
145 symbolP->bsym = bfd_make_empty_symbol (stdoutput);
146 if (symbolP->bsym == NULL)
147 as_perror ("%s", "bfd_make_empty_symbol");
148 symbolP->bsym->udata.p = (PTR) symbolP;
252b5132
RH
149 S_SET_NAME (symbolP, preserved_copy_of_name);
150
151 S_SET_SEGMENT (symbolP, segment);
152 S_SET_VALUE (symbolP, valu);
153 symbol_clear_list_pointers (symbolP);
154
155 symbolP->sy_frag = frag;
252b5132
RH
156
157 obj_symbol_new_hook (symbolP);
158
159#ifdef tc_symbol_new_hook
160 tc_symbol_new_hook (symbolP);
161#endif
162
163 return symbolP;
164}
165\f
49309057
ILT
166
167/* Local symbol support. If we can get away with it, we keep only a
168 small amount of information for local symbols. */
169
74937d39 170static symbolS *local_symbol_convert (struct local_symbol *);
49309057
ILT
171
172/* Used for statistics. */
173
174static unsigned long local_symbol_count;
175static unsigned long local_symbol_conversion_count;
176
177/* This macro is called with a symbol argument passed by reference.
178 It returns whether this is a local symbol. If necessary, it
179 changes its argument to the real symbol. */
180
181#define LOCAL_SYMBOL_CHECK(s) \
182 (s->bsym == NULL \
183 ? (local_symbol_converted_p ((struct local_symbol *) s) \
184 ? (s = local_symbol_get_real_symbol ((struct local_symbol *) s), \
185 0) \
186 : 1) \
187 : 0)
188
189/* Create a local symbol and insert it into the local hash table. */
190
87c245cc 191static struct local_symbol *
74937d39 192local_symbol_make (const char *name, segT section, valueT value, fragS *frag)
49309057
ILT
193{
194 char *name_copy;
195 struct local_symbol *ret;
196
197 ++local_symbol_count;
198
199 name_copy = save_symbol_name (name);
200
201 ret = (struct local_symbol *) obstack_alloc (&notes, sizeof *ret);
202 ret->lsy_marker = NULL;
203 ret->lsy_name = name_copy;
204 ret->lsy_section = section;
205 local_symbol_set_frag (ret, frag);
bd780143 206 ret->lsy_value = value;
49309057
ILT
207
208 hash_jam (local_hash, name_copy, (PTR) ret);
209
210 return ret;
211}
212
213/* Convert a local symbol into a real symbol. Note that we do not
214 reclaim the space used by the local symbol. */
215
216static symbolS *
74937d39 217local_symbol_convert (struct local_symbol *locsym)
49309057
ILT
218{
219 symbolS *ret;
220
221 assert (locsym->lsy_marker == NULL);
222 if (local_symbol_converted_p (locsym))
223 return local_symbol_get_real_symbol (locsym);
224
225 ++local_symbol_conversion_count;
226
bd780143 227 ret = symbol_new (locsym->lsy_name, locsym->lsy_section, locsym->lsy_value,
49309057
ILT
228 local_symbol_get_frag (locsym));
229
230 if (local_symbol_resolved_p (locsym))
231 ret->sy_resolved = 1;
232
233 /* Local symbols are always either defined or used. */
234 ret->sy_used = 1;
235
8c5e1ccd
AO
236#ifdef TC_LOCAL_SYMFIELD_CONVERT
237 TC_LOCAL_SYMFIELD_CONVERT (locsym, ret);
238#endif
239
49309057
ILT
240 symbol_table_insert (ret);
241
242 local_symbol_mark_converted (locsym);
243 local_symbol_set_real_symbol (locsym, ret);
244
245 hash_jam (local_hash, locsym->lsy_name, NULL);
246
247 return ret;
248}
49309057 249\f
7c743825
KH
250/* We have just seen "<name>:".
251 Creates a struct symbol unless it already exists.
252
253 Gripes if we are redefining a symbol incompatibly (and ignores it). */
252b5132 254
252b5132 255symbolS *
74937d39
KH
256colon (/* Just seen "x:" - rattle symbols & frags. */
257 const char *sym_name /* Symbol name, as a cannonical string. */
258 /* We copy this string: OK to alter later. */)
252b5132 259{
7c743825 260 register symbolS *symbolP; /* Symbol we are working with. */
252b5132 261
7cf10893 262 /* Sun local labels go out of scope whenever a non-local symbol is
252b5132 263 defined. */
7be1c489
AM
264 if (LOCAL_LABELS_DOLLAR
265 && !bfd_is_local_label_name (stdoutput, sym_name))
266 dollar_label_clear ();
252b5132
RH
267
268#ifndef WORKING_DOT_WORD
269 if (new_broken_words)
270 {
271 struct broken_word *a;
272 int possible_bytes;
273 fragS *frag_tmp;
274 char *frag_opcode;
275
7cf10893
NC
276 if (now_seg == absolute_section)
277 {
278 as_bad (_("cannot define symbol `%s' in absolute section"), sym_name);
279 return NULL;
280 }
1d3b2b27 281
252b5132
RH
282 possible_bytes = (md_short_jump_size
283 + new_broken_words * md_long_jump_size);
284
285 frag_tmp = frag_now;
286 frag_opcode = frag_var (rs_broken_word,
287 possible_bytes,
288 possible_bytes,
289 (relax_substateT) 0,
290 (symbolS *) broken_words,
291 (offsetT) 0,
292 NULL);
293
7c743825
KH
294 /* We want to store the pointer to where to insert the jump
295 table in the fr_opcode of the rs_broken_word frag. This
296 requires a little hackery. */
252b5132
RH
297 while (frag_tmp
298 && (frag_tmp->fr_type != rs_broken_word
299 || frag_tmp->fr_opcode))
300 frag_tmp = frag_tmp->fr_next;
301 know (frag_tmp);
302 frag_tmp->fr_opcode = frag_opcode;
303 new_broken_words = 0;
304
305 for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
306 a->dispfrag = frag_tmp;
307 }
308#endif /* WORKING_DOT_WORD */
309
310 if ((symbolP = symbol_find (sym_name)) != 0)
311 {
312#ifdef RESOLVE_SYMBOL_REDEFINITION
313 if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
314 return symbolP;
315#endif
7c743825 316 /* Now check for undefined symbols. */
49309057
ILT
317 if (LOCAL_SYMBOL_CHECK (symbolP))
318 {
319 struct local_symbol *locsym = (struct local_symbol *) symbolP;
320
321 if (locsym->lsy_section != undefined_section
322 && (local_symbol_get_frag (locsym) != frag_now
323 || locsym->lsy_section != now_seg
bd780143 324 || locsym->lsy_value != frag_now_fix ()))
49309057 325 {
0e389e77 326 as_bad (_("symbol `%s' is already defined"), sym_name);
49309057
ILT
327 return symbolP;
328 }
329
330 locsym->lsy_section = now_seg;
331 local_symbol_set_frag (locsym, frag_now);
bd780143 332 locsym->lsy_value = frag_now_fix ();
49309057
ILT
333 }
334 else if (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
252b5132
RH
335 {
336 if (S_GET_VALUE (symbolP) == 0)
337 {
338 symbolP->sy_frag = frag_now;
339#ifdef OBJ_VMS
7c743825 340 S_SET_OTHER (symbolP, const_flag);
252b5132
RH
341#endif
342 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
343 S_SET_SEGMENT (symbolP, now_seg);
344#ifdef N_UNDF
345 know (N_UNDF == 0);
7c743825 346#endif /* if we have one, it better be zero. */
252b5132
RH
347
348 }
349 else
350 {
7c743825
KH
351 /* There are still several cases to check:
352
353 A .comm/.lcomm symbol being redefined as initialized
354 data is OK
355
356 A .comm/.lcomm symbol being redefined with a larger
357 size is also OK
358
359 This only used to be allowed on VMS gas, but Sun cc
360 on the sparc also depends on it. */
252b5132
RH
361
362 if (((!S_IS_DEBUG (symbolP)
363 && (!S_IS_DEFINED (symbolP) || S_IS_COMMON (symbolP))
364 && S_IS_EXTERNAL (symbolP))
365 || S_GET_SEGMENT (symbolP) == bss_section)
366 && (now_seg == data_section
367 || now_seg == S_GET_SEGMENT (symbolP)))
368 {
7c743825 369 /* Select which of the 2 cases this is. */
252b5132
RH
370 if (now_seg != data_section)
371 {
7c743825
KH
372 /* New .comm for prev .comm symbol.
373
374 If the new size is larger we just change its
375 value. If the new size is smaller, we ignore
376 this symbol. */
252b5132
RH
377 if (S_GET_VALUE (symbolP)
378 < ((unsigned) frag_now_fix ()))
379 {
380 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
381 }
382 }
383 else
384 {
385 /* It is a .comm/.lcomm being converted to initialized
386 data. */
387 symbolP->sy_frag = frag_now;
388#ifdef OBJ_VMS
7c743825 389 S_SET_OTHER (symbolP, const_flag);
252b5132
RH
390#endif
391 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
7c743825 392 S_SET_SEGMENT (symbolP, now_seg); /* Keep N_EXT bit. */
252b5132
RH
393 }
394 }
395 else
396 {
4c63da97
AM
397#if (!defined (OBJ_AOUT) && !defined (OBJ_MAYBE_AOUT) \
398 && !defined (OBJ_BOUT) && !defined (OBJ_MAYBE_BOUT))
399 static const char *od_buf = "";
252b5132 400#else
4c63da97
AM
401 char od_buf[100];
402 od_buf[0] = '\0';
4c63da97 403 if (OUTPUT_FLAVOR == bfd_target_aout_flavour)
d1a6c242
KH
404 sprintf (od_buf, "%d.%d.",
405 S_GET_OTHER (symbolP),
406 S_GET_DESC (symbolP));
4c63da97 407#endif
0e389e77 408 as_bad (_("symbol `%s' is already defined as \"%s\"/%s%ld"),
252b5132
RH
409 sym_name,
410 segment_name (S_GET_SEGMENT (symbolP)),
4c63da97 411 od_buf,
252b5132 412 (long) S_GET_VALUE (symbolP));
252b5132 413 }
7c743825 414 } /* if the undefined symbol has no value */
252b5132
RH
415 }
416 else
417 {
7c743825 418 /* Don't blow up if the definition is the same. */
252b5132
RH
419 if (!(frag_now == symbolP->sy_frag
420 && S_GET_VALUE (symbolP) == frag_now_fix ()
421 && S_GET_SEGMENT (symbolP) == now_seg))
0e389e77 422 as_bad (_("symbol `%s' is already defined"), sym_name);
d4887adc 423 }
252b5132
RH
424
425 }
49309057
ILT
426 else if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, sym_name))
427 {
428 symbolP = (symbolS *) local_symbol_make (sym_name, now_seg,
429 (valueT) frag_now_fix (),
430 frag_now);
431 }
252b5132
RH
432 else
433 {
434 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
435 frag_now);
436#ifdef OBJ_VMS
437 S_SET_OTHER (symbolP, const_flag);
438#endif /* OBJ_VMS */
439
440 symbol_table_insert (symbolP);
d4887adc 441 }
252b5132
RH
442
443 if (mri_common_symbol != NULL)
444 {
445 /* This symbol is actually being defined within an MRI common
1d3b2b27 446 section. This requires special handling. */
49309057
ILT
447 if (LOCAL_SYMBOL_CHECK (symbolP))
448 symbolP = local_symbol_convert ((struct local_symbol *) symbolP);
252b5132
RH
449 symbolP->sy_value.X_op = O_symbol;
450 symbolP->sy_value.X_add_symbol = mri_common_symbol;
451 symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
452 symbolP->sy_frag = &zero_address_frag;
453 S_SET_SEGMENT (symbolP, expr_section);
454 symbolP->sy_mri_common = 1;
455 }
456
457#ifdef tc_frob_label
458 tc_frob_label (symbolP);
459#endif
460#ifdef obj_frob_label
461 obj_frob_label (symbolP);
462#endif
463
464 return symbolP;
465}
466\f
7c743825 467/* Die if we can't insert the symbol. */
252b5132 468
7c743825 469void
74937d39 470symbol_table_insert (symbolS *symbolP)
252b5132
RH
471{
472 register const char *error_string;
473
474 know (symbolP);
475 know (S_GET_NAME (symbolP));
476
49309057
ILT
477 if (LOCAL_SYMBOL_CHECK (symbolP))
478 {
479 error_string = hash_jam (local_hash, S_GET_NAME (symbolP),
480 (PTR) symbolP);
481 if (error_string != NULL)
0e389e77 482 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
49309057
ILT
483 S_GET_NAME (symbolP), error_string);
484 return;
485 }
486
252b5132
RH
487 if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
488 {
0e389e77 489 as_fatal (_("inserting \"%s\" into symbol table failed: %s"),
252b5132 490 S_GET_NAME (symbolP), error_string);
7c743825
KH
491 } /* on error */
492}
252b5132 493\f
7c743825
KH
494/* If a symbol name does not exist, create it as undefined, and insert
495 it into the symbol table. Return a pointer to it. */
496
252b5132 497symbolS *
74937d39 498symbol_find_or_make (const char *name)
252b5132
RH
499{
500 register symbolS *symbolP;
501
502 symbolP = symbol_find (name);
503
504 if (symbolP == NULL)
505 {
49309057
ILT
506 if (! flag_keep_locals && bfd_is_local_label_name (stdoutput, name))
507 {
508 symbolP = md_undefined_symbol ((char *) name);
509 if (symbolP != NULL)
510 return symbolP;
511
512 symbolP = (symbolS *) local_symbol_make (name, undefined_section,
513 (valueT) 0,
514 &zero_address_frag);
515 return symbolP;
516 }
49309057 517
252b5132
RH
518 symbolP = symbol_make (name);
519
520 symbol_table_insert (symbolP);
521 } /* if symbol wasn't found */
522
523 return (symbolP);
7c743825 524}
252b5132
RH
525
526symbolS *
74937d39 527symbol_make (const char *name)
252b5132
RH
528{
529 symbolS *symbolP;
530
7c743825 531 /* Let the machine description default it, e.g. for register names. */
252b5132
RH
532 symbolP = md_undefined_symbol ((char *) name);
533
534 if (!symbolP)
535 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
536
537 return (symbolP);
7c743825 538}
252b5132 539
9497f5ac
NC
540symbolS *
541symbol_clone (symbolS *orgsymP, int replace)
542{
543 symbolS *newsymP;
544
545 /* Running local_symbol_convert on a clone that's not the one currently
546 in local_hash would incorrectly replace the hash entry. Thus the
547 symbol must be converted here. Note that the rest of the function
548 depends on not encountering an unconverted symbol. */
549 if (LOCAL_SYMBOL_CHECK (orgsymP))
550 orgsymP = local_symbol_convert ((struct local_symbol *) orgsymP);
551
552 know (S_IS_DEFINED (orgsymP));
553
554 newsymP = obstack_alloc (&notes, sizeof (*newsymP));
555 *newsymP = *orgsymP;
556
557 if (replace)
558 {
559 if (symbol_rootP == orgsymP)
560 symbol_rootP = newsymP;
561 else if (orgsymP->sy_previous)
562 {
563 orgsymP->sy_previous->sy_next = newsymP;
564 orgsymP->sy_previous = NULL;
565 }
566 if (symbol_lastP == orgsymP)
567 symbol_lastP = newsymP;
568 else if (orgsymP->sy_next)
569 orgsymP->sy_next->sy_previous = newsymP;
570 orgsymP->sy_next = NULL;
571 debug_verify_symchain (symbol_rootP, symbol_lastP);
572
573 symbol_table_insert (newsymP);
574 }
575
576 return newsymP;
577}
578
579/* Referenced symbols, if they are forward references, need to be cloned
580 (without replacing the original) so that the value of the referenced
581 symbols at the point of use . */
582
583#undef symbol_clone_if_forward_ref
584symbolS *
585symbol_clone_if_forward_ref (symbolS *symbolP, int is_forward)
586{
587 if (symbolP && !LOCAL_SYMBOL_CHECK (symbolP))
588 {
589 symbolS *add_symbol = symbolP->sy_value.X_add_symbol;
590 symbolS *op_symbol = symbolP->sy_value.X_op_symbol;
591
592 if (symbolP->sy_forward_ref)
593 is_forward = 1;
594
595 if (is_forward)
596 {
597 /* assign_symbol() clones volatile symbols; pre-existing expressions
598 hold references to the original instance, but want the current
599 value. Just repeat the lookup. */
600 if (add_symbol && S_IS_VOLATILE (add_symbol))
601 add_symbol = symbol_find_exact (S_GET_NAME (add_symbol));
602 if (op_symbol && S_IS_VOLATILE (op_symbol))
603 op_symbol = symbol_find_exact (S_GET_NAME (op_symbol));
604 }
605
606 /* Re-using sy_resolving here, as this routine cannot get called from
607 symbol resolution code. */
608 if (symbolP->bsym->section == expr_section && !symbolP->sy_resolving)
609 {
610 symbolP->sy_resolving = 1;
611 add_symbol = symbol_clone_if_forward_ref (add_symbol, is_forward);
612 op_symbol = symbol_clone_if_forward_ref (op_symbol, is_forward);
613 symbolP->sy_resolving = 0;
614 }
615
616 if (symbolP->sy_forward_ref
617 || add_symbol != symbolP->sy_value.X_add_symbol
618 || op_symbol != symbolP->sy_value.X_op_symbol)
619 symbolP = symbol_clone (symbolP, 0);
620
621 symbolP->sy_value.X_add_symbol = add_symbol;
622 symbolP->sy_value.X_op_symbol = op_symbol;
623 }
624
625 return symbolP;
626}
627
b7d6ed97 628symbolS *
74937d39 629symbol_temp_new (segT seg, valueT ofs, fragS *frag)
b7d6ed97 630{
756d1d01 631 return symbol_new (FAKE_LABEL_NAME, seg, ofs, frag);
b7d6ed97
RH
632}
633
634symbolS *
74937d39 635symbol_temp_new_now (void)
b7d6ed97
RH
636{
637 return symbol_temp_new (now_seg, frag_now_fix (), frag_now);
638}
639
640symbolS *
74937d39 641symbol_temp_make (void)
b7d6ed97 642{
756d1d01 643 return symbol_make (FAKE_LABEL_NAME);
b7d6ed97
RH
644}
645
7c743825
KH
646/* Implement symbol table lookup.
647 In: A symbol's name as a string: '\0' can't be part of a symbol name.
648 Out: NULL if the name was not in the symbol table, else the address
649 of a struct symbol associated with that name. */
252b5132 650
9758f3fc 651symbolS *
74937d39 652symbol_find_exact (const char *name)
9758f3fc 653{
7be1c489 654 struct local_symbol *locsym;
9758f3fc 655
7be1c489
AM
656 locsym = (struct local_symbol *) hash_find (local_hash, name);
657 if (locsym != NULL)
658 return (symbolS *) locsym;
9758f3fc
AM
659
660 return ((symbolS *) hash_find (sy_hash, name));
661}
662
252b5132 663symbolS *
91c4c449 664symbol_find (const char *name)
252b5132 665{
252b5132
RH
666#ifdef tc_canonicalize_symbol_name
667 {
668 char *copy;
03987ced 669 size_t len = strlen (name) + 1;
252b5132 670
03987ced
RH
671 copy = (char *) alloca (len);
672 memcpy (copy, name, len);
252b5132
RH
673 name = tc_canonicalize_symbol_name (copy);
674 }
675#endif
676
677 if (! symbols_case_sensitive)
678 {
03987ced
RH
679 char *copy;
680 const char *orig;
681 unsigned char c;
682
683 orig = name;
684 name = copy = (char *) alloca (strlen (name) + 1);
685
686 while ((c = *orig++) != '\0')
687 {
3882b010 688 *copy++ = TOUPPER (c);
03987ced
RH
689 }
690 *copy = '\0';
252b5132
RH
691 }
692
9758f3fc 693 return symbol_find_exact (name);
252b5132
RH
694}
695
7c743825
KH
696/* Once upon a time, symbols were kept in a singly linked list. At
697 least coff needs to be able to rearrange them from time to time, for
698 which a doubly linked list is much more convenient. Loic did these
699 as macros which seemed dangerous to me so they're now functions.
700 xoxorich. */
701
702/* Link symbol ADDME after symbol TARGET in the chain. */
252b5132 703
7c743825 704void
74937d39
KH
705symbol_append (symbolS *addme, symbolS *target,
706 symbolS **rootPP, symbolS **lastPP)
252b5132 707{
49309057
ILT
708 if (LOCAL_SYMBOL_CHECK (addme))
709 abort ();
710 if (target != NULL && LOCAL_SYMBOL_CHECK (target))
711 abort ();
712
252b5132
RH
713 if (target == NULL)
714 {
715 know (*rootPP == NULL);
716 know (*lastPP == NULL);
717 addme->sy_next = NULL;
252b5132 718 addme->sy_previous = NULL;
252b5132
RH
719 *rootPP = addme;
720 *lastPP = addme;
721 return;
7c743825 722 } /* if the list is empty */
252b5132
RH
723
724 if (target->sy_next != NULL)
725 {
252b5132 726 target->sy_next->sy_previous = addme;
252b5132
RH
727 }
728 else
729 {
730 know (*lastPP == target);
731 *lastPP = addme;
7c743825 732 } /* if we have a next */
252b5132
RH
733
734 addme->sy_next = target->sy_next;
735 target->sy_next = addme;
252b5132 736 addme->sy_previous = target;
252b5132
RH
737
738 debug_verify_symchain (symbol_rootP, symbol_lastP);
739}
740
7c743825
KH
741/* Set the chain pointers of SYMBOL to null. */
742
743void
74937d39 744symbol_clear_list_pointers (symbolS *symbolP)
252b5132 745{
49309057
ILT
746 if (LOCAL_SYMBOL_CHECK (symbolP))
747 abort ();
252b5132 748 symbolP->sy_next = NULL;
252b5132 749 symbolP->sy_previous = NULL;
252b5132
RH
750}
751
7c743825
KH
752/* Remove SYMBOLP from the list. */
753
754void
74937d39 755symbol_remove (symbolS *symbolP, symbolS **rootPP, symbolS **lastPP)
252b5132 756{
49309057
ILT
757 if (LOCAL_SYMBOL_CHECK (symbolP))
758 abort ();
759
252b5132
RH
760 if (symbolP == *rootPP)
761 {
762 *rootPP = symbolP->sy_next;
7c743825 763 } /* if it was the root */
252b5132
RH
764
765 if (symbolP == *lastPP)
766 {
767 *lastPP = symbolP->sy_previous;
7c743825 768 } /* if it was the tail */
252b5132
RH
769
770 if (symbolP->sy_next != NULL)
771 {
772 symbolP->sy_next->sy_previous = symbolP->sy_previous;
7c743825 773 } /* if not last */
252b5132
RH
774
775 if (symbolP->sy_previous != NULL)
776 {
777 symbolP->sy_previous->sy_next = symbolP->sy_next;
7c743825 778 } /* if not first */
252b5132
RH
779
780 debug_verify_symchain (*rootPP, *lastPP);
781}
782
7c743825
KH
783/* Link symbol ADDME before symbol TARGET in the chain. */
784
785void
74937d39
KH
786symbol_insert (symbolS *addme, symbolS *target,
787 symbolS **rootPP, symbolS **lastPP ATTRIBUTE_UNUSED)
252b5132 788{
49309057
ILT
789 if (LOCAL_SYMBOL_CHECK (addme))
790 abort ();
791 if (LOCAL_SYMBOL_CHECK (target))
792 abort ();
793
252b5132
RH
794 if (target->sy_previous != NULL)
795 {
796 target->sy_previous->sy_next = addme;
797 }
798 else
799 {
800 know (*rootPP == target);
801 *rootPP = addme;
7c743825 802 } /* if not first */
252b5132
RH
803
804 addme->sy_previous = target->sy_previous;
805 target->sy_previous = addme;
806 addme->sy_next = target;
807
808 debug_verify_symchain (*rootPP, *lastPP);
809}
810
7c743825 811void
74937d39 812verify_symbol_chain (symbolS *rootP, symbolS *lastP)
252b5132
RH
813{
814 symbolS *symbolP = rootP;
815
816 if (symbolP == NULL)
817 return;
818
819 for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
820 {
49309057 821 assert (symbolP->bsym != NULL);
252b5132 822 assert (symbolP->sy_next->sy_previous == symbolP);
252b5132
RH
823 }
824
825 assert (lastP == symbolP);
826}
827
0909233e 828static void
74937d39 829report_op_error (symbolS *symp, symbolS *left, symbolS *right)
0909233e
AM
830{
831 char *file;
832 unsigned int line;
833 segT seg_left = S_GET_SEGMENT (left);
834 segT seg_right = right ? S_GET_SEGMENT (right) : 0;
1d3b2b27 835
0909233e
AM
836 if (expr_symbol_where (symp, &file, &line))
837 {
838 if (seg_left == undefined_section)
839 as_bad_where (file, line,
840 _("undefined symbol `%s' in operation"),
841 S_GET_NAME (left));
842 if (seg_right == undefined_section)
843 as_bad_where (file, line,
844 _("undefined symbol `%s' in operation"),
845 S_GET_NAME (right));
846 if (seg_left != undefined_section
847 && seg_right != undefined_section)
848 {
849 if (right)
850 as_bad_where (file, line,
851 _("invalid sections for operation on `%s' and `%s'"),
852 S_GET_NAME (left), S_GET_NAME (right));
853 else
854 as_bad_where (file, line,
855 _("invalid section for operation on `%s'"),
856 S_GET_NAME (left));
857 }
1d3b2b27 858
0909233e
AM
859 }
860 else
861 {
862 if (seg_left == undefined_section)
863 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
864 S_GET_NAME (left), S_GET_NAME (symp));
865 if (seg_right == undefined_section)
866 as_bad (_("undefined symbol `%s' in operation setting `%s'"),
867 S_GET_NAME (right), S_GET_NAME (symp));
868 if (seg_left != undefined_section
869 && seg_right != undefined_section)
870 {
871 if (right)
872 as_bad_where (file, line,
873 _("invalid sections for operation on `%s' and `%s' setting `%s'"),
874 S_GET_NAME (left), S_GET_NAME (right), S_GET_NAME (symp));
875 else
876 as_bad_where (file, line,
877 _("invalid section for operation on `%s' setting `%s'"),
878 S_GET_NAME (left), S_GET_NAME (symp));
879 }
880 }
881}
882
252b5132
RH
883/* Resolve the value of a symbol. This is called during the final
884 pass over the symbol table to resolve any symbols with complex
885 values. */
886
887valueT
74937d39 888resolve_symbol_value (symbolS *symp)
252b5132
RH
889{
890 int resolved;
03e83a45 891 valueT final_val = 0;
252b5132
RH
892 segT final_seg;
893
49309057
ILT
894 if (LOCAL_SYMBOL_CHECK (symp))
895 {
896 struct local_symbol *locsym = (struct local_symbol *) symp;
897
bd780143 898 final_val = locsym->lsy_value;
49309057 899 if (local_symbol_resolved_p (locsym))
bd780143 900 return final_val;
49309057 901
bd780143 902 final_val += local_symbol_get_frag (locsym)->fr_address / OCTETS_PER_BYTE;
49309057 903
6386f3a7 904 if (finalize_syms)
49309057 905 {
bd780143 906 locsym->lsy_value = final_val;
49309057
ILT
907 local_symbol_mark_resolved (locsym);
908 }
909
910 return final_val;
911 }
912
252b5132
RH
913 if (symp->sy_resolved)
914 {
915 if (symp->sy_value.X_op == O_constant)
916 return (valueT) symp->sy_value.X_add_number;
917 else
918 return 0;
919 }
920
921 resolved = 0;
922 final_seg = S_GET_SEGMENT (symp);
923
924 if (symp->sy_resolving)
925 {
6386f3a7 926 if (finalize_syms)
0e389e77 927 as_bad (_("symbol definition loop encountered at `%s'"),
7c743825 928 S_GET_NAME (symp));
252b5132
RH
929 final_val = 0;
930 resolved = 1;
931 }
932 else
933 {
934 symbolS *add_symbol, *op_symbol;
935 offsetT left, right;
936 segT seg_left, seg_right;
937 operatorT op;
2d034539 938 int move_seg_ok;
252b5132
RH
939
940 symp->sy_resolving = 1;
941
942 /* Help out with CSE. */
943 add_symbol = symp->sy_value.X_add_symbol;
944 op_symbol = symp->sy_value.X_op_symbol;
945 final_val = symp->sy_value.X_add_number;
946 op = symp->sy_value.X_op;
947
948 switch (op)
949 {
950 default:
951 BAD_CASE (op);
952 break;
953
954 case O_absent:
955 final_val = 0;
956 /* Fall through. */
957
958 case O_constant:
bea9907b 959 final_val += symp->sy_frag->fr_address / OCTETS_PER_BYTE;
252b5132
RH
960 if (final_seg == expr_section)
961 final_seg = absolute_section;
962 resolved = 1;
963 break;
964
965 case O_symbol:
966 case O_symbol_rva:
6386f3a7 967 left = resolve_symbol_value (add_symbol);
e0890092
AM
968 seg_left = S_GET_SEGMENT (add_symbol);
969 if (finalize_syms)
970 symp->sy_value.X_op_symbol = NULL;
252b5132 971
e0890092 972 do_symbol:
252b5132
RH
973 if (symp->sy_mri_common)
974 {
975 /* This is a symbol inside an MRI common section. The
e0890092
AM
976 relocation routines are going to handle it specially.
977 Don't change the value. */
49309057 978 resolved = symbol_resolved_p (add_symbol);
252b5132
RH
979 break;
980 }
981
6386f3a7 982 if (finalize_syms && final_val == 0)
49309057
ILT
983 {
984 if (LOCAL_SYMBOL_CHECK (add_symbol))
985 add_symbol = local_symbol_convert ((struct local_symbol *)
986 add_symbol);
987 copy_symbol_attributes (symp, add_symbol);
988 }
252b5132 989
e0890092
AM
990 /* If we have equated this symbol to an undefined or common
991 symbol, keep X_op set to O_symbol, and don't change
992 X_add_number. This permits the routine which writes out
993 relocation to detect this case, and convert the
994 relocation to be against the symbol to which this symbol
995 is equated. */
977cdf5a 996 if (! S_IS_DEFINED (add_symbol)
7be1c489 997#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
998 || S_IS_WEAK (add_symbol)
999#endif
1000 || S_IS_COMMON (add_symbol))
252b5132 1001 {
6386f3a7 1002 if (finalize_syms)
252b5132 1003 {
252b5132
RH
1004 symp->sy_value.X_op = O_symbol;
1005 symp->sy_value.X_add_symbol = add_symbol;
1006 symp->sy_value.X_add_number = final_val;
e0890092
AM
1007 /* Use X_op_symbol as a flag. */
1008 symp->sy_value.X_op_symbol = add_symbol;
1009 final_seg = seg_left;
252b5132
RH
1010 }
1011 final_val = 0;
49309057 1012 resolved = symbol_resolved_p (add_symbol);
c89c8534 1013 symp->sy_resolving = 0;
252b5132
RH
1014 goto exit_dont_set_value;
1015 }
e0890092
AM
1016 else if (finalize_syms && final_seg == expr_section
1017 && seg_left != expr_section)
1018 {
1019 /* If the symbol is an expression symbol, do similarly
1020 as for undefined and common syms above. Handles
1021 "sym +/- expr" where "expr" cannot be evaluated
1022 immediately, and we want relocations to be against
1023 "sym", eg. because it is weak. */
1024 symp->sy_value.X_op = O_symbol;
1025 symp->sy_value.X_add_symbol = add_symbol;
1026 symp->sy_value.X_add_number = final_val;
1027 symp->sy_value.X_op_symbol = add_symbol;
1028 final_seg = seg_left;
1029 final_val += symp->sy_frag->fr_address + left;
1030 resolved = symbol_resolved_p (add_symbol);
1031 symp->sy_resolving = 0;
1032 goto exit_dont_set_value;
1033 }
252b5132
RH
1034 else
1035 {
1036 final_val += symp->sy_frag->fr_address + left;
1037 if (final_seg == expr_section || final_seg == undefined_section)
e0890092 1038 final_seg = seg_left;
252b5132
RH
1039 }
1040
49309057 1041 resolved = symbol_resolved_p (add_symbol);
252b5132
RH
1042 break;
1043
1044 case O_uminus:
1045 case O_bit_not:
1046 case O_logical_not:
6386f3a7 1047 left = resolve_symbol_value (add_symbol);
784b640d 1048 seg_left = S_GET_SEGMENT (add_symbol);
252b5132 1049
0909233e
AM
1050 /* By reducing these to the relevant dyadic operator, we get
1051 !S -> S == 0 permitted on anything,
1052 -S -> 0 - S only permitted on absolute
1053 ~S -> S ^ ~0 only permitted on absolute */
1054 if (op != O_logical_not && seg_left != absolute_section
1055 && finalize_syms)
1056 report_op_error (symp, add_symbol, NULL);
1d3b2b27 1057
0909233e
AM
1058 if (final_seg == expr_section || final_seg == undefined_section)
1059 final_seg = absolute_section;
1d3b2b27 1060
252b5132
RH
1061 if (op == O_uminus)
1062 left = -left;
1063 else if (op == O_logical_not)
1064 left = !left;
1065 else
1066 left = ~left;
1067
1068 final_val += left + symp->sy_frag->fr_address;
252b5132 1069
49309057 1070 resolved = symbol_resolved_p (add_symbol);
252b5132
RH
1071 break;
1072
1073 case O_multiply:
1074 case O_divide:
1075 case O_modulus:
1076 case O_left_shift:
1077 case O_right_shift:
1078 case O_bit_inclusive_or:
1079 case O_bit_or_not:
1080 case O_bit_exclusive_or:
1081 case O_bit_and:
1082 case O_add:
1083 case O_subtract:
1084 case O_eq:
1085 case O_ne:
1086 case O_lt:
1087 case O_le:
1088 case O_ge:
1089 case O_gt:
1090 case O_logical_and:
1091 case O_logical_or:
6386f3a7
AM
1092 left = resolve_symbol_value (add_symbol);
1093 right = resolve_symbol_value (op_symbol);
252b5132
RH
1094 seg_left = S_GET_SEGMENT (add_symbol);
1095 seg_right = S_GET_SEGMENT (op_symbol);
1096
1097 /* Simplify addition or subtraction of a constant by folding the
1098 constant into X_add_number. */
e0890092 1099 if (op == O_add)
252b5132
RH
1100 {
1101 if (seg_right == absolute_section)
1102 {
e0890092 1103 final_val += right;
252b5132
RH
1104 goto do_symbol;
1105 }
e0890092 1106 else if (seg_left == absolute_section)
252b5132 1107 {
252b5132
RH
1108 final_val += left;
1109 add_symbol = op_symbol;
1110 left = right;
e0890092
AM
1111 seg_left = seg_right;
1112 goto do_symbol;
1113 }
1114 }
1115 else if (op == O_subtract)
1116 {
1117 if (seg_right == absolute_section)
1118 {
1119 final_val -= right;
252b5132
RH
1120 goto do_symbol;
1121 }
1122 }
1123
2d034539 1124 move_seg_ok = 1;
e0890092
AM
1125 /* Equality and non-equality tests are permitted on anything.
1126 Subtraction, and other comparison operators are permitted if
1127 both operands are in the same section. Otherwise, both
1128 operands must be absolute. We already handled the case of
1129 addition or subtraction of a constant above. This will
1130 probably need to be changed for an object file format which
2d034539
NC
1131 supports arbitrary expressions, such as IEEE-695. */
1132 if (!(seg_left == absolute_section
0909233e
AM
1133 && seg_right == absolute_section)
1134 && !(op == O_eq || op == O_ne)
1135 && !((op == O_subtract
1136 || op == O_lt || op == O_le || op == O_ge || op == O_gt)
1137 && seg_left == seg_right
1138 && (seg_left != undefined_section
1139 || add_symbol == op_symbol)))
2d034539
NC
1140 {
1141 /* Don't emit messages unless we're finalizing the symbol value,
1142 otherwise we may get the same message multiple times. */
1143 if (finalize_syms)
1144 report_op_error (symp, add_symbol, op_symbol);
1145 /* However do not move the symbol into the absolute section
1146 if it cannot currently be resolved - this would confuse
1147 other parts of the assembler into believing that the
1148 expression had been evaluated to zero. */
1149 else
1150 move_seg_ok = 0;
1151 }
1d3b2b27 1152
2d034539
NC
1153 if (move_seg_ok
1154 && (final_seg == expr_section || final_seg == undefined_section))
0909233e 1155 final_seg = absolute_section;
252b5132
RH
1156
1157 /* Check for division by zero. */
1158 if ((op == O_divide || op == O_modulus) && right == 0)
1159 {
1160 /* If seg_right is not absolute_section, then we've
e0890092 1161 already issued a warning about using a bad symbol. */
6386f3a7 1162 if (seg_right == absolute_section && finalize_syms)
252b5132
RH
1163 {
1164 char *file;
1165 unsigned int line;
1166
1167 if (expr_symbol_where (symp, &file, &line))
1168 as_bad_where (file, line, _("division by zero"));
1169 else
0e389e77 1170 as_bad (_("division by zero when setting `%s'"),
252b5132
RH
1171 S_GET_NAME (symp));
1172 }
1173
1174 right = 1;
1175 }
1176
1177 switch (symp->sy_value.X_op)
1178 {
1179 case O_multiply: left *= right; break;
1180 case O_divide: left /= right; break;
1181 case O_modulus: left %= right; break;
1182 case O_left_shift: left <<= right; break;
1183 case O_right_shift: left >>= right; break;
1184 case O_bit_inclusive_or: left |= right; break;
1185 case O_bit_or_not: left |= ~right; break;
1186 case O_bit_exclusive_or: left ^= right; break;
1187 case O_bit_and: left &= right; break;
1188 case O_add: left += right; break;
1189 case O_subtract: left -= right; break;
e0890092
AM
1190 case O_eq:
1191 case O_ne:
1192 left = (left == right && seg_left == seg_right
1193 && (seg_left != undefined_section
1194 || add_symbol == op_symbol)
1195 ? ~ (offsetT) 0 : 0);
1196 if (symp->sy_value.X_op == O_ne)
1197 left = ~left;
1198 break;
252b5132
RH
1199 case O_lt: left = left < right ? ~ (offsetT) 0 : 0; break;
1200 case O_le: left = left <= right ? ~ (offsetT) 0 : 0; break;
1201 case O_ge: left = left >= right ? ~ (offsetT) 0 : 0; break;
1202 case O_gt: left = left > right ? ~ (offsetT) 0 : 0; break;
1203 case O_logical_and: left = left && right; break;
1204 case O_logical_or: left = left || right; break;
1205 default: abort ();
1206 }
1207
1208 final_val += symp->sy_frag->fr_address + left;
1209 if (final_seg == expr_section || final_seg == undefined_section)
784b640d
AM
1210 {
1211 if (seg_left == undefined_section
1212 || seg_right == undefined_section)
1213 final_seg = undefined_section;
1214 else if (seg_left == absolute_section)
1215 final_seg = seg_right;
1216 else
1217 final_seg = seg_left;
1218 }
49309057
ILT
1219 resolved = (symbol_resolved_p (add_symbol)
1220 && symbol_resolved_p (op_symbol));
7c743825 1221 break;
252b5132
RH
1222
1223 case O_register:
1224 case O_big:
1225 case O_illegal:
1226 /* Give an error (below) if not in expr_section. We don't
1227 want to worry about expr_section symbols, because they
1228 are fictional (they are created as part of expression
1229 resolution), and any problems may not actually mean
1230 anything. */
1231 break;
1232 }
1233
1234 symp->sy_resolving = 0;
1235 }
1236
6386f3a7 1237 if (finalize_syms)
05bdb37e 1238 S_SET_VALUE (symp, final_val);
252b5132 1239
05bdb37e
AM
1240exit_dont_set_value:
1241 /* Always set the segment, even if not finalizing the value.
1242 The segment is used to determine whether a symbol is defined. */
05bdb37e 1243 S_SET_SEGMENT (symp, final_seg);
252b5132 1244
252b5132 1245 /* Don't worry if we can't resolve an expr_section symbol. */
6386f3a7 1246 if (finalize_syms)
252b5132
RH
1247 {
1248 if (resolved)
1249 symp->sy_resolved = 1;
1250 else if (S_GET_SEGMENT (symp) != expr_section)
1251 {
0e389e77 1252 as_bad (_("can't resolve value for symbol `%s'"),
7c743825 1253 S_GET_NAME (symp));
252b5132
RH
1254 symp->sy_resolved = 1;
1255 }
1256 }
1257
1258 return final_val;
1259}
1260
74937d39 1261static void resolve_local_symbol (const char *, PTR);
49309057
ILT
1262
1263/* A static function passed to hash_traverse. */
1264
1265static void
74937d39 1266resolve_local_symbol (const char *key ATTRIBUTE_UNUSED, PTR value)
49309057
ILT
1267{
1268 if (value != NULL)
6386f3a7 1269 resolve_symbol_value (value);
49309057
ILT
1270}
1271
49309057
ILT
1272/* Resolve all local symbols. */
1273
1274void
74937d39 1275resolve_local_symbol_values (void)
49309057 1276{
49309057 1277 hash_traverse (local_hash, resolve_local_symbol);
49309057
ILT
1278}
1279
9497f5ac
NC
1280/* Obtain the current value of a symbol without changing any
1281 sub-expressions used. */
1282
1283int
1284snapshot_symbol (symbolS *symbolP, valueT *valueP, segT *segP, fragS **fragPP)
1285{
1286 if (LOCAL_SYMBOL_CHECK (symbolP))
1287 {
1288 struct local_symbol *locsym = (struct local_symbol *) symbolP;
1289
1290 *valueP = locsym->lsy_value;
1291 *segP = locsym->lsy_section;
1292 *fragPP = local_symbol_get_frag (locsym);
1293 }
1294 else
1295 {
1296 expressionS expr = symbolP->sy_value;
1297
1298 if (!symbolP->sy_resolved && expr.X_op != O_illegal)
1299 {
1300 int resolved;
1301
1302 if (symbolP->sy_resolving)
1303 return 0;
1304 symbolP->sy_resolving = 1;
1305 resolved = resolve_expression (&expr);
1306 symbolP->sy_resolving = 0;
1307 if (!resolved)
1308 return 0;
1309
1310 switch (expr.X_op)
1311 {
1312 case O_constant:
1313 case O_register:
1314 /* This check wouldn't be needed if pseudo_set() didn't set
1315 symbols equated to bare symbols to undefined_section. */
1316 if (symbolP->bsym->section != undefined_section
1317 || symbolP->sy_value.X_op != O_symbol)
1318 break;
1319 /* Fall thru. */
1320 case O_symbol:
1321 case O_symbol_rva:
1322 symbolP = expr.X_add_symbol;
1323 break;
1324 default:
1325 return 0;
1326 }
1327 }
1328
1329 *valueP = expr.X_add_number;
1330 *segP = symbolP->bsym->section;
1331 *fragPP = symbolP->sy_frag;
1332
1333 if (*segP == expr_section)
1334 switch (expr.X_op)
1335 {
1336 case O_constant: *segP = absolute_section; break;
1337 case O_register: *segP = reg_section; break;
1338 default: break;
1339 }
1340 }
1341
1342 return 1;
1343}
1344
252b5132
RH
1345/* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
1346 They are *really* local. That is, they go out of scope whenever we see a
1347 label that isn't local. Also, like fb labels, there can be multiple
1348 instances of a dollar label. Therefor, we name encode each instance with
1349 the instance number, keep a list of defined symbols separate from the real
1350 symbol table, and we treat these buggers as a sparse array. */
1351
1352static long *dollar_labels;
1353static long *dollar_label_instances;
1354static char *dollar_label_defines;
1355static unsigned long dollar_label_count;
1356static unsigned long dollar_label_max;
1357
7c743825 1358int
74937d39 1359dollar_label_defined (long label)
252b5132
RH
1360{
1361 long *i;
1362
1363 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1364
1365 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1366 if (*i == label)
1367 return dollar_label_defines[i - dollar_labels];
1368
7c743825 1369 /* If we get here, label isn't defined. */
252b5132 1370 return 0;
7c743825 1371}
252b5132
RH
1372
1373static long
74937d39 1374dollar_label_instance (long label)
252b5132
RH
1375{
1376 long *i;
1377
1378 know ((dollar_labels != NULL) || (dollar_label_count == 0));
1379
1380 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1381 if (*i == label)
1382 return (dollar_label_instances[i - dollar_labels]);
1383
7c743825
KH
1384 /* If we get here, we haven't seen the label before.
1385 Therefore its instance count is zero. */
252b5132
RH
1386 return 0;
1387}
1388
7c743825 1389void
74937d39 1390dollar_label_clear (void)
252b5132
RH
1391{
1392 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
1393}
1394
1395#define DOLLAR_LABEL_BUMP_BY 10
1396
7c743825 1397void
74937d39 1398define_dollar_label (long label)
252b5132
RH
1399{
1400 long *i;
1401
1402 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
1403 if (*i == label)
1404 {
1405 ++dollar_label_instances[i - dollar_labels];
1406 dollar_label_defines[i - dollar_labels] = 1;
1407 return;
1408 }
1409
7c743825 1410 /* If we get to here, we don't have label listed yet. */
252b5132
RH
1411
1412 if (dollar_labels == NULL)
1413 {
1414 dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1415 dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
1416 dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
1417 dollar_label_max = DOLLAR_LABEL_BUMP_BY;
1418 dollar_label_count = 0;
1419 }
1420 else if (dollar_label_count == dollar_label_max)
1421 {
1422 dollar_label_max += DOLLAR_LABEL_BUMP_BY;
1423 dollar_labels = (long *) xrealloc ((char *) dollar_labels,
1424 dollar_label_max * sizeof (long));
1425 dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
1426 dollar_label_max * sizeof (long));
1427 dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
7c743825 1428 } /* if we needed to grow */
252b5132
RH
1429
1430 dollar_labels[dollar_label_count] = label;
1431 dollar_label_instances[dollar_label_count] = 1;
1432 dollar_label_defines[dollar_label_count] = 1;
1433 ++dollar_label_count;
1434}
1435
7c743825
KH
1436/* Caller must copy returned name: we re-use the area for the next name.
1437
1438 The mth occurence of label n: is turned into the symbol "Ln^Am"
1439 where n is the label number and m is the instance number. "L" makes
1440 it a label discarded unless debugging and "^A"('\1') ensures no
1441 ordinary symbol SHOULD get the same name as a local label
1442 symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
1443
1444 fb labels get the same treatment, except that ^B is used in place
1445 of ^A. */
1446
1447char * /* Return local label name. */
74937d39
KH
1448dollar_label_name (register long n, /* we just saw "n$:" : n a number. */
1449 register int augend /* 0 for current instance, 1 for new instance. */)
252b5132
RH
1450{
1451 long i;
7c743825 1452 /* Returned to caller, then copied. Used for created names ("4f"). */
252b5132
RH
1453 static char symbol_name_build[24];
1454 register char *p;
1455 register char *q;
7c743825 1456 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
252b5132
RH
1457
1458 know (n >= 0);
1459 know (augend == 0 || augend == 1);
1460 p = symbol_name_build;
f84dd1f0
NC
1461#ifdef LOCAL_LABEL_PREFIX
1462 *p++ = LOCAL_LABEL_PREFIX;
1463#endif
252b5132
RH
1464 *p++ = 'L';
1465
7c743825
KH
1466 /* Next code just does sprintf( {}, "%d", n); */
1467 /* Label number. */
252b5132
RH
1468 q = symbol_name_temporary;
1469 for (*q++ = 0, i = n; i; ++q)
1470 {
1471 *q = i % 10 + '0';
1472 i /= 10;
1473 }
1474 while ((*p = *--q) != '\0')
1475 ++p;
1476
aa257fcd 1477 *p++ = DOLLAR_LABEL_CHAR; /* ^A */
252b5132 1478
7c743825 1479 /* Instance number. */
252b5132
RH
1480 q = symbol_name_temporary;
1481 for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
1482 {
1483 *q = i % 10 + '0';
1484 i /= 10;
1485 }
1486 while ((*p++ = *--q) != '\0');;
1487
7c743825 1488 /* The label, as a '\0' ended string, starts at symbol_name_build. */
252b5132
RH
1489 return symbol_name_build;
1490}
1491
47eebc20 1492/* Somebody else's idea of local labels. They are made by "n:" where n
7c743825
KH
1493 is any decimal digit. Refer to them with
1494 "nb" for previous (backward) n:
1495 or "nf" for next (forward) n:.
1496
1497 We do a little better and let n be any number, not just a single digit, but
1498 since the other guy's assembler only does ten, we treat the first ten
1499 specially.
1500
1501 Like someone else's assembler, we have one set of local label counters for
1502 entire assembly, not one set per (sub)segment like in most assemblers. This
1503 implies that one can refer to a label in another segment, and indeed some
1504 crufty compilers have done just that.
1505
1506 Since there could be a LOT of these things, treat them as a sparse
1507 array. */
252b5132
RH
1508
1509#define FB_LABEL_SPECIAL (10)
1510
1511static long fb_low_counter[FB_LABEL_SPECIAL];
1512static long *fb_labels;
1513static long *fb_label_instances;
1514static long fb_label_count;
1515static long fb_label_max;
1516
7c743825 1517/* This must be more than FB_LABEL_SPECIAL. */
252b5132
RH
1518#define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1519
7c743825 1520static void
74937d39 1521fb_label_init (void)
252b5132
RH
1522{
1523 memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
7c743825 1524}
252b5132 1525
7c743825
KH
1526/* Add one to the instance number of this fb label. */
1527
1528void
74937d39 1529fb_label_instance_inc (long label)
252b5132
RH
1530{
1531 long *i;
1532
1533 if (label < FB_LABEL_SPECIAL)
1534 {
1535 ++fb_low_counter[label];
1536 return;
1537 }
1538
1539 if (fb_labels != NULL)
1540 {
1541 for (i = fb_labels + FB_LABEL_SPECIAL;
1542 i < fb_labels + fb_label_count; ++i)
1543 {
1544 if (*i == label)
1545 {
1546 ++fb_label_instances[i - fb_labels];
1547 return;
7c743825
KH
1548 } /* if we find it */
1549 } /* for each existing label */
252b5132
RH
1550 }
1551
7c743825 1552 /* If we get to here, we don't have label listed yet. */
252b5132
RH
1553
1554 if (fb_labels == NULL)
1555 {
1556 fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1557 fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1558 fb_label_max = FB_LABEL_BUMP_BY;
1559 fb_label_count = FB_LABEL_SPECIAL;
1560
1561 }
1562 else if (fb_label_count == fb_label_max)
1563 {
1564 fb_label_max += FB_LABEL_BUMP_BY;
1565 fb_labels = (long *) xrealloc ((char *) fb_labels,
1566 fb_label_max * sizeof (long));
1567 fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1568 fb_label_max * sizeof (long));
7c743825 1569 } /* if we needed to grow */
252b5132
RH
1570
1571 fb_labels[fb_label_count] = label;
1572 fb_label_instances[fb_label_count] = 1;
1573 ++fb_label_count;
1574}
1575
7c743825 1576static long
74937d39 1577fb_label_instance (long label)
252b5132
RH
1578{
1579 long *i;
1580
1581 if (label < FB_LABEL_SPECIAL)
1582 {
1583 return (fb_low_counter[label]);
1584 }
1585
1586 if (fb_labels != NULL)
1587 {
1588 for (i = fb_labels + FB_LABEL_SPECIAL;
1589 i < fb_labels + fb_label_count; ++i)
1590 {
1591 if (*i == label)
1592 {
1593 return (fb_label_instances[i - fb_labels]);
7c743825
KH
1594 } /* if we find it */
1595 } /* for each existing label */
252b5132
RH
1596 }
1597
1598 /* We didn't find the label, so this must be a reference to the
1599 first instance. */
1600 return 0;
1601}
1602
7c743825
KH
1603/* Caller must copy returned name: we re-use the area for the next name.
1604
1605 The mth occurence of label n: is turned into the symbol "Ln^Bm"
1606 where n is the label number and m is the instance number. "L" makes
1607 it a label discarded unless debugging and "^B"('\2') ensures no
1608 ordinary symbol SHOULD get the same name as a local label
1609 symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
1610
1611 dollar labels get the same treatment, except that ^A is used in
1612 place of ^B. */
1613
1614char * /* Return local label name. */
74937d39
KH
1615fb_label_name (long n, /* We just saw "n:", "nf" or "nb" : n a number. */
1616 long augend /* 0 for nb, 1 for n:, nf. */)
252b5132
RH
1617{
1618 long i;
7c743825 1619 /* Returned to caller, then copied. Used for created names ("4f"). */
252b5132
RH
1620 static char symbol_name_build[24];
1621 register char *p;
1622 register char *q;
7c743825 1623 char symbol_name_temporary[20]; /* Build up a number, BACKWARDS. */
252b5132
RH
1624
1625 know (n >= 0);
a76903bf 1626#ifdef TC_MMIX
71ba24a1 1627 know ((unsigned long) augend <= 2 /* See mmix_fb_label. */);
a76903bf 1628#else
71ba24a1 1629 know ((unsigned long) augend <= 1);
a76903bf 1630#endif
252b5132 1631 p = symbol_name_build;
aa257fcd
NC
1632#ifdef LOCAL_LABEL_PREFIX
1633 *p++ = LOCAL_LABEL_PREFIX;
1634#endif
252b5132
RH
1635 *p++ = 'L';
1636
7c743825
KH
1637 /* Next code just does sprintf( {}, "%d", n); */
1638 /* Label number. */
252b5132
RH
1639 q = symbol_name_temporary;
1640 for (*q++ = 0, i = n; i; ++q)
1641 {
1642 *q = i % 10 + '0';
1643 i /= 10;
1644 }
1645 while ((*p = *--q) != '\0')
1646 ++p;
1647
aa257fcd 1648 *p++ = LOCAL_LABEL_CHAR; /* ^B */
252b5132 1649
7c743825 1650 /* Instance number. */
252b5132
RH
1651 q = symbol_name_temporary;
1652 for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1653 {
1654 *q = i % 10 + '0';
1655 i /= 10;
1656 }
1657 while ((*p++ = *--q) != '\0');;
1658
7c743825 1659 /* The label, as a '\0' ended string, starts at symbol_name_build. */
252b5132 1660 return (symbol_name_build);
7c743825 1661}
252b5132 1662
7c743825
KH
1663/* Decode name that may have been generated by foo_label_name() above.
1664 If the name wasn't generated by foo_label_name(), then return it
1665 unaltered. This is used for error messages. */
252b5132
RH
1666
1667char *
74937d39 1668decode_local_label_name (char *s)
252b5132
RH
1669{
1670 char *p;
1671 char *symbol_decode;
1672 int label_number;
1673 int instance_number;
1674 char *type;
d95767bf 1675 const char *message_format;
aa257fcd 1676 int index = 0;
43ad3147 1677
aa257fcd
NC
1678#ifdef LOCAL_LABEL_PREFIX
1679 if (s[index] == LOCAL_LABEL_PREFIX)
1680 ++index;
1681#endif
43ad3147 1682
aa257fcd 1683 if (s[index] != 'L')
252b5132
RH
1684 return s;
1685
3882b010 1686 for (label_number = 0, p = s + index + 1; ISDIGIT (*p); ++p)
252b5132
RH
1687 label_number = (10 * label_number) + *p - '0';
1688
aa257fcd 1689 if (*p == DOLLAR_LABEL_CHAR)
252b5132 1690 type = "dollar";
aa257fcd 1691 else if (*p == LOCAL_LABEL_CHAR)
252b5132
RH
1692 type = "fb";
1693 else
1694 return s;
1695
3882b010 1696 for (instance_number = 0, p++; ISDIGIT (*p); ++p)
252b5132
RH
1697 instance_number = (10 * instance_number) + *p - '0';
1698
d95767bf 1699 message_format = _("\"%d\" (instance number %d of a %s label)");
252b5132
RH
1700 symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
1701 sprintf (symbol_decode, message_format, label_number, instance_number, type);
1702
1703 return symbol_decode;
1704}
1705
1706/* Get the value of a symbol. */
1707
1708valueT
74937d39 1709S_GET_VALUE (symbolS *s)
252b5132 1710{
49309057 1711 if (LOCAL_SYMBOL_CHECK (s))
ac62c346 1712 return resolve_symbol_value (s);
49309057 1713
ac62c346 1714 if (!s->sy_resolved)
e46d99eb 1715 {
6386f3a7
AM
1716 valueT val = resolve_symbol_value (s);
1717 if (!finalize_syms)
e46d99eb
AM
1718 return val;
1719 }
252b5132
RH
1720 if (s->sy_value.X_op != O_constant)
1721 {
1722 static symbolS *recur;
1723
1724 /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1d3b2b27
AM
1725 may call S_GET_VALUE. We use a static symbol to avoid the
1726 immediate recursion. */
252b5132
RH
1727 if (recur == s)
1728 return (valueT) s->sy_value.X_add_number;
1729 recur = s;
1730 if (! s->sy_resolved
1731 || s->sy_value.X_op != O_symbol
1732 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
0e389e77 1733 as_bad (_("attempt to get value of unresolved symbol `%s'"),
252b5132
RH
1734 S_GET_NAME (s));
1735 recur = NULL;
1736 }
1737 return (valueT) s->sy_value.X_add_number;
1738}
1739
1740/* Set the value of a symbol. */
1741
1742void
74937d39 1743S_SET_VALUE (symbolS *s, valueT val)
252b5132 1744{
49309057
ILT
1745 if (LOCAL_SYMBOL_CHECK (s))
1746 {
bd780143 1747 ((struct local_symbol *) s)->lsy_value = val;
49309057
ILT
1748 return;
1749 }
1750
252b5132
RH
1751 s->sy_value.X_op = O_constant;
1752 s->sy_value.X_add_number = (offsetT) val;
1753 s->sy_value.X_unsigned = 0;
1754}
1755
1756void
74937d39 1757copy_symbol_attributes (symbolS *dest, symbolS *src)
252b5132 1758{
49309057 1759 if (LOCAL_SYMBOL_CHECK (dest))
7f2f689c 1760 dest = local_symbol_convert ((struct local_symbol *) dest);
49309057 1761 if (LOCAL_SYMBOL_CHECK (src))
7f2f689c 1762 src = local_symbol_convert ((struct local_symbol *) src);
49309057 1763
252b5132
RH
1764 /* In an expression, transfer the settings of these flags.
1765 The user can override later, of course. */
1766#define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1767 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
252b5132
RH
1768
1769#ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1770 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1771#endif
1772}
1773
252b5132 1774int
74937d39 1775S_IS_FUNCTION (symbolS *s)
252b5132 1776{
49309057
ILT
1777 flagword flags;
1778
1779 if (LOCAL_SYMBOL_CHECK (s))
1780 return 0;
1781
1782 flags = s->bsym->flags;
252b5132
RH
1783
1784 return (flags & BSF_FUNCTION) != 0;
1785}
1786
1787int
74937d39 1788S_IS_EXTERNAL (symbolS *s)
252b5132 1789{
49309057
ILT
1790 flagword flags;
1791
1792 if (LOCAL_SYMBOL_CHECK (s))
1793 return 0;
1794
1795 flags = s->bsym->flags;
252b5132 1796
7c743825 1797 /* Sanity check. */
252b5132
RH
1798 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1799 abort ();
1800
1801 return (flags & BSF_GLOBAL) != 0;
1802}
1803
1804int
74937d39 1805S_IS_WEAK (symbolS *s)
252b5132 1806{
49309057
ILT
1807 if (LOCAL_SYMBOL_CHECK (s))
1808 return 0;
252b5132
RH
1809 return (s->bsym->flags & BSF_WEAK) != 0;
1810}
1811
1812int
74937d39 1813S_IS_COMMON (symbolS *s)
252b5132 1814{
49309057
ILT
1815 if (LOCAL_SYMBOL_CHECK (s))
1816 return 0;
252b5132
RH
1817 return bfd_is_com_section (s->bsym->section);
1818}
1819
1820int
74937d39 1821S_IS_DEFINED (symbolS *s)
252b5132 1822{
49309057
ILT
1823 if (LOCAL_SYMBOL_CHECK (s))
1824 return ((struct local_symbol *) s)->lsy_section != undefined_section;
252b5132
RH
1825 return s->bsym->section != undefined_section;
1826}
1827
a161fe53
AM
1828
1829#ifndef EXTERN_FORCE_RELOC
1830#define EXTERN_FORCE_RELOC IS_ELF
1831#endif
1832
1833/* Return true for symbols that should not be reduced to section
1834 symbols or eliminated from expressions, because they may be
1835 overridden by the linker. */
1836int
74937d39 1837S_FORCE_RELOC (symbolS *s, int strict)
a161fe53
AM
1838{
1839 if (LOCAL_SYMBOL_CHECK (s))
1840 return ((struct local_symbol *) s)->lsy_section == undefined_section;
1841
ae6063d4
AM
1842 return ((strict
1843 && ((s->bsym->flags & BSF_WEAK) != 0
1844 || (EXTERN_FORCE_RELOC
1845 && (s->bsym->flags & BSF_GLOBAL) != 0)))
a161fe53
AM
1846 || s->bsym->section == undefined_section
1847 || bfd_is_com_section (s->bsym->section));
1848}
1849
252b5132 1850int
74937d39 1851S_IS_DEBUG (symbolS *s)
252b5132 1852{
49309057
ILT
1853 if (LOCAL_SYMBOL_CHECK (s))
1854 return 0;
252b5132
RH
1855 if (s->bsym->flags & BSF_DEBUGGING)
1856 return 1;
1857 return 0;
1858}
1859
1860int
74937d39 1861S_IS_LOCAL (symbolS *s)
252b5132 1862{
49309057 1863 flagword flags;
252b5132
RH
1864 const char *name;
1865
49309057
ILT
1866 if (LOCAL_SYMBOL_CHECK (s))
1867 return 1;
1868
1869 flags = s->bsym->flags;
1870
7c743825 1871 /* Sanity check. */
252b5132
RH
1872 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1873 abort ();
1874
1875 if (bfd_get_section (s->bsym) == reg_section)
1876 return 1;
1877
1878 if (flag_strip_local_absolute
bb82af9f
NC
1879 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1880 the source file even when the object file is stripped. */
1881 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
252b5132
RH
1882 && bfd_get_section (s->bsym) == absolute_section)
1883 return 1;
1884
1885 name = S_GET_NAME (s);
1886 return (name != NULL
1887 && ! S_IS_DEBUG (s)
aa257fcd
NC
1888 && (strchr (name, DOLLAR_LABEL_CHAR)
1889 || strchr (name, LOCAL_LABEL_CHAR)
252b5132
RH
1890 || (! flag_keep_locals
1891 && (bfd_is_local_label (stdoutput, s->bsym)
1892 || (flag_mri
1893 && name[0] == '?'
1894 && name[1] == '?')))));
1895}
1896
252b5132 1897int
74937d39 1898S_IS_STABD (symbolS *s)
252b5132
RH
1899{
1900 return S_GET_NAME (s) == 0;
1901}
1902
9497f5ac
NC
1903int
1904S_IS_VOLATILE (const symbolS *s)
1905{
1906 if (LOCAL_SYMBOL_CHECK (s))
1907 return 0;
1908 return s->sy_volatile;
1909}
1910
1911int
1912S_IS_FORWARD_REF (const symbolS *s)
1913{
1914 if (LOCAL_SYMBOL_CHECK (s))
1915 return 0;
1916 return s->sy_forward_ref;
1917}
1918
9758f3fc 1919const char *
74937d39 1920S_GET_NAME (symbolS *s)
252b5132 1921{
49309057
ILT
1922 if (LOCAL_SYMBOL_CHECK (s))
1923 return ((struct local_symbol *) s)->lsy_name;
252b5132
RH
1924 return s->bsym->name;
1925}
1926
1927segT
74937d39 1928S_GET_SEGMENT (symbolS *s)
252b5132 1929{
49309057
ILT
1930 if (LOCAL_SYMBOL_CHECK (s))
1931 return ((struct local_symbol *) s)->lsy_section;
252b5132
RH
1932 return s->bsym->section;
1933}
1934
1935void
74937d39 1936S_SET_SEGMENT (symbolS *s, segT seg)
252b5132
RH
1937{
1938 /* Don't reassign section symbols. The direct reason is to prevent seg
1939 faults assigning back to const global symbols such as *ABS*, but it
1940 shouldn't happen anyway. */
1941
49309057
ILT
1942 if (LOCAL_SYMBOL_CHECK (s))
1943 {
1944 if (seg == reg_section)
1945 s = local_symbol_convert ((struct local_symbol *) s);
1946 else
1947 {
1948 ((struct local_symbol *) s)->lsy_section = seg;
1949 return;
1950 }
1951 }
1952
252b5132
RH
1953 if (s->bsym->flags & BSF_SECTION_SYM)
1954 {
1955 if (s->bsym->section != seg)
7c743825 1956 abort ();
252b5132
RH
1957 }
1958 else
1959 s->bsym->section = seg;
1960}
1961
1962void
74937d39 1963S_SET_EXTERNAL (symbolS *s)
252b5132 1964{
49309057
ILT
1965 if (LOCAL_SYMBOL_CHECK (s))
1966 s = local_symbol_convert ((struct local_symbol *) s);
252b5132
RH
1967 if ((s->bsym->flags & BSF_WEAK) != 0)
1968 {
1969 /* Let .weak override .global. */
1970 return;
1971 }
4d7c34bf
NC
1972 if (s->bsym->flags & BSF_SECTION_SYM)
1973 {
1974 char * file;
1975 unsigned int line;
d1a6c242 1976
4d7c34bf
NC
1977 /* Do not reassign section symbols. */
1978 as_where (& file, & line);
1979 as_warn_where (file, line,
0e389e77 1980 _("section symbols are already global"));
4d7c34bf
NC
1981 return;
1982 }
252b5132 1983 s->bsym->flags |= BSF_GLOBAL;
7c743825 1984 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
977cdf5a
NC
1985
1986#ifdef USE_UNIQUE
1987 if (! an_external_name && S_GET_NAME(s)[0] != '.')
1988 an_external_name = S_GET_NAME (s);
1989#endif
252b5132
RH
1990}
1991
1992void
74937d39 1993S_CLEAR_EXTERNAL (symbolS *s)
252b5132 1994{
49309057
ILT
1995 if (LOCAL_SYMBOL_CHECK (s))
1996 return;
252b5132
RH
1997 if ((s->bsym->flags & BSF_WEAK) != 0)
1998 {
1999 /* Let .weak override. */
2000 return;
2001 }
2002 s->bsym->flags |= BSF_LOCAL;
7c743825 2003 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
252b5132
RH
2004}
2005
2006void
74937d39 2007S_SET_WEAK (symbolS *s)
252b5132 2008{
49309057
ILT
2009 if (LOCAL_SYMBOL_CHECK (s))
2010 s = local_symbol_convert ((struct local_symbol *) s);
252b5132 2011 s->bsym->flags |= BSF_WEAK;
7c743825 2012 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
252b5132
RH
2013}
2014
00f7efb6 2015void
74937d39 2016S_SET_THREAD_LOCAL (symbolS *s)
00f7efb6
JJ
2017{
2018 if (LOCAL_SYMBOL_CHECK (s))
2019 s = local_symbol_convert ((struct local_symbol *) s);
2020 if (bfd_is_com_section (s->bsym->section)
2021 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
2022 return;
2023 s->bsym->flags |= BSF_THREAD_LOCAL;
2024 if ((s->bsym->flags & BSF_FUNCTION) != 0)
2025 as_bad (_("Accessing function `%s' as thread-local object"),
2026 S_GET_NAME (s));
2027 else if (! bfd_is_und_section (s->bsym->section)
2028 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
2029 as_bad (_("Accessing `%s' as thread-local object"),
2030 S_GET_NAME (s));
2031}
2032
252b5132 2033void
977cdf5a 2034S_SET_NAME (symbolS *s, const char *name)
252b5132 2035{
49309057
ILT
2036 if (LOCAL_SYMBOL_CHECK (s))
2037 {
2038 ((struct local_symbol *) s)->lsy_name = name;
2039 return;
2040 }
252b5132
RH
2041 s->bsym->name = name;
2042}
49309057 2043
9497f5ac
NC
2044void
2045S_SET_VOLATILE (symbolS *s)
2046{
2047 if (LOCAL_SYMBOL_CHECK (s))
2048 s = local_symbol_convert ((struct local_symbol *) s);
2049 s->sy_volatile = 1;
2050}
2051
2052void
2053S_SET_FORWARD_REF (symbolS *s)
2054{
2055 if (LOCAL_SYMBOL_CHECK (s))
2056 s = local_symbol_convert ((struct local_symbol *) s);
2057 s->sy_forward_ref = 1;
2058}
2059
49309057
ILT
2060/* Return the previous symbol in a chain. */
2061
2062symbolS *
74937d39 2063symbol_previous (symbolS *s)
49309057
ILT
2064{
2065 if (LOCAL_SYMBOL_CHECK (s))
2066 abort ();
2067 return s->sy_previous;
2068}
2069
49309057
ILT
2070/* Return the next symbol in a chain. */
2071
2072symbolS *
74937d39 2073symbol_next (symbolS *s)
49309057
ILT
2074{
2075 if (LOCAL_SYMBOL_CHECK (s))
2076 abort ();
2077 return s->sy_next;
2078}
2079
2080/* Return a pointer to the value of a symbol as an expression. */
2081
2082expressionS *
74937d39 2083symbol_get_value_expression (symbolS *s)
49309057
ILT
2084{
2085 if (LOCAL_SYMBOL_CHECK (s))
2086 s = local_symbol_convert ((struct local_symbol *) s);
2087 return &s->sy_value;
2088}
2089
2090/* Set the value of a symbol to an expression. */
2091
2092void
74937d39 2093symbol_set_value_expression (symbolS *s, const expressionS *exp)
49309057
ILT
2094{
2095 if (LOCAL_SYMBOL_CHECK (s))
2096 s = local_symbol_convert ((struct local_symbol *) s);
2097 s->sy_value = *exp;
2098}
2099
be95a9c1
AM
2100/* Return a pointer to the X_add_number component of a symbol. */
2101
514d955d 2102offsetT *
be95a9c1
AM
2103symbol_X_add_number (symbolS *s)
2104{
be95a9c1 2105 if (LOCAL_SYMBOL_CHECK (s))
514d955d 2106 return (offsetT *) &((struct local_symbol *) s)->lsy_value;
be95a9c1 2107
514d955d 2108 return &s->sy_value.X_add_number;
be95a9c1
AM
2109}
2110
b7d6ed97
RH
2111/* Set the value of SYM to the current position in the current segment. */
2112
2113void
74937d39 2114symbol_set_value_now (symbolS *sym)
b7d6ed97
RH
2115{
2116 S_SET_SEGMENT (sym, now_seg);
2117 S_SET_VALUE (sym, frag_now_fix ());
2118 symbol_set_frag (sym, frag_now);
2119}
2120
49309057
ILT
2121/* Set the frag of a symbol. */
2122
2123void
74937d39 2124symbol_set_frag (symbolS *s, fragS *f)
49309057
ILT
2125{
2126 if (LOCAL_SYMBOL_CHECK (s))
2127 {
2128 local_symbol_set_frag ((struct local_symbol *) s, f);
2129 return;
2130 }
2131 s->sy_frag = f;
2132}
2133
2134/* Return the frag of a symbol. */
2135
2136fragS *
74937d39 2137symbol_get_frag (symbolS *s)
49309057
ILT
2138{
2139 if (LOCAL_SYMBOL_CHECK (s))
2140 return local_symbol_get_frag ((struct local_symbol *) s);
2141 return s->sy_frag;
2142}
2143
2144/* Mark a symbol as having been used. */
2145
2146void
74937d39 2147symbol_mark_used (symbolS *s)
49309057
ILT
2148{
2149 if (LOCAL_SYMBOL_CHECK (s))
2150 return;
2151 s->sy_used = 1;
2152}
2153
2154/* Clear the mark of whether a symbol has been used. */
2155
2156void
74937d39 2157symbol_clear_used (symbolS *s)
49309057
ILT
2158{
2159 if (LOCAL_SYMBOL_CHECK (s))
2160 s = local_symbol_convert ((struct local_symbol *) s);
2161 s->sy_used = 0;
2162}
2163
2164/* Return whether a symbol has been used. */
2165
2166int
74937d39 2167symbol_used_p (symbolS *s)
49309057
ILT
2168{
2169 if (LOCAL_SYMBOL_CHECK (s))
2170 return 1;
2171 return s->sy_used;
2172}
2173
2174/* Mark a symbol as having been used in a reloc. */
2175
2176void
74937d39 2177symbol_mark_used_in_reloc (symbolS *s)
49309057
ILT
2178{
2179 if (LOCAL_SYMBOL_CHECK (s))
2180 s = local_symbol_convert ((struct local_symbol *) s);
2181 s->sy_used_in_reloc = 1;
2182}
2183
2184/* Clear the mark of whether a symbol has been used in a reloc. */
2185
2186void
74937d39 2187symbol_clear_used_in_reloc (symbolS *s)
49309057
ILT
2188{
2189 if (LOCAL_SYMBOL_CHECK (s))
2190 return;
2191 s->sy_used_in_reloc = 0;
2192}
2193
2194/* Return whether a symbol has been used in a reloc. */
2195
2196int
74937d39 2197symbol_used_in_reloc_p (symbolS *s)
49309057
ILT
2198{
2199 if (LOCAL_SYMBOL_CHECK (s))
2200 return 0;
2201 return s->sy_used_in_reloc;
2202}
2203
2204/* Mark a symbol as an MRI common symbol. */
2205
2206void
74937d39 2207symbol_mark_mri_common (symbolS *s)
49309057
ILT
2208{
2209 if (LOCAL_SYMBOL_CHECK (s))
2210 s = local_symbol_convert ((struct local_symbol *) s);
2211 s->sy_mri_common = 1;
2212}
2213
2214/* Clear the mark of whether a symbol is an MRI common symbol. */
2215
2216void
74937d39 2217symbol_clear_mri_common (symbolS *s)
49309057
ILT
2218{
2219 if (LOCAL_SYMBOL_CHECK (s))
2220 return;
2221 s->sy_mri_common = 0;
2222}
2223
2224/* Return whether a symbol is an MRI common symbol. */
2225
2226int
74937d39 2227symbol_mri_common_p (symbolS *s)
49309057
ILT
2228{
2229 if (LOCAL_SYMBOL_CHECK (s))
2230 return 0;
2231 return s->sy_mri_common;
2232}
2233
2234/* Mark a symbol as having been written. */
2235
2236void
74937d39 2237symbol_mark_written (symbolS *s)
49309057
ILT
2238{
2239 if (LOCAL_SYMBOL_CHECK (s))
2240 return;
2241 s->written = 1;
2242}
2243
2244/* Clear the mark of whether a symbol has been written. */
2245
2246void
74937d39 2247symbol_clear_written (symbolS *s)
49309057
ILT
2248{
2249 if (LOCAL_SYMBOL_CHECK (s))
2250 return;
2251 s->written = 0;
2252}
2253
2254/* Return whether a symbol has been written. */
2255
2256int
74937d39 2257symbol_written_p (symbolS *s)
49309057
ILT
2258{
2259 if (LOCAL_SYMBOL_CHECK (s))
2260 return 0;
2261 return s->written;
2262}
2263
2264/* Mark a symbol has having been resolved. */
2265
2266void
74937d39 2267symbol_mark_resolved (symbolS *s)
49309057
ILT
2268{
2269 if (LOCAL_SYMBOL_CHECK (s))
2270 {
2271 local_symbol_mark_resolved ((struct local_symbol *) s);
2272 return;
2273 }
2274 s->sy_resolved = 1;
2275}
2276
2277/* Return whether a symbol has been resolved. */
2278
2279int
74937d39 2280symbol_resolved_p (symbolS *s)
49309057
ILT
2281{
2282 if (LOCAL_SYMBOL_CHECK (s))
2283 return local_symbol_resolved_p ((struct local_symbol *) s);
2284 return s->sy_resolved;
2285}
2286
2287/* Return whether a symbol is a section symbol. */
2288
2289int
74937d39 2290symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
49309057
ILT
2291{
2292 if (LOCAL_SYMBOL_CHECK (s))
2293 return 0;
49309057 2294 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
49309057
ILT
2295}
2296
2297/* Return whether a symbol is equated to another symbol. */
2298
2299int
74937d39 2300symbol_equated_p (symbolS *s)
49309057
ILT
2301{
2302 if (LOCAL_SYMBOL_CHECK (s))
2303 return 0;
2304 return s->sy_value.X_op == O_symbol;
2305}
2306
e0890092
AM
2307/* Return whether a symbol is equated to another symbol, and should be
2308 treated specially when writing out relocs. */
2309
2310int
74937d39 2311symbol_equated_reloc_p (symbolS *s)
e0890092
AM
2312{
2313 if (LOCAL_SYMBOL_CHECK (s))
2314 return 0;
2315 /* X_op_symbol, normally not used for O_symbol, is set by
2316 resolve_symbol_value to flag expression syms that have been
2317 equated. */
2318 return (s->sy_value.X_op == O_symbol
7be1c489 2319#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
2320 && ! S_IS_WEAK (s)
2321#endif
e0890092
AM
2322 && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2323 || ! S_IS_DEFINED (s)
2324 || S_IS_COMMON (s)));
2325}
2326
49309057
ILT
2327/* Return whether a symbol has a constant value. */
2328
2329int
74937d39 2330symbol_constant_p (symbolS *s)
49309057
ILT
2331{
2332 if (LOCAL_SYMBOL_CHECK (s))
2333 return 1;
2334 return s->sy_value.X_op == O_constant;
2335}
2336
49309057
ILT
2337/* Return the BFD symbol for a symbol. */
2338
2339asymbol *
74937d39 2340symbol_get_bfdsym (symbolS *s)
49309057
ILT
2341{
2342 if (LOCAL_SYMBOL_CHECK (s))
2343 s = local_symbol_convert ((struct local_symbol *) s);
2344 return s->bsym;
2345}
2346
2347/* Set the BFD symbol for a symbol. */
2348
2349void
74937d39 2350symbol_set_bfdsym (symbolS *s, asymbol *bsym)
49309057
ILT
2351{
2352 if (LOCAL_SYMBOL_CHECK (s))
2353 s = local_symbol_convert ((struct local_symbol *) s);
22fe14ad
NC
2354 /* Usually, it is harmless to reset a symbol to a BFD section
2355 symbol. For example, obj_elf_change_section sets the BFD symbol
2356 of an old symbol with the newly created section symbol. But when
2357 we have multiple sections with the same name, the newly created
2358 section may have the same name as an old section. We check if the
2359 old symbol has been already marked as a section symbol before
2360 resetting it. */
2361 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2362 s->bsym = bsym;
2363 /* else XXX - What do we do now ? */
49309057
ILT
2364}
2365
49309057
ILT
2366#ifdef OBJ_SYMFIELD_TYPE
2367
2368/* Get a pointer to the object format information for a symbol. */
2369
2370OBJ_SYMFIELD_TYPE *
74937d39 2371symbol_get_obj (symbolS *s)
49309057
ILT
2372{
2373 if (LOCAL_SYMBOL_CHECK (s))
2374 s = local_symbol_convert ((struct local_symbol *) s);
2375 return &s->sy_obj;
2376}
2377
2378/* Set the object format information for a symbol. */
2379
2380void
74937d39 2381symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
49309057
ILT
2382{
2383 if (LOCAL_SYMBOL_CHECK (s))
2384 s = local_symbol_convert ((struct local_symbol *) s);
2385 s->sy_obj = *o;
2386}
2387
2388#endif /* OBJ_SYMFIELD_TYPE */
2389
2390#ifdef TC_SYMFIELD_TYPE
2391
2392/* Get a pointer to the processor information for a symbol. */
2393
2394TC_SYMFIELD_TYPE *
74937d39 2395symbol_get_tc (symbolS *s)
49309057
ILT
2396{
2397 if (LOCAL_SYMBOL_CHECK (s))
2398 s = local_symbol_convert ((struct local_symbol *) s);
2399 return &s->sy_tc;
2400}
2401
2402/* Set the processor information for a symbol. */
2403
2404void
74937d39 2405symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
49309057
ILT
2406{
2407 if (LOCAL_SYMBOL_CHECK (s))
2408 s = local_symbol_convert ((struct local_symbol *) s);
2409 s->sy_tc = *o;
2410}
2411
2412#endif /* TC_SYMFIELD_TYPE */
2413
252b5132 2414void
74937d39 2415symbol_begin (void)
252b5132
RH
2416{
2417 symbol_lastP = NULL;
7c743825 2418 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
252b5132 2419 sy_hash = hash_new ();
49309057 2420 local_hash = hash_new ();
252b5132
RH
2421
2422 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
252b5132
RH
2423#if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2424 abs_symbol.bsym = bfd_abs_section.symbol;
252b5132
RH
2425#endif
2426 abs_symbol.sy_value.X_op = O_constant;
2427 abs_symbol.sy_frag = &zero_address_frag;
2428
2429 if (LOCAL_LABELS_FB)
2430 fb_label_init ();
2431}
252b5132
RH
2432\f
2433int indent_level;
2434
2435/* Maximum indent level.
2436 Available for modification inside a gdb session. */
87c245cc 2437static int max_indent_level = 8;
252b5132 2438
252b5132 2439void
74937d39 2440print_symbol_value_1 (FILE *file, symbolS *sym)
252b5132
RH
2441{
2442 const char *name = S_GET_NAME (sym);
2443 if (!name || !name[0])
2444 name = "(unnamed)";
2445 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
49309057
ILT
2446
2447 if (LOCAL_SYMBOL_CHECK (sym))
2448 {
2449 struct local_symbol *locsym = (struct local_symbol *) sym;
2450 if (local_symbol_get_frag (locsym) != &zero_address_frag
2451 && local_symbol_get_frag (locsym) != NULL)
2452 fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2453 if (local_symbol_resolved_p (locsym))
2454 fprintf (file, " resolved");
2455 fprintf (file, " local");
2456 }
2457 else
2458 {
2459 if (sym->sy_frag != &zero_address_frag)
2460 fprintf (file, " frag %lx", (long) sym->sy_frag);
2461 if (sym->written)
2462 fprintf (file, " written");
2463 if (sym->sy_resolved)
2464 fprintf (file, " resolved");
2465 else if (sym->sy_resolving)
2466 fprintf (file, " resolving");
2467 if (sym->sy_used_in_reloc)
2468 fprintf (file, " used-in-reloc");
2469 if (sym->sy_used)
2470 fprintf (file, " used");
2471 if (S_IS_LOCAL (sym))
2472 fprintf (file, " local");
e97b3f28 2473 if (S_IS_EXTERNAL (sym))
49309057
ILT
2474 fprintf (file, " extern");
2475 if (S_IS_DEBUG (sym))
2476 fprintf (file, " debug");
2477 if (S_IS_DEFINED (sym))
2478 fprintf (file, " defined");
2479 }
252b5132 2480 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
49309057 2481 if (symbol_resolved_p (sym))
252b5132
RH
2482 {
2483 segT s = S_GET_SEGMENT (sym);
2484
2485 if (s != undefined_section
411863a4 2486 && s != expr_section)
252b5132
RH
2487 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2488 }
2489 else if (indent_level < max_indent_level
2490 && S_GET_SEGMENT (sym) != undefined_section)
2491 {
2492 indent_level++;
2493 fprintf (file, "\n%*s<", indent_level * 4, "");
49309057
ILT
2494 if (LOCAL_SYMBOL_CHECK (sym))
2495 fprintf (file, "constant %lx",
bd780143 2496 (long) ((struct local_symbol *) sym)->lsy_value);
49309057
ILT
2497 else
2498 print_expr_1 (file, &sym->sy_value);
252b5132
RH
2499 fprintf (file, ">");
2500 indent_level--;
2501 }
2502 fflush (file);
2503}
2504
2505void
74937d39 2506print_symbol_value (symbolS *sym)
252b5132
RH
2507{
2508 indent_level = 0;
2509 print_symbol_value_1 (stderr, sym);
2510 fprintf (stderr, "\n");
2511}
2512
2513static void
74937d39 2514print_binary (FILE *file, const char *name, expressionS *exp)
252b5132
RH
2515{
2516 indent_level++;
2517 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2518 print_symbol_value_1 (file, exp->X_add_symbol);
2519 fprintf (file, ">\n%*s<", indent_level * 4, "");
2520 print_symbol_value_1 (file, exp->X_op_symbol);
2521 fprintf (file, ">");
2522 indent_level--;
2523}
2524
2525void
74937d39 2526print_expr_1 (FILE *file, expressionS *exp)
252b5132
RH
2527{
2528 fprintf (file, "expr %lx ", (long) exp);
2529 switch (exp->X_op)
2530 {
2531 case O_illegal:
2532 fprintf (file, "illegal");
2533 break;
2534 case O_absent:
2535 fprintf (file, "absent");
2536 break;
2537 case O_constant:
2538 fprintf (file, "constant %lx", (long) exp->X_add_number);
2539 break;
2540 case O_symbol:
2541 indent_level++;
2542 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2543 print_symbol_value_1 (file, exp->X_add_symbol);
2544 fprintf (file, ">");
2545 maybe_print_addnum:
2546 if (exp->X_add_number)
2547 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2548 (long) exp->X_add_number);
2549 indent_level--;
2550 break;
2551 case O_register:
2552 fprintf (file, "register #%d", (int) exp->X_add_number);
2553 break;
2554 case O_big:
2555 fprintf (file, "big");
2556 break;
2557 case O_uminus:
2558 fprintf (file, "uminus -<");
2559 indent_level++;
2560 print_symbol_value_1 (file, exp->X_add_symbol);
2561 fprintf (file, ">");
2562 goto maybe_print_addnum;
2563 case O_bit_not:
2564 fprintf (file, "bit_not");
2565 break;
2566 case O_multiply:
2567 print_binary (file, "multiply", exp);
2568 break;
2569 case O_divide:
2570 print_binary (file, "divide", exp);
2571 break;
2572 case O_modulus:
2573 print_binary (file, "modulus", exp);
2574 break;
2575 case O_left_shift:
2576 print_binary (file, "lshift", exp);
2577 break;
2578 case O_right_shift:
2579 print_binary (file, "rshift", exp);
2580 break;
2581 case O_bit_inclusive_or:
2582 print_binary (file, "bit_ior", exp);
2583 break;
2584 case O_bit_exclusive_or:
2585 print_binary (file, "bit_xor", exp);
2586 break;
2587 case O_bit_and:
2588 print_binary (file, "bit_and", exp);
2589 break;
2590 case O_eq:
2591 print_binary (file, "eq", exp);
2592 break;
2593 case O_ne:
2594 print_binary (file, "ne", exp);
2595 break;
2596 case O_lt:
2597 print_binary (file, "lt", exp);
2598 break;
2599 case O_le:
2600 print_binary (file, "le", exp);
2601 break;
2602 case O_ge:
2603 print_binary (file, "ge", exp);
2604 break;
2605 case O_gt:
2606 print_binary (file, "gt", exp);
2607 break;
2608 case O_logical_and:
2609 print_binary (file, "logical_and", exp);
2610 break;
2611 case O_logical_or:
2612 print_binary (file, "logical_or", exp);
2613 break;
2614 case O_add:
2615 indent_level++;
2616 fprintf (file, "add\n%*s<", indent_level * 4, "");
2617 print_symbol_value_1 (file, exp->X_add_symbol);
2618 fprintf (file, ">\n%*s<", indent_level * 4, "");
2619 print_symbol_value_1 (file, exp->X_op_symbol);
2620 fprintf (file, ">");
2621 goto maybe_print_addnum;
2622 case O_subtract:
2623 indent_level++;
2624 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
2625 print_symbol_value_1 (file, exp->X_add_symbol);
2626 fprintf (file, ">\n%*s<", indent_level * 4, "");
2627 print_symbol_value_1 (file, exp->X_op_symbol);
2628 fprintf (file, ">");
2629 goto maybe_print_addnum;
2630 default:
2631 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2632 break;
2633 }
2634 fflush (stdout);
2635}
2636
2637void
74937d39 2638print_expr (expressionS *exp)
252b5132
RH
2639{
2640 print_expr_1 (stderr, exp);
2641 fprintf (stderr, "\n");
2642}
2643
2644void
74937d39 2645symbol_print_statistics (FILE *file)
252b5132
RH
2646{
2647 hash_print_statistics (file, "symbol table", sy_hash);
49309057
ILT
2648 hash_print_statistics (file, "mini local symbol table", local_hash);
2649 fprintf (file, "%lu mini local symbols created, %lu converted\n",
2650 local_symbol_count, local_symbol_conversion_count);
252b5132 2651}
This page took 0.417902 seconds and 4 git commands to generate.