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