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