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