* gdb.texinfo: Correct a merge error introduced by -r 1.286.
[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 {
1785 static symbolS *recur;
1786
1787 /* FIXME: In non BFD assemblers, S_IS_DEFINED and S_IS_COMMON
1d3b2b27
AM
1788 may call S_GET_VALUE. We use a static symbol to avoid the
1789 immediate recursion. */
252b5132
RH
1790 if (recur == s)
1791 return (valueT) s->sy_value.X_add_number;
1792 recur = s;
1793 if (! s->sy_resolved
1794 || s->sy_value.X_op != O_symbol
1795 || (S_IS_DEFINED (s) && ! S_IS_COMMON (s)))
0e389e77 1796 as_bad (_("attempt to get value of unresolved symbol `%s'"),
252b5132
RH
1797 S_GET_NAME (s));
1798 recur = NULL;
1799 }
1800 return (valueT) s->sy_value.X_add_number;
1801}
1802
1803/* Set the value of a symbol. */
1804
1805void
74937d39 1806S_SET_VALUE (symbolS *s, valueT val)
252b5132 1807{
49309057
ILT
1808 if (LOCAL_SYMBOL_CHECK (s))
1809 {
bd780143 1810 ((struct local_symbol *) s)->lsy_value = val;
49309057
ILT
1811 return;
1812 }
1813
252b5132
RH
1814 s->sy_value.X_op = O_constant;
1815 s->sy_value.X_add_number = (offsetT) val;
1816 s->sy_value.X_unsigned = 0;
06e77878 1817 S_CLEAR_WEAKREFR (s);
252b5132
RH
1818}
1819
1820void
74937d39 1821copy_symbol_attributes (symbolS *dest, symbolS *src)
252b5132 1822{
49309057 1823 if (LOCAL_SYMBOL_CHECK (dest))
7f2f689c 1824 dest = local_symbol_convert ((struct local_symbol *) dest);
49309057 1825 if (LOCAL_SYMBOL_CHECK (src))
7f2f689c 1826 src = local_symbol_convert ((struct local_symbol *) src);
49309057 1827
252b5132
RH
1828 /* In an expression, transfer the settings of these flags.
1829 The user can override later, of course. */
1830#define COPIED_SYMFLAGS (BSF_FUNCTION | BSF_OBJECT)
1831 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
252b5132
RH
1832
1833#ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1834 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1835#endif
1836}
1837
252b5132 1838int
74937d39 1839S_IS_FUNCTION (symbolS *s)
252b5132 1840{
49309057
ILT
1841 flagword flags;
1842
1843 if (LOCAL_SYMBOL_CHECK (s))
1844 return 0;
1845
1846 flags = s->bsym->flags;
252b5132
RH
1847
1848 return (flags & BSF_FUNCTION) != 0;
1849}
1850
1851int
74937d39 1852S_IS_EXTERNAL (symbolS *s)
252b5132 1853{
49309057
ILT
1854 flagword flags;
1855
1856 if (LOCAL_SYMBOL_CHECK (s))
1857 return 0;
1858
1859 flags = s->bsym->flags;
252b5132 1860
7c743825 1861 /* Sanity check. */
252b5132
RH
1862 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1863 abort ();
1864
1865 return (flags & BSF_GLOBAL) != 0;
1866}
1867
1868int
74937d39 1869S_IS_WEAK (symbolS *s)
252b5132 1870{
49309057
ILT
1871 if (LOCAL_SYMBOL_CHECK (s))
1872 return 0;
06e77878
AO
1873 /* Conceptually, a weakrefr is weak if the referenced symbol is. We
1874 could probably handle a WEAKREFR as always weak though. E.g., if
1875 the referenced symbol has lost its weak status, there's no reason
1876 to keep handling the weakrefr as if it was weak. */
1877 if (S_IS_WEAKREFR (s))
1878 return S_IS_WEAK (s->sy_value.X_add_symbol);
252b5132
RH
1879 return (s->bsym->flags & BSF_WEAK) != 0;
1880}
1881
06e77878
AO
1882int
1883S_IS_WEAKREFR (symbolS *s)
1884{
1885 if (LOCAL_SYMBOL_CHECK (s))
1886 return 0;
1887 return s->sy_weakrefr != 0;
1888}
1889
1890int
1891S_IS_WEAKREFD (symbolS *s)
1892{
1893 if (LOCAL_SYMBOL_CHECK (s))
1894 return 0;
1895 return s->sy_weakrefd != 0;
1896}
1897
252b5132 1898int
74937d39 1899S_IS_COMMON (symbolS *s)
252b5132 1900{
49309057
ILT
1901 if (LOCAL_SYMBOL_CHECK (s))
1902 return 0;
252b5132
RH
1903 return bfd_is_com_section (s->bsym->section);
1904}
1905
1906int
74937d39 1907S_IS_DEFINED (symbolS *s)
252b5132 1908{
49309057
ILT
1909 if (LOCAL_SYMBOL_CHECK (s))
1910 return ((struct local_symbol *) s)->lsy_section != undefined_section;
252b5132
RH
1911 return s->bsym->section != undefined_section;
1912}
1913
a161fe53
AM
1914
1915#ifndef EXTERN_FORCE_RELOC
1916#define EXTERN_FORCE_RELOC IS_ELF
1917#endif
1918
1919/* Return true for symbols that should not be reduced to section
1920 symbols or eliminated from expressions, because they may be
1921 overridden by the linker. */
1922int
74937d39 1923S_FORCE_RELOC (symbolS *s, int strict)
a161fe53
AM
1924{
1925 if (LOCAL_SYMBOL_CHECK (s))
1926 return ((struct local_symbol *) s)->lsy_section == undefined_section;
1927
ae6063d4
AM
1928 return ((strict
1929 && ((s->bsym->flags & BSF_WEAK) != 0
1930 || (EXTERN_FORCE_RELOC
1931 && (s->bsym->flags & BSF_GLOBAL) != 0)))
a161fe53
AM
1932 || s->bsym->section == undefined_section
1933 || bfd_is_com_section (s->bsym->section));
1934}
1935
252b5132 1936int
74937d39 1937S_IS_DEBUG (symbolS *s)
252b5132 1938{
49309057
ILT
1939 if (LOCAL_SYMBOL_CHECK (s))
1940 return 0;
252b5132
RH
1941 if (s->bsym->flags & BSF_DEBUGGING)
1942 return 1;
1943 return 0;
1944}
1945
1946int
74937d39 1947S_IS_LOCAL (symbolS *s)
252b5132 1948{
49309057 1949 flagword flags;
252b5132
RH
1950 const char *name;
1951
49309057
ILT
1952 if (LOCAL_SYMBOL_CHECK (s))
1953 return 1;
1954
1955 flags = s->bsym->flags;
1956
7c743825 1957 /* Sanity check. */
252b5132
RH
1958 if ((flags & BSF_LOCAL) && (flags & BSF_GLOBAL))
1959 abort ();
1960
1961 if (bfd_get_section (s->bsym) == reg_section)
1962 return 1;
1963
1964 if (flag_strip_local_absolute
bb82af9f
NC
1965 /* Keep BSF_FILE symbols in order to allow debuggers to identify
1966 the source file even when the object file is stripped. */
1967 && (flags & (BSF_GLOBAL | BSF_FILE)) == 0
252b5132
RH
1968 && bfd_get_section (s->bsym) == absolute_section)
1969 return 1;
1970
1971 name = S_GET_NAME (s);
1972 return (name != NULL
1973 && ! S_IS_DEBUG (s)
aa257fcd
NC
1974 && (strchr (name, DOLLAR_LABEL_CHAR)
1975 || strchr (name, LOCAL_LABEL_CHAR)
252b5132
RH
1976 || (! flag_keep_locals
1977 && (bfd_is_local_label (stdoutput, s->bsym)
1978 || (flag_mri
1979 && name[0] == '?'
1980 && name[1] == '?')))));
1981}
1982
252b5132 1983int
74937d39 1984S_IS_STABD (symbolS *s)
252b5132
RH
1985{
1986 return S_GET_NAME (s) == 0;
1987}
1988
9497f5ac
NC
1989int
1990S_IS_VOLATILE (const symbolS *s)
1991{
1992 if (LOCAL_SYMBOL_CHECK (s))
1993 return 0;
1994 return s->sy_volatile;
1995}
1996
1997int
1998S_IS_FORWARD_REF (const symbolS *s)
1999{
2000 if (LOCAL_SYMBOL_CHECK (s))
2001 return 0;
2002 return s->sy_forward_ref;
2003}
2004
9758f3fc 2005const char *
74937d39 2006S_GET_NAME (symbolS *s)
252b5132 2007{
49309057
ILT
2008 if (LOCAL_SYMBOL_CHECK (s))
2009 return ((struct local_symbol *) s)->lsy_name;
252b5132
RH
2010 return s->bsym->name;
2011}
2012
2013segT
74937d39 2014S_GET_SEGMENT (symbolS *s)
252b5132 2015{
49309057
ILT
2016 if (LOCAL_SYMBOL_CHECK (s))
2017 return ((struct local_symbol *) s)->lsy_section;
252b5132
RH
2018 return s->bsym->section;
2019}
2020
2021void
74937d39 2022S_SET_SEGMENT (symbolS *s, segT seg)
252b5132
RH
2023{
2024 /* Don't reassign section symbols. The direct reason is to prevent seg
2025 faults assigning back to const global symbols such as *ABS*, but it
2026 shouldn't happen anyway. */
2027
49309057
ILT
2028 if (LOCAL_SYMBOL_CHECK (s))
2029 {
2030 if (seg == reg_section)
2031 s = local_symbol_convert ((struct local_symbol *) s);
2032 else
2033 {
2034 ((struct local_symbol *) s)->lsy_section = seg;
2035 return;
2036 }
2037 }
2038
252b5132
RH
2039 if (s->bsym->flags & BSF_SECTION_SYM)
2040 {
2041 if (s->bsym->section != seg)
7c743825 2042 abort ();
252b5132
RH
2043 }
2044 else
2045 s->bsym->section = seg;
2046}
2047
2048void
74937d39 2049S_SET_EXTERNAL (symbolS *s)
252b5132 2050{
49309057
ILT
2051 if (LOCAL_SYMBOL_CHECK (s))
2052 s = local_symbol_convert ((struct local_symbol *) s);
252b5132
RH
2053 if ((s->bsym->flags & BSF_WEAK) != 0)
2054 {
2055 /* Let .weak override .global. */
2056 return;
2057 }
4d7c34bf
NC
2058 if (s->bsym->flags & BSF_SECTION_SYM)
2059 {
2060 char * file;
2061 unsigned int line;
d1a6c242 2062
4d7c34bf
NC
2063 /* Do not reassign section symbols. */
2064 as_where (& file, & line);
2065 as_warn_where (file, line,
0e389e77 2066 _("section symbols are already global"));
4d7c34bf
NC
2067 return;
2068 }
252b5132 2069 s->bsym->flags |= BSF_GLOBAL;
7c743825 2070 s->bsym->flags &= ~(BSF_LOCAL | BSF_WEAK);
977cdf5a
NC
2071
2072#ifdef USE_UNIQUE
2073 if (! an_external_name && S_GET_NAME(s)[0] != '.')
2074 an_external_name = S_GET_NAME (s);
2075#endif
252b5132
RH
2076}
2077
2078void
74937d39 2079S_CLEAR_EXTERNAL (symbolS *s)
252b5132 2080{
49309057
ILT
2081 if (LOCAL_SYMBOL_CHECK (s))
2082 return;
252b5132
RH
2083 if ((s->bsym->flags & BSF_WEAK) != 0)
2084 {
2085 /* Let .weak override. */
2086 return;
2087 }
2088 s->bsym->flags |= BSF_LOCAL;
7c743825 2089 s->bsym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
252b5132
RH
2090}
2091
2092void
74937d39 2093S_SET_WEAK (symbolS *s)
252b5132 2094{
49309057
ILT
2095 if (LOCAL_SYMBOL_CHECK (s))
2096 s = local_symbol_convert ((struct local_symbol *) s);
06e77878
AO
2097#ifdef obj_set_weak_hook
2098 obj_set_weak_hook (s);
2099#endif
252b5132 2100 s->bsym->flags |= BSF_WEAK;
7c743825 2101 s->bsym->flags &= ~(BSF_GLOBAL | BSF_LOCAL);
252b5132
RH
2102}
2103
06e77878
AO
2104void
2105S_SET_WEAKREFR (symbolS *s)
2106{
2107 if (LOCAL_SYMBOL_CHECK (s))
2108 s = local_symbol_convert ((struct local_symbol *) s);
2109 s->sy_weakrefr = 1;
2110 /* If the alias was already used, make sure we mark the target as
2111 used as well, otherwise it might be dropped from the symbol
2112 table. This may have unintended side effects if the alias is
2113 later redirected to another symbol, such as keeping the unused
2114 previous target in the symbol table. Since it will be weak, it's
2115 not a big deal. */
2116 if (s->sy_used)
2117 symbol_mark_used (s->sy_value.X_add_symbol);
2118}
2119
2120void
2121S_CLEAR_WEAKREFR (symbolS *s)
2122{
2123 if (LOCAL_SYMBOL_CHECK (s))
2124 return;
2125 s->sy_weakrefr = 0;
2126}
2127
2128void
2129S_SET_WEAKREFD (symbolS *s)
2130{
2131 if (LOCAL_SYMBOL_CHECK (s))
2132 s = local_symbol_convert ((struct local_symbol *) s);
2133 s->sy_weakrefd = 1;
2134 S_SET_WEAK (s);
2135}
2136
2137void
2138S_CLEAR_WEAKREFD (symbolS *s)
2139{
2140 if (LOCAL_SYMBOL_CHECK (s))
2141 return;
2142 if (s->sy_weakrefd)
2143 {
2144 s->sy_weakrefd = 0;
2145 /* If a weakref target symbol is weak, then it was never
2146 referenced directly before, not even in a .global directive,
2147 so decay it to local. If it remains undefined, it will be
2148 later turned into a global, like any other undefined
2149 symbol. */
2150 if (s->bsym->flags & BSF_WEAK)
2151 {
2152#ifdef obj_clear_weak_hook
2153 obj_clear_weak_hook (s);
2154#endif
2155 s->bsym->flags &= ~BSF_WEAK;
2156 s->bsym->flags |= BSF_LOCAL;
2157 }
2158 }
2159}
2160
00f7efb6 2161void
74937d39 2162S_SET_THREAD_LOCAL (symbolS *s)
00f7efb6
JJ
2163{
2164 if (LOCAL_SYMBOL_CHECK (s))
2165 s = local_symbol_convert ((struct local_symbol *) s);
2166 if (bfd_is_com_section (s->bsym->section)
2167 && (s->bsym->flags & BSF_THREAD_LOCAL) != 0)
2168 return;
2169 s->bsym->flags |= BSF_THREAD_LOCAL;
2170 if ((s->bsym->flags & BSF_FUNCTION) != 0)
2171 as_bad (_("Accessing function `%s' as thread-local object"),
2172 S_GET_NAME (s));
2173 else if (! bfd_is_und_section (s->bsym->section)
2174 && (s->bsym->section->flags & SEC_THREAD_LOCAL) == 0)
2175 as_bad (_("Accessing `%s' as thread-local object"),
2176 S_GET_NAME (s));
2177}
2178
252b5132 2179void
977cdf5a 2180S_SET_NAME (symbolS *s, const char *name)
252b5132 2181{
49309057
ILT
2182 if (LOCAL_SYMBOL_CHECK (s))
2183 {
2184 ((struct local_symbol *) s)->lsy_name = name;
2185 return;
2186 }
252b5132
RH
2187 s->bsym->name = name;
2188}
49309057 2189
9497f5ac
NC
2190void
2191S_SET_VOLATILE (symbolS *s)
2192{
2193 if (LOCAL_SYMBOL_CHECK (s))
2194 s = local_symbol_convert ((struct local_symbol *) s);
2195 s->sy_volatile = 1;
2196}
2197
2198void
2199S_SET_FORWARD_REF (symbolS *s)
2200{
2201 if (LOCAL_SYMBOL_CHECK (s))
2202 s = local_symbol_convert ((struct local_symbol *) s);
2203 s->sy_forward_ref = 1;
2204}
2205
49309057
ILT
2206/* Return the previous symbol in a chain. */
2207
2208symbolS *
74937d39 2209symbol_previous (symbolS *s)
49309057
ILT
2210{
2211 if (LOCAL_SYMBOL_CHECK (s))
2212 abort ();
2213 return s->sy_previous;
2214}
2215
49309057
ILT
2216/* Return the next symbol in a chain. */
2217
2218symbolS *
74937d39 2219symbol_next (symbolS *s)
49309057
ILT
2220{
2221 if (LOCAL_SYMBOL_CHECK (s))
2222 abort ();
2223 return s->sy_next;
2224}
2225
2226/* Return a pointer to the value of a symbol as an expression. */
2227
2228expressionS *
74937d39 2229symbol_get_value_expression (symbolS *s)
49309057
ILT
2230{
2231 if (LOCAL_SYMBOL_CHECK (s))
2232 s = local_symbol_convert ((struct local_symbol *) s);
2233 return &s->sy_value;
2234}
2235
2236/* Set the value of a symbol to an expression. */
2237
2238void
74937d39 2239symbol_set_value_expression (symbolS *s, const expressionS *exp)
49309057
ILT
2240{
2241 if (LOCAL_SYMBOL_CHECK (s))
2242 s = local_symbol_convert ((struct local_symbol *) s);
2243 s->sy_value = *exp;
06e77878 2244 S_CLEAR_WEAKREFR (s);
49309057
ILT
2245}
2246
be95a9c1
AM
2247/* Return a pointer to the X_add_number component of a symbol. */
2248
514d955d 2249offsetT *
be95a9c1
AM
2250symbol_X_add_number (symbolS *s)
2251{
be95a9c1 2252 if (LOCAL_SYMBOL_CHECK (s))
514d955d 2253 return (offsetT *) &((struct local_symbol *) s)->lsy_value;
be95a9c1 2254
514d955d 2255 return &s->sy_value.X_add_number;
be95a9c1
AM
2256}
2257
b7d6ed97
RH
2258/* Set the value of SYM to the current position in the current segment. */
2259
2260void
74937d39 2261symbol_set_value_now (symbolS *sym)
b7d6ed97
RH
2262{
2263 S_SET_SEGMENT (sym, now_seg);
2264 S_SET_VALUE (sym, frag_now_fix ());
2265 symbol_set_frag (sym, frag_now);
2266}
2267
49309057
ILT
2268/* Set the frag of a symbol. */
2269
2270void
74937d39 2271symbol_set_frag (symbolS *s, fragS *f)
49309057
ILT
2272{
2273 if (LOCAL_SYMBOL_CHECK (s))
2274 {
2275 local_symbol_set_frag ((struct local_symbol *) s, f);
2276 return;
2277 }
2278 s->sy_frag = f;
06e77878 2279 S_CLEAR_WEAKREFR (s);
49309057
ILT
2280}
2281
2282/* Return the frag of a symbol. */
2283
2284fragS *
74937d39 2285symbol_get_frag (symbolS *s)
49309057
ILT
2286{
2287 if (LOCAL_SYMBOL_CHECK (s))
2288 return local_symbol_get_frag ((struct local_symbol *) s);
2289 return s->sy_frag;
2290}
2291
2292/* Mark a symbol as having been used. */
2293
2294void
74937d39 2295symbol_mark_used (symbolS *s)
49309057
ILT
2296{
2297 if (LOCAL_SYMBOL_CHECK (s))
2298 return;
2299 s->sy_used = 1;
06e77878
AO
2300 if (S_IS_WEAKREFR (s))
2301 symbol_mark_used (s->sy_value.X_add_symbol);
49309057
ILT
2302}
2303
2304/* Clear the mark of whether a symbol has been used. */
2305
2306void
74937d39 2307symbol_clear_used (symbolS *s)
49309057
ILT
2308{
2309 if (LOCAL_SYMBOL_CHECK (s))
2310 s = local_symbol_convert ((struct local_symbol *) s);
2311 s->sy_used = 0;
2312}
2313
2314/* Return whether a symbol has been used. */
2315
2316int
74937d39 2317symbol_used_p (symbolS *s)
49309057
ILT
2318{
2319 if (LOCAL_SYMBOL_CHECK (s))
2320 return 1;
2321 return s->sy_used;
2322}
2323
2324/* Mark a symbol as having been used in a reloc. */
2325
2326void
74937d39 2327symbol_mark_used_in_reloc (symbolS *s)
49309057
ILT
2328{
2329 if (LOCAL_SYMBOL_CHECK (s))
2330 s = local_symbol_convert ((struct local_symbol *) s);
2331 s->sy_used_in_reloc = 1;
2332}
2333
2334/* Clear the mark of whether a symbol has been used in a reloc. */
2335
2336void
74937d39 2337symbol_clear_used_in_reloc (symbolS *s)
49309057
ILT
2338{
2339 if (LOCAL_SYMBOL_CHECK (s))
2340 return;
2341 s->sy_used_in_reloc = 0;
2342}
2343
2344/* Return whether a symbol has been used in a reloc. */
2345
2346int
74937d39 2347symbol_used_in_reloc_p (symbolS *s)
49309057
ILT
2348{
2349 if (LOCAL_SYMBOL_CHECK (s))
2350 return 0;
2351 return s->sy_used_in_reloc;
2352}
2353
2354/* Mark a symbol as an MRI common symbol. */
2355
2356void
74937d39 2357symbol_mark_mri_common (symbolS *s)
49309057
ILT
2358{
2359 if (LOCAL_SYMBOL_CHECK (s))
2360 s = local_symbol_convert ((struct local_symbol *) s);
2361 s->sy_mri_common = 1;
2362}
2363
2364/* Clear the mark of whether a symbol is an MRI common symbol. */
2365
2366void
74937d39 2367symbol_clear_mri_common (symbolS *s)
49309057
ILT
2368{
2369 if (LOCAL_SYMBOL_CHECK (s))
2370 return;
2371 s->sy_mri_common = 0;
2372}
2373
2374/* Return whether a symbol is an MRI common symbol. */
2375
2376int
74937d39 2377symbol_mri_common_p (symbolS *s)
49309057
ILT
2378{
2379 if (LOCAL_SYMBOL_CHECK (s))
2380 return 0;
2381 return s->sy_mri_common;
2382}
2383
2384/* Mark a symbol as having been written. */
2385
2386void
74937d39 2387symbol_mark_written (symbolS *s)
49309057
ILT
2388{
2389 if (LOCAL_SYMBOL_CHECK (s))
2390 return;
2391 s->written = 1;
2392}
2393
2394/* Clear the mark of whether a symbol has been written. */
2395
2396void
74937d39 2397symbol_clear_written (symbolS *s)
49309057
ILT
2398{
2399 if (LOCAL_SYMBOL_CHECK (s))
2400 return;
2401 s->written = 0;
2402}
2403
2404/* Return whether a symbol has been written. */
2405
2406int
74937d39 2407symbol_written_p (symbolS *s)
49309057
ILT
2408{
2409 if (LOCAL_SYMBOL_CHECK (s))
2410 return 0;
2411 return s->written;
2412}
2413
2414/* Mark a symbol has having been resolved. */
2415
2416void
74937d39 2417symbol_mark_resolved (symbolS *s)
49309057
ILT
2418{
2419 if (LOCAL_SYMBOL_CHECK (s))
2420 {
2421 local_symbol_mark_resolved ((struct local_symbol *) s);
2422 return;
2423 }
2424 s->sy_resolved = 1;
2425}
2426
2427/* Return whether a symbol has been resolved. */
2428
2429int
74937d39 2430symbol_resolved_p (symbolS *s)
49309057
ILT
2431{
2432 if (LOCAL_SYMBOL_CHECK (s))
2433 return local_symbol_resolved_p ((struct local_symbol *) s);
2434 return s->sy_resolved;
2435}
2436
2437/* Return whether a symbol is a section symbol. */
2438
2439int
74937d39 2440symbol_section_p (symbolS *s ATTRIBUTE_UNUSED)
49309057
ILT
2441{
2442 if (LOCAL_SYMBOL_CHECK (s))
2443 return 0;
49309057 2444 return (s->bsym->flags & BSF_SECTION_SYM) != 0;
49309057
ILT
2445}
2446
2447/* Return whether a symbol is equated to another symbol. */
2448
2449int
74937d39 2450symbol_equated_p (symbolS *s)
49309057
ILT
2451{
2452 if (LOCAL_SYMBOL_CHECK (s))
2453 return 0;
2454 return s->sy_value.X_op == O_symbol;
2455}
2456
e0890092
AM
2457/* Return whether a symbol is equated to another symbol, and should be
2458 treated specially when writing out relocs. */
2459
2460int
74937d39 2461symbol_equated_reloc_p (symbolS *s)
e0890092
AM
2462{
2463 if (LOCAL_SYMBOL_CHECK (s))
2464 return 0;
2465 /* X_op_symbol, normally not used for O_symbol, is set by
2466 resolve_symbol_value to flag expression syms that have been
2467 equated. */
2468 return (s->sy_value.X_op == O_symbol
7be1c489 2469#if defined (OBJ_COFF) && defined (TE_PE)
977cdf5a
NC
2470 && ! S_IS_WEAK (s)
2471#endif
e0890092
AM
2472 && ((s->sy_resolved && s->sy_value.X_op_symbol != NULL)
2473 || ! S_IS_DEFINED (s)
2474 || S_IS_COMMON (s)));
2475}
2476
49309057
ILT
2477/* Return whether a symbol has a constant value. */
2478
2479int
74937d39 2480symbol_constant_p (symbolS *s)
49309057
ILT
2481{
2482 if (LOCAL_SYMBOL_CHECK (s))
2483 return 1;
2484 return s->sy_value.X_op == O_constant;
2485}
2486
49309057
ILT
2487/* Return the BFD symbol for a symbol. */
2488
2489asymbol *
74937d39 2490symbol_get_bfdsym (symbolS *s)
49309057
ILT
2491{
2492 if (LOCAL_SYMBOL_CHECK (s))
2493 s = local_symbol_convert ((struct local_symbol *) s);
2494 return s->bsym;
2495}
2496
2497/* Set the BFD symbol for a symbol. */
2498
2499void
74937d39 2500symbol_set_bfdsym (symbolS *s, asymbol *bsym)
49309057
ILT
2501{
2502 if (LOCAL_SYMBOL_CHECK (s))
2503 s = local_symbol_convert ((struct local_symbol *) s);
22fe14ad
NC
2504 /* Usually, it is harmless to reset a symbol to a BFD section
2505 symbol. For example, obj_elf_change_section sets the BFD symbol
2506 of an old symbol with the newly created section symbol. But when
2507 we have multiple sections with the same name, the newly created
2508 section may have the same name as an old section. We check if the
2509 old symbol has been already marked as a section symbol before
2510 resetting it. */
2511 if ((s->bsym->flags & BSF_SECTION_SYM) == 0)
2512 s->bsym = bsym;
2513 /* else XXX - What do we do now ? */
49309057
ILT
2514}
2515
49309057
ILT
2516#ifdef OBJ_SYMFIELD_TYPE
2517
2518/* Get a pointer to the object format information for a symbol. */
2519
2520OBJ_SYMFIELD_TYPE *
74937d39 2521symbol_get_obj (symbolS *s)
49309057
ILT
2522{
2523 if (LOCAL_SYMBOL_CHECK (s))
2524 s = local_symbol_convert ((struct local_symbol *) s);
2525 return &s->sy_obj;
2526}
2527
2528/* Set the object format information for a symbol. */
2529
2530void
74937d39 2531symbol_set_obj (symbolS *s, OBJ_SYMFIELD_TYPE *o)
49309057
ILT
2532{
2533 if (LOCAL_SYMBOL_CHECK (s))
2534 s = local_symbol_convert ((struct local_symbol *) s);
2535 s->sy_obj = *o;
2536}
2537
2538#endif /* OBJ_SYMFIELD_TYPE */
2539
2540#ifdef TC_SYMFIELD_TYPE
2541
2542/* Get a pointer to the processor information for a symbol. */
2543
2544TC_SYMFIELD_TYPE *
74937d39 2545symbol_get_tc (symbolS *s)
49309057
ILT
2546{
2547 if (LOCAL_SYMBOL_CHECK (s))
2548 s = local_symbol_convert ((struct local_symbol *) s);
2549 return &s->sy_tc;
2550}
2551
2552/* Set the processor information for a symbol. */
2553
2554void
74937d39 2555symbol_set_tc (symbolS *s, TC_SYMFIELD_TYPE *o)
49309057
ILT
2556{
2557 if (LOCAL_SYMBOL_CHECK (s))
2558 s = local_symbol_convert ((struct local_symbol *) s);
2559 s->sy_tc = *o;
2560}
2561
2562#endif /* TC_SYMFIELD_TYPE */
2563
252b5132 2564void
74937d39 2565symbol_begin (void)
252b5132
RH
2566{
2567 symbol_lastP = NULL;
7c743825 2568 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
252b5132 2569 sy_hash = hash_new ();
49309057 2570 local_hash = hash_new ();
252b5132
RH
2571
2572 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
252b5132
RH
2573#if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
2574 abs_symbol.bsym = bfd_abs_section.symbol;
252b5132
RH
2575#endif
2576 abs_symbol.sy_value.X_op = O_constant;
2577 abs_symbol.sy_frag = &zero_address_frag;
2578
2579 if (LOCAL_LABELS_FB)
2580 fb_label_init ();
2581}
252b5132
RH
2582\f
2583int indent_level;
2584
2585/* Maximum indent level.
2586 Available for modification inside a gdb session. */
87c245cc 2587static int max_indent_level = 8;
252b5132 2588
252b5132 2589void
74937d39 2590print_symbol_value_1 (FILE *file, symbolS *sym)
252b5132
RH
2591{
2592 const char *name = S_GET_NAME (sym);
2593 if (!name || !name[0])
2594 name = "(unnamed)";
2595 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
49309057
ILT
2596
2597 if (LOCAL_SYMBOL_CHECK (sym))
2598 {
2599 struct local_symbol *locsym = (struct local_symbol *) sym;
2600 if (local_symbol_get_frag (locsym) != &zero_address_frag
2601 && local_symbol_get_frag (locsym) != NULL)
2602 fprintf (file, " frag %lx", (long) local_symbol_get_frag (locsym));
2603 if (local_symbol_resolved_p (locsym))
2604 fprintf (file, " resolved");
2605 fprintf (file, " local");
2606 }
2607 else
2608 {
2609 if (sym->sy_frag != &zero_address_frag)
2610 fprintf (file, " frag %lx", (long) sym->sy_frag);
2611 if (sym->written)
2612 fprintf (file, " written");
2613 if (sym->sy_resolved)
2614 fprintf (file, " resolved");
2615 else if (sym->sy_resolving)
2616 fprintf (file, " resolving");
2617 if (sym->sy_used_in_reloc)
2618 fprintf (file, " used-in-reloc");
2619 if (sym->sy_used)
2620 fprintf (file, " used");
2621 if (S_IS_LOCAL (sym))
2622 fprintf (file, " local");
e97b3f28 2623 if (S_IS_EXTERNAL (sym))
49309057 2624 fprintf (file, " extern");
06e77878
AO
2625 if (S_IS_WEAK (sym))
2626 fprintf (file, " weak");
49309057
ILT
2627 if (S_IS_DEBUG (sym))
2628 fprintf (file, " debug");
2629 if (S_IS_DEFINED (sym))
2630 fprintf (file, " defined");
2631 }
06e77878
AO
2632 if (S_IS_WEAKREFR (sym))
2633 fprintf (file, " weakrefr");
2634 if (S_IS_WEAKREFD (sym))
2635 fprintf (file, " weakrefd");
252b5132 2636 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
49309057 2637 if (symbol_resolved_p (sym))
252b5132
RH
2638 {
2639 segT s = S_GET_SEGMENT (sym);
2640
2641 if (s != undefined_section
411863a4 2642 && s != expr_section)
252b5132
RH
2643 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
2644 }
2645 else if (indent_level < max_indent_level
2646 && S_GET_SEGMENT (sym) != undefined_section)
2647 {
2648 indent_level++;
2649 fprintf (file, "\n%*s<", indent_level * 4, "");
49309057
ILT
2650 if (LOCAL_SYMBOL_CHECK (sym))
2651 fprintf (file, "constant %lx",
bd780143 2652 (long) ((struct local_symbol *) sym)->lsy_value);
49309057
ILT
2653 else
2654 print_expr_1 (file, &sym->sy_value);
252b5132
RH
2655 fprintf (file, ">");
2656 indent_level--;
2657 }
2658 fflush (file);
2659}
2660
2661void
74937d39 2662print_symbol_value (symbolS *sym)
252b5132
RH
2663{
2664 indent_level = 0;
2665 print_symbol_value_1 (stderr, sym);
2666 fprintf (stderr, "\n");
2667}
2668
2669static void
74937d39 2670print_binary (FILE *file, const char *name, expressionS *exp)
252b5132
RH
2671{
2672 indent_level++;
2673 fprintf (file, "%s\n%*s<", name, indent_level * 4, "");
2674 print_symbol_value_1 (file, exp->X_add_symbol);
2675 fprintf (file, ">\n%*s<", indent_level * 4, "");
2676 print_symbol_value_1 (file, exp->X_op_symbol);
2677 fprintf (file, ">");
2678 indent_level--;
2679}
2680
2681void
74937d39 2682print_expr_1 (FILE *file, expressionS *exp)
252b5132
RH
2683{
2684 fprintf (file, "expr %lx ", (long) exp);
2685 switch (exp->X_op)
2686 {
2687 case O_illegal:
2688 fprintf (file, "illegal");
2689 break;
2690 case O_absent:
2691 fprintf (file, "absent");
2692 break;
2693 case O_constant:
2694 fprintf (file, "constant %lx", (long) exp->X_add_number);
2695 break;
2696 case O_symbol:
2697 indent_level++;
2698 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
2699 print_symbol_value_1 (file, exp->X_add_symbol);
2700 fprintf (file, ">");
2701 maybe_print_addnum:
2702 if (exp->X_add_number)
2703 fprintf (file, "\n%*s%lx", indent_level * 4, "",
2704 (long) exp->X_add_number);
2705 indent_level--;
2706 break;
2707 case O_register:
2708 fprintf (file, "register #%d", (int) exp->X_add_number);
2709 break;
2710 case O_big:
2711 fprintf (file, "big");
2712 break;
2713 case O_uminus:
2714 fprintf (file, "uminus -<");
2715 indent_level++;
2716 print_symbol_value_1 (file, exp->X_add_symbol);
2717 fprintf (file, ">");
2718 goto maybe_print_addnum;
2719 case O_bit_not:
2720 fprintf (file, "bit_not");
2721 break;
2722 case O_multiply:
2723 print_binary (file, "multiply", exp);
2724 break;
2725 case O_divide:
2726 print_binary (file, "divide", exp);
2727 break;
2728 case O_modulus:
2729 print_binary (file, "modulus", exp);
2730 break;
2731 case O_left_shift:
2732 print_binary (file, "lshift", exp);
2733 break;
2734 case O_right_shift:
2735 print_binary (file, "rshift", exp);
2736 break;
2737 case O_bit_inclusive_or:
2738 print_binary (file, "bit_ior", exp);
2739 break;
2740 case O_bit_exclusive_or:
2741 print_binary (file, "bit_xor", exp);
2742 break;
2743 case O_bit_and:
2744 print_binary (file, "bit_and", exp);
2745 break;
2746 case O_eq:
2747 print_binary (file, "eq", exp);
2748 break;
2749 case O_ne:
2750 print_binary (file, "ne", exp);
2751 break;
2752 case O_lt:
2753 print_binary (file, "lt", exp);
2754 break;
2755 case O_le:
2756 print_binary (file, "le", exp);
2757 break;
2758 case O_ge:
2759 print_binary (file, "ge", exp);
2760 break;
2761 case O_gt:
2762 print_binary (file, "gt", exp);
2763 break;
2764 case O_logical_and:
2765 print_binary (file, "logical_and", exp);
2766 break;
2767 case O_logical_or:
2768 print_binary (file, "logical_or", exp);
2769 break;
2770 case O_add:
2771 indent_level++;
2772 fprintf (file, "add\n%*s<", indent_level * 4, "");
2773 print_symbol_value_1 (file, exp->X_add_symbol);
2774 fprintf (file, ">\n%*s<", indent_level * 4, "");
2775 print_symbol_value_1 (file, exp->X_op_symbol);
2776 fprintf (file, ">");
2777 goto maybe_print_addnum;
2778 case O_subtract:
2779 indent_level++;
2780 fprintf (file, "subtract\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 default:
2787 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
2788 break;
2789 }
2790 fflush (stdout);
2791}
2792
2793void
74937d39 2794print_expr (expressionS *exp)
252b5132
RH
2795{
2796 print_expr_1 (stderr, exp);
2797 fprintf (stderr, "\n");
2798}
2799
2800void
74937d39 2801symbol_print_statistics (FILE *file)
252b5132
RH
2802{
2803 hash_print_statistics (file, "symbol table", sy_hash);
49309057
ILT
2804 hash_print_statistics (file, "mini local symbol table", local_hash);
2805 fprintf (file, "%lu mini local symbols created, %lu converted\n",
2806 local_symbol_count, local_symbol_conversion_count);
252b5132 2807}
This page took 0.415717 seconds and 4 git commands to generate.