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