* symbols.c (symbol_find_or_make): Change name to be const.
[deliverable/binutils-gdb.git] / gas / symbols.c
CommitLineData
fecd2382 1/* symbols.c -symbol table-
dacf29ea
KR
2 Copyright (C) 1987, 1990, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
6efd877d 4
a39116f1 5 This file is part of GAS, the GNU Assembler.
6efd877d 6
a39116f1
RP
7 GAS is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
6efd877d 11
a39116f1
RP
12 GAS is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
6efd877d 16
a39116f1
RP
17 You should have received a copy of the GNU General Public License
18 along with GAS; see the file COPYING. If not, write to
1356d77d 19 the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
fecd2382 20
58d4951d 21/* #define DEBUG_SYMS / * to debug symbol list maintenance */
2b68b820 22
6efd877d
KR
23#include <ctype.h>
24
fecd2382
RP
25#include "as.h"
26
27#include "obstack.h" /* For "symbols.h" */
28#include "subsegs.h"
29
1356d77d
ILT
30/* This is non-zero if symbols are case sensitive, which is the
31 default. */
32int symbols_case_sensitive = 1;
33
fecd2382
RP
34#ifndef WORKING_DOT_WORD
35extern int new_broken_words;
36#endif
fecd2382 37
2b68b820
KR
38/* symbol-name => struct symbol pointer */
39static struct hash_control *sy_hash;
fecd2382 40
a39116f1 41/* Below are commented in "symbols.h". */
6efd877d
KR
42symbolS *symbol_rootP;
43symbolS *symbol_lastP;
44symbolS abs_symbol;
fecd2382 45
dacf29ea
KR
46#ifdef DEBUG_SYMS
47#define debug_verify_symchain verify_symbol_chain
48#else
49#define debug_verify_symchain (void)
50#endif
51
6efd877d 52struct obstack notes;
fecd2382 53
85825401 54static void fb_label_init PARAMS ((void));
fecd2382 55
dacf29ea
KR
56/* symbol_new()
57
58 Return a pointer to a new symbol. Die if we can't make a new
59 symbol. Fill in the symbol's values. Add symbol to end of symbol
60 chain.
61
62 This function should be called in the general case of creating a
63 symbol. However, if the output file symbol table has already been
64 set, and you are certain that this symbol won't be wanted in the
65 output file, you can call symbol_create. */
fecd2382 66
6efd877d 67symbolS *
604633ae 68symbol_new (name, segment, valu, frag)
dacf29ea
KR
69 const char *name;
70 segT segment;
71 valueT valu;
72 fragS *frag;
73{
74 symbolS *symbolP = symbol_create (name, segment, valu, frag);
75
76 /*
77 * Link to end of symbol chain.
78 */
79#ifdef BFD_ASSEMBLER
80 {
81 extern int symbol_table_frozen;
82 if (symbol_table_frozen)
83 abort ();
84 }
85#endif
86 symbol_append (symbolP, symbol_lastP, &symbol_rootP, &symbol_lastP);
87 debug_verify_symchain (symbol_rootP, symbol_lastP);
88
89 return symbolP;
90}
91
92symbolS *
93symbol_create (name, segment, valu, frag)
94 const char *name; /* It is copied, the caller can destroy/modify */
6efd877d 95 segT segment; /* Segment identifier (SEG_<something>) */
604633ae 96 valueT valu; /* Symbol value */
6efd877d 97 fragS *frag; /* Associated fragment */
fecd2382 98{
6efd877d
KR
99 unsigned int name_length;
100 char *preserved_copy_of_name;
101 symbolS *symbolP;
102
103 name_length = strlen (name) + 1; /* +1 for \0 */
104 obstack_grow (&notes, name, name_length);
105 preserved_copy_of_name = obstack_finish (&notes);
2b68b820
KR
106#ifdef STRIP_UNDERSCORE
107 if (preserved_copy_of_name[0] == '_')
108 preserved_copy_of_name++;
109#endif
dacf29ea
KR
110
111#ifdef tc_canonicalize_symbol_name
112 preserved_copy_of_name =
113 tc_canonicalize_symbol_name (preserved_copy_of_name);
114#endif
115
1356d77d
ILT
116 if (! symbols_case_sensitive)
117 {
118 unsigned char *s;
119
120 for (s = (unsigned char *) preserved_copy_of_name; *s != '\0'; s++)
121 if (islower (*s))
122 *s = toupper (*s);
123 }
124
6efd877d
KR
125 symbolP = (symbolS *) obstack_alloc (&notes, sizeof (symbolS));
126
127 /* symbol must be born in some fixed state. This seems as good as any. */
128 memset (symbolP, 0, sizeof (symbolS));
129
2b68b820
KR
130#ifdef BFD_ASSEMBLER
131 symbolP->bsym = bfd_make_empty_symbol (stdoutput);
132 assert (symbolP->bsym != 0);
87e48495 133 symbolP->bsym->udata.p = (PTR) symbolP;
2b68b820 134#endif
6efd877d 135 S_SET_NAME (symbolP, preserved_copy_of_name);
6efd877d
KR
136
137 S_SET_SEGMENT (symbolP, segment);
604633ae 138 S_SET_VALUE (symbolP, valu);
dacf29ea 139 symbol_clear_list_pointers (symbolP);
6efd877d
KR
140
141 symbolP->sy_frag = frag;
2b68b820 142#ifndef BFD_ASSEMBLER
6efd877d 143 symbolP->sy_number = ~0;
0cafaab1 144 symbolP->sy_name_offset = (unsigned int) ~0;
2b68b820 145#endif
6efd877d 146
6efd877d
KR
147 obj_symbol_new_hook (symbolP);
148
dacf29ea
KR
149#ifdef tc_symbol_new_hook
150 tc_symbol_new_hook (symbolP);
151#endif
fecd2382 152
2b68b820
KR
153 return symbolP;
154}
fecd2382 155\f
6efd877d 156
fecd2382
RP
157/*
158 * colon()
159 *
160 * We have just seen "<name>:".
161 * Creates a struct symbol unless it already exists.
162 *
163 * Gripes if we are redefining a symbol incompatibly (and ignores it).
164 *
165 */
1356d77d 166symbolS *
6efd877d 167colon (sym_name) /* just seen "x:" - rattle symbols & frags */
2a0f64a5 168 const char *sym_name; /* symbol name, as a cannonical string */
6efd877d 169 /* We copy this string: OK to alter later. */
fecd2382 170{
6efd877d
KR
171 register symbolS *symbolP; /* symbol we are working with */
172
2b68b820
KR
173 /* Sun local labels go out of scope whenever a non-local symbol is
174 defined. */
56dc989a 175 if (LOCAL_LABELS_DOLLAR && *sym_name != 'L')
6efd877d 176 dollar_label_clear ();
6efd877d 177
fecd2382 178#ifndef WORKING_DOT_WORD
6efd877d
KR
179 if (new_broken_words)
180 {
181 struct broken_word *a;
182 int possible_bytes;
183 fragS *frag_tmp;
184 char *frag_opcode;
185
2b68b820
KR
186 extern const int md_short_jump_size;
187 extern const int md_long_jump_size;
188 possible_bytes = (md_short_jump_size
189 + new_broken_words * md_long_jump_size);
6efd877d
KR
190
191 frag_tmp = frag_now;
192 frag_opcode = frag_var (rs_broken_word,
193 possible_bytes,
194 possible_bytes,
195 (relax_substateT) 0,
196 (symbolS *) broken_words,
197 0L,
198 NULL);
199
200 /* We want to store the pointer to where to insert the jump table in the
2b68b820
KR
201 fr_opcode of the rs_broken_word frag. This requires a little
202 hackery. */
203 while (frag_tmp
204 && (frag_tmp->fr_type != rs_broken_word
205 || frag_tmp->fr_opcode))
6efd877d
KR
206 frag_tmp = frag_tmp->fr_next;
207 know (frag_tmp);
208 frag_tmp->fr_opcode = frag_opcode;
209 new_broken_words = 0;
210
211 for (a = broken_words; a && a->dispfrag == 0; a = a->next_broken_word)
212 a->dispfrag = frag_tmp;
213 }
214#endif /* WORKING_DOT_WORD */
215
216 if ((symbolP = symbol_find (sym_name)) != 0)
217 {
2b68b820
KR
218#ifdef RESOLVE_SYMBOL_REDEFINITION
219 if (RESOLVE_SYMBOL_REDEFINITION (symbolP))
1356d77d 220 return symbolP;
2b68b820 221#endif
6efd877d 222 /*
2b68b820
KR
223 * Now check for undefined symbols
224 */
6efd877d
KR
225 if (!S_IS_DEFINED (symbolP))
226 {
227 if (S_GET_VALUE (symbolP) == 0)
228 {
229 symbolP->sy_frag = frag_now;
2b68b820
KR
230#ifdef OBJ_VMS
231 S_GET_OTHER(symbolP) = const_flag;
fecd2382 232#endif
87e48495 233 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
6efd877d 234 S_SET_SEGMENT (symbolP, now_seg);
fecd2382 235#ifdef N_UNDF
6efd877d 236 know (N_UNDF == 0);
fecd2382 237#endif /* if we have one, it better be zero. */
6efd877d
KR
238
239 }
240 else
241 {
242 /*
2b68b820
KR
243 * There are still several cases to check:
244 * A .comm/.lcomm symbol being redefined as
245 * initialized data is OK
246 * A .comm/.lcomm symbol being redefined with
247 * a larger size is also OK
248 *
249 * This only used to be allowed on VMS gas, but Sun cc
250 * on the sparc also depends on it.
251 */
252
253 if (((!S_IS_DEBUG (symbolP)
254 && !S_IS_DEFINED (symbolP)
255 && S_IS_EXTERNAL (symbolP))
256 || S_GET_SEGMENT (symbolP) == bss_section)
257 && (now_seg == data_section
258 || now_seg == S_GET_SEGMENT (symbolP)))
6efd877d
KR
259 {
260 /*
2b68b820
KR
261 * Select which of the 2 cases this is
262 */
263 if (now_seg != data_section)
6efd877d
KR
264 {
265 /*
2b68b820
KR
266 * New .comm for prev .comm symbol.
267 * If the new size is larger we just
268 * change its value. If the new size
269 * is smaller, we ignore this symbol
270 */
6efd877d 271 if (S_GET_VALUE (symbolP)
2b68b820 272 < ((unsigned) frag_now_fix ()))
6efd877d 273 {
2b68b820 274 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
6efd877d
KR
275 }
276 }
277 else
278 {
85825401
ILT
279 /* It is a .comm/.lcomm being converted to initialized
280 data. */
6efd877d 281 symbolP->sy_frag = frag_now;
2b68b820
KR
282#ifdef OBJ_VMS
283 S_GET_OTHER(symbolP) = const_flag;
284#endif /* OBJ_VMS */
285 S_SET_VALUE (symbolP, (valueT) frag_now_fix ());
6efd877d
KR
286 S_SET_SEGMENT (symbolP, now_seg); /* keep N_EXT bit */
287 }
288 }
289 else
290 {
2b68b820
KR
291#if defined (S_GET_OTHER) && defined (S_GET_DESC)
292 as_fatal ("Symbol \"%s\" is already defined as \"%s\"/%d.%d.%ld.",
6efd877d
KR
293 sym_name,
294 segment_name (S_GET_SEGMENT (symbolP)),
2b68b820
KR
295 S_GET_OTHER (symbolP), S_GET_DESC (symbolP),
296 (long) S_GET_VALUE (symbolP));
297#else
58d4951d 298 as_fatal ("Symbol \"%s\" is already defined as \"%s\"/%ld.",
6efd877d
KR
299 sym_name,
300 segment_name (S_GET_SEGMENT (symbolP)),
58d4951d 301 (long) S_GET_VALUE (symbolP));
2b68b820 302#endif
6efd877d
KR
303 }
304 } /* if the undefined symbol has no value */
305 }
306 else
307 {
308 /* Don't blow up if the definition is the same */
309 if (!(frag_now == symbolP->sy_frag
87e48495 310 && S_GET_VALUE (symbolP) == frag_now_fix ()
6efd877d
KR
311 && S_GET_SEGMENT (symbolP) == now_seg))
312 as_fatal ("Symbol %s already defined.", sym_name);
313 } /* if this symbol is not yet defined */
314
315 }
316 else
317 {
87e48495 318 symbolP = symbol_new (sym_name, now_seg, (valueT) frag_now_fix (),
6efd877d 319 frag_now);
2b68b820 320#ifdef OBJ_VMS
6efd877d 321 S_SET_OTHER (symbolP, const_flag);
2b68b820 322#endif /* OBJ_VMS */
fecd2382 323
6efd877d
KR
324 symbol_table_insert (symbolP);
325 } /* if we have seen this symbol before */
1e9cf565 326
1356d77d
ILT
327 if (mri_common_symbol != NULL)
328 {
329 /* This symbol is actually being defined within an MRI common
330 section. This requires special handling. */
331 symbolP->sy_value.X_op = O_symbol;
332 symbolP->sy_value.X_add_symbol = mri_common_symbol;
333 symbolP->sy_value.X_add_number = S_GET_VALUE (mri_common_symbol);
334 symbolP->sy_frag = &zero_address_frag;
335 S_SET_SEGMENT (symbolP, expr_section);
336 symbolP->sy_mri_common = 1;
337 }
338
1e9cf565
ILT
339#ifdef tc_frob_label
340 tc_frob_label (symbolP);
2b68b820 341#endif
1356d77d
ILT
342
343 return symbolP;
1ecd6c4a 344}
fecd2382 345\f
6efd877d 346
fecd2382
RP
347/*
348 * symbol_table_insert()
349 *
350 * Die if we can't insert the symbol.
351 *
352 */
353
6efd877d
KR
354void
355symbol_table_insert (symbolP)
356 symbolS *symbolP;
fecd2382 357{
604633ae 358 register const char *error_string;
6efd877d
KR
359
360 know (symbolP);
361 know (S_GET_NAME (symbolP));
362
0cafaab1 363 if ((error_string = hash_jam (sy_hash, S_GET_NAME (symbolP), (PTR) symbolP)))
6efd877d
KR
364 {
365 as_fatal ("Inserting \"%s\" into symbol table failed: %s",
366 S_GET_NAME (symbolP), error_string);
367 } /* on error */
368} /* symbol_table_insert() */
fecd2382
RP
369\f
370/*
371 * symbol_find_or_make()
372 *
373 * If a symbol name does not exist, create it as undefined, and insert
374 * it into the symbol table. Return a pointer to it.
375 */
6efd877d
KR
376symbolS *
377symbol_find_or_make (name)
73255941 378 const char *name;
fecd2382 379{
6efd877d
KR
380 register symbolS *symbolP;
381
382 symbolP = symbol_find (name);
383
384 if (symbolP == NULL)
385 {
386 symbolP = symbol_make (name);
387
388 symbol_table_insert (symbolP);
389 } /* if symbol wasn't found */
390
391 return (symbolP);
392} /* symbol_find_or_make() */
393
394symbolS *
395symbol_make (name)
2b68b820 396 CONST char *name;
fecd2382 397{
6efd877d
KR
398 symbolS *symbolP;
399
400 /* Let the machine description default it, e.g. for register names. */
2b68b820 401 symbolP = md_undefined_symbol ((char *) name);
6efd877d
KR
402
403 if (!symbolP)
2b68b820 404 symbolP = symbol_new (name, undefined_section, (valueT) 0, &zero_address_frag);
6efd877d
KR
405
406 return (symbolP);
407} /* symbol_make() */
fecd2382
RP
408
409/*
410 * symbol_find()
6efd877d 411 *
fecd2382
RP
412 * Implement symbol table lookup.
413 * In: A symbol's name as a string: '\0' can't be part of a symbol name.
414 * Out: NULL if the name was not in the symbol table, else the address
415 * of a struct symbol associated with that name.
416 */
417
6efd877d
KR
418symbolS *
419symbol_find (name)
2b68b820 420 CONST char *name;
fecd2382 421{
a6c6eaf8 422#ifdef STRIP_UNDERSCORE
6efd877d 423 return (symbol_find_base (name, 1));
a6c6eaf8 424#else /* STRIP_UNDERSCORE */
6efd877d 425 return (symbol_find_base (name, 0));
fecd2382 426#endif /* STRIP_UNDERSCORE */
6efd877d 427} /* symbol_find() */
fecd2382 428
6efd877d
KR
429symbolS *
430symbol_find_base (name, strip_underscore)
2b68b820 431 CONST char *name;
6efd877d 432 int strip_underscore;
fecd2382 433{
6efd877d
KR
434 if (strip_underscore && *name == '_')
435 name++;
dacf29ea
KR
436
437#ifdef tc_canonicalize_symbol_name
438 {
439 char *copy;
440
441 copy = (char *) alloca (strlen (name) + 1);
442 strcpy (copy, name);
443 name = tc_canonicalize_symbol_name (copy);
444 }
445#endif
446
1356d77d
ILT
447 if (! symbols_case_sensitive)
448 {
449 unsigned char *copy;
450
451 copy = (unsigned char *) alloca (strlen (name) + 1);
452 name = (const char *) copy;
453 for (; *copy != '\0'; copy++)
454 if (islower (*copy))
455 *copy = toupper (*copy);
456 }
457
6efd877d 458 return ((symbolS *) hash_find (sy_hash, name));
fecd2382
RP
459}
460
461/*
462 * Once upon a time, symbols were kept in a singly linked list. At
463 * least coff needs to be able to rearrange them from time to time, for
464 * which a doubly linked list is much more convenient. Loic did these
465 * as macros which seemed dangerous to me so they're now functions.
466 * xoxorich.
467 */
468
469/* Link symbol ADDME after symbol TARGET in the chain. */
6efd877d
KR
470void
471symbol_append (addme, target, rootPP, lastPP)
472 symbolS *addme;
473 symbolS *target;
474 symbolS **rootPP;
475 symbolS **lastPP;
fecd2382 476{
6efd877d
KR
477 if (target == NULL)
478 {
479 know (*rootPP == NULL);
480 know (*lastPP == NULL);
481 *rootPP = addme;
482 *lastPP = addme;
483 return;
484 } /* if the list is empty */
485
486 if (target->sy_next != NULL)
487 {
fecd2382 488#ifdef SYMBOLS_NEED_BACKPOINTERS
6efd877d 489 target->sy_next->sy_previous = addme;
fecd2382 490#endif /* SYMBOLS_NEED_BACKPOINTERS */
6efd877d
KR
491 }
492 else
493 {
494 know (*lastPP == target);
495 *lastPP = addme;
496 } /* if we have a next */
497
498 addme->sy_next = target->sy_next;
499 target->sy_next = addme;
500
fecd2382 501#ifdef SYMBOLS_NEED_BACKPOINTERS
6efd877d 502 addme->sy_previous = target;
fecd2382 503#endif /* SYMBOLS_NEED_BACKPOINTERS */
2b68b820 504}
fecd2382 505
dacf29ea
KR
506/* Set the chain pointers of SYMBOL to null. */
507void
508symbol_clear_list_pointers (symbolP)
509 symbolS *symbolP;
510{
511 symbolP->sy_next = NULL;
512#ifdef SYMBOLS_NEED_BACKPOINTERS
513 symbolP->sy_previous = NULL;
514#endif
515}
516
fecd2382
RP
517#ifdef SYMBOLS_NEED_BACKPOINTERS
518/* Remove SYMBOLP from the list. */
6efd877d
KR
519void
520symbol_remove (symbolP, rootPP, lastPP)
521 symbolS *symbolP;
522 symbolS **rootPP;
523 symbolS **lastPP;
fecd2382 524{
6efd877d
KR
525 if (symbolP == *rootPP)
526 {
527 *rootPP = symbolP->sy_next;
528 } /* if it was the root */
529
530 if (symbolP == *lastPP)
531 {
532 *lastPP = symbolP->sy_previous;
533 } /* if it was the tail */
534
535 if (symbolP->sy_next != NULL)
536 {
537 symbolP->sy_next->sy_previous = symbolP->sy_previous;
538 } /* if not last */
539
540 if (symbolP->sy_previous != NULL)
541 {
542 symbolP->sy_previous->sy_next = symbolP->sy_next;
543 } /* if not first */
544
dacf29ea 545 debug_verify_symchain (*rootPP, *lastPP);
2b68b820 546}
fecd2382
RP
547
548/* Link symbol ADDME before symbol TARGET in the chain. */
6efd877d
KR
549void
550symbol_insert (addme, target, rootPP, lastPP)
551 symbolS *addme;
552 symbolS *target;
553 symbolS **rootPP;
554 symbolS **lastPP;
fecd2382 555{
6efd877d
KR
556 if (target->sy_previous != NULL)
557 {
558 target->sy_previous->sy_next = addme;
559 }
560 else
561 {
562 know (*rootPP == target);
563 *rootPP = addme;
564 } /* if not first */
565
566 addme->sy_previous = target->sy_previous;
567 target->sy_previous = addme;
568 addme->sy_next = target;
569
dacf29ea 570 debug_verify_symchain (*rootPP, *lastPP);
2b68b820 571}
6efd877d 572
fecd2382
RP
573#endif /* SYMBOLS_NEED_BACKPOINTERS */
574
6efd877d
KR
575void
576verify_symbol_chain (rootP, lastP)
577 symbolS *rootP;
578 symbolS *lastP;
fecd2382 579{
6efd877d
KR
580 symbolS *symbolP = rootP;
581
582 if (symbolP == NULL)
2b68b820 583 return;
6efd877d
KR
584
585 for (; symbol_next (symbolP) != NULL; symbolP = symbol_next (symbolP))
586 {
fecd2382 587#ifdef SYMBOLS_NEED_BACKPOINTERS
6efd877d 588 know (symbolP->sy_next->sy_previous == symbolP);
2b68b820
KR
589#else
590 /* Walk the list anyways, to make sure pointers are still good. */
604633ae 591 ;
fecd2382 592#endif /* SYMBOLS_NEED_BACKPOINTERS */
2b68b820 593 }
6efd877d 594
2b68b820
KR
595 assert (lastP == symbolP);
596}
6efd877d 597
2b68b820
KR
598void
599verify_symbol_chain_2 (sym)
600 symbolS *sym;
601{
602 symbolS *p = sym, *n = sym;
603#ifdef SYMBOLS_NEED_BACKPOINTERS
604 while (symbol_previous (p))
605 p = symbol_previous (p);
606#endif
607 while (symbol_next (n))
608 n = symbol_next (n);
609 verify_symbol_chain (p, n);
610}
6efd877d 611
5868b1fe
ILT
612/* Resolve the value of a symbol. This is called during the final
613 pass over the symbol table to resolve any symbols with complex
614 values. */
615
616void
617resolve_symbol_value (symp)
618 symbolS *symp;
619{
0cafaab1
ILT
620 int resolved;
621
5868b1fe
ILT
622 if (symp->sy_resolved)
623 return;
624
0cafaab1
ILT
625 resolved = 0;
626
5868b1fe
ILT
627 if (symp->sy_resolving)
628 {
629 as_bad ("Symbol definition loop encountered at %s",
630 S_GET_NAME (symp));
631 S_SET_VALUE (symp, (valueT) 0);
0cafaab1 632 resolved = 1;
5868b1fe
ILT
633 }
634 else
635 {
5ac34ac3
ILT
636 offsetT left, right, val;
637 segT seg_left, seg_right;
638
5868b1fe
ILT
639 symp->sy_resolving = 1;
640
e702f6e6 641 reduce:
5ac34ac3 642 switch (symp->sy_value.X_op)
5868b1fe 643 {
5ac34ac3
ILT
644 case O_absent:
645 S_SET_VALUE (symp, 0);
646 /* Fall through. */
647 case O_constant:
648 S_SET_VALUE (symp, S_GET_VALUE (symp) + symp->sy_frag->fr_address);
649 if (S_GET_SEGMENT (symp) == expr_section)
650 S_SET_SEGMENT (symp, absolute_section);
0cafaab1 651 resolved = 1;
5ac34ac3
ILT
652 break;
653
654 case O_symbol:
5868b1fe
ILT
655 resolve_symbol_value (symp->sy_value.X_add_symbol);
656
1356d77d
ILT
657 if (symp->sy_mri_common)
658 {
659 /* This is a symbol inside an MRI common section. The
660 relocation routines are going to handle it specially.
661 Don't change the value. */
662 S_SET_VALUE (symp, symp->sy_value.X_add_number);
663 resolved = symp->sy_value.X_add_symbol->sy_resolved;
664 break;
665 }
666
87e48495
KR
667#if 0 /* I thought this was needed for some of the i386-svr4 PIC
668 support, but it appears I was wrong, and it breaks rs6000
669 support. */
e702f6e6
KR
670 if (S_GET_SEGMENT (symp->sy_value.X_add_symbol) != undefined_section
671 && S_GET_SEGMENT (symp->sy_value.X_add_symbol) != expr_section)
87e48495 672#endif
e702f6e6
KR
673 {
674 if (symp->sy_value.X_add_number == 0)
675 copy_symbol_attributes (symp, symp->sy_value.X_add_symbol);
676
677 S_SET_VALUE (symp,
678 (symp->sy_value.X_add_number
679 + symp->sy_frag->fr_address
680 + S_GET_VALUE (symp->sy_value.X_add_symbol)));
681 if (S_GET_SEGMENT (symp) == expr_section
682 || S_GET_SEGMENT (symp) == undefined_section)
683 S_SET_SEGMENT (symp,
684 S_GET_SEGMENT (symp->sy_value.X_add_symbol));
685 }
0cafaab1 686 resolved = symp->sy_value.X_add_symbol->sy_resolved;
5ac34ac3
ILT
687 break;
688
689 case O_uminus:
690 case O_bit_not:
691 resolve_symbol_value (symp->sy_value.X_add_symbol);
692 if (symp->sy_value.X_op == O_uminus)
693 val = - S_GET_VALUE (symp->sy_value.X_add_symbol);
694 else
695 val = ~ S_GET_VALUE (symp->sy_value.X_add_symbol);
696 S_SET_VALUE (symp,
697 (val
698 + symp->sy_value.X_add_number
699 + symp->sy_frag->fr_address));
700 if (S_GET_SEGMENT (symp) == expr_section
701 || S_GET_SEGMENT (symp) == undefined_section)
702 S_SET_SEGMENT (symp, absolute_section);
0cafaab1 703 resolved = symp->sy_value.X_add_symbol->sy_resolved;
5ac34ac3
ILT
704 break;
705
e702f6e6 706 case O_add:
e702f6e6
KR
707 resolve_symbol_value (symp->sy_value.X_add_symbol);
708 resolve_symbol_value (symp->sy_value.X_op_symbol);
709 seg_left = S_GET_SEGMENT (symp->sy_value.X_add_symbol);
710 seg_right = S_GET_SEGMENT (symp->sy_value.X_op_symbol);
711 /* This case comes up with PIC support. */
712 {
713 symbolS *s_left = symp->sy_value.X_add_symbol;
714 symbolS *s_right = symp->sy_value.X_op_symbol;
715
716 if (seg_left == absolute_section)
717 {
718 symbolS *t;
719 segT ts;
720 t = s_left;
721 s_left = s_right;
722 s_right = t;
723 ts = seg_left;
724 seg_left = seg_right;
725 seg_right = ts;
726 }
727 if (seg_right == absolute_section
728 && s_right->sy_resolved)
729 {
730 symp->sy_value.X_add_number += S_GET_VALUE (s_right);
731 symp->sy_value.X_op_symbol = 0;
732 symp->sy_value.X_add_symbol = s_left;
733 symp->sy_value.X_op = O_symbol;
734 goto reduce;
735 }
736 }
e702f6e6
KR
737 /* fall through */
738
5ac34ac3
ILT
739 case O_multiply:
740 case O_divide:
741 case O_modulus:
742 case O_left_shift:
743 case O_right_shift:
744 case O_bit_inclusive_or:
745 case O_bit_or_not:
746 case O_bit_exclusive_or:
747 case O_bit_and:
5ac34ac3 748 case O_subtract:
1356d77d
ILT
749 case O_eq:
750 case O_ne:
751 case O_lt:
752 case O_le:
753 case O_ge:
754 case O_gt:
73255941
ILT
755 case O_logical_and:
756 case O_logical_or:
c978e704 757 resolve_symbol_value (symp->sy_value.X_add_symbol);
5ac34ac3
ILT
758 resolve_symbol_value (symp->sy_value.X_op_symbol);
759 seg_left = S_GET_SEGMENT (symp->sy_value.X_add_symbol);
760 seg_right = S_GET_SEGMENT (symp->sy_value.X_op_symbol);
761 if (seg_left != seg_right
762 && seg_left != undefined_section
763 && seg_right != undefined_section)
764 as_bad ("%s is operation on symbols in different sections",
c978e704 765 S_GET_NAME (symp));
5ac34ac3
ILT
766 if ((S_GET_SEGMENT (symp->sy_value.X_add_symbol)
767 != absolute_section)
768 && symp->sy_value.X_op != O_subtract)
769 as_bad ("%s is illegal operation on non-absolute symbols",
770 S_GET_NAME (symp));
771 left = S_GET_VALUE (symp->sy_value.X_add_symbol);
772 right = S_GET_VALUE (symp->sy_value.X_op_symbol);
773 switch (symp->sy_value.X_op)
774 {
775 case O_multiply: val = left * right; break;
776 case O_divide: val = left / right; break;
777 case O_modulus: val = left % right; break;
778 case O_left_shift: val = left << right; break;
779 case O_right_shift: val = left >> right; break;
780 case O_bit_inclusive_or: val = left | right; break;
781 case O_bit_or_not: val = left |~ right; break;
782 case O_bit_exclusive_or: val = left ^ right; break;
783 case O_bit_and: val = left & right; break;
784 case O_add: val = left + right; break;
785 case O_subtract: val = left - right; break;
1356d77d
ILT
786 case O_eq: val = left == right ? ~ (offsetT) 0 : 0;
787 case O_ne: val = left != right ? ~ (offsetT) 0 : 0;
788 case O_lt: val = left < right ? ~ (offsetT) 0 : 0;
789 case O_le: val = left <= right ? ~ (offsetT) 0 : 0;
790 case O_ge: val = left >= right ? ~ (offsetT) 0 : 0;
791 case O_gt: val = left > right ? ~ (offsetT) 0 : 0;
73255941
ILT
792 case O_logical_and: val = left && right; break;
793 case O_logical_or: val = left || right; break;
5ac34ac3
ILT
794 default: abort ();
795 }
c978e704
ILT
796 S_SET_VALUE (symp,
797 (symp->sy_value.X_add_number
798 + symp->sy_frag->fr_address
5ac34ac3
ILT
799 + val));
800 if (S_GET_SEGMENT (symp) == expr_section
801 || S_GET_SEGMENT (symp) == undefined_section)
802 S_SET_SEGMENT (symp, absolute_section);
0cafaab1
ILT
803 resolved = (symp->sy_value.X_add_symbol->sy_resolved
804 && symp->sy_value.X_op_symbol->sy_resolved);
5ac34ac3
ILT
805 break;
806
807 case O_register:
808 case O_big:
809 case O_illegal:
0cafaab1
ILT
810 /* Give an error (below) if not in expr_section. We don't
811 want to worry about expr_section symbols, because they
812 are fictional (they are created as part of expression
813 resolution), and any problems may not actually mean
814 anything. */
5ac34ac3 815 break;
5868b1fe
ILT
816 }
817 }
818
0cafaab1
ILT
819 /* Don't worry if we can't resolve an expr_section symbol. */
820 if (resolved)
821 symp->sy_resolved = 1;
822 else if (S_GET_SEGMENT (symp) != expr_section)
823 {
824 as_bad ("can't resolve value for symbol \"%s\"", S_GET_NAME (symp));
825 symp->sy_resolved = 1;
826 }
5868b1fe
ILT
827}
828
6efd877d
KR
829/* Dollar labels look like a number followed by a dollar sign. Eg, "42$".
830 They are *really* local. That is, they go out of scope whenever we see a
831 label that isn't local. Also, like fb labels, there can be multiple
832 instances of a dollar label. Therefor, we name encode each instance with
833 the instance number, keep a list of defined symbols separate from the real
834 symbol table, and we treat these buggers as a sparse array. */
835
2b68b820
KR
836static long *dollar_labels;
837static long *dollar_label_instances;
838static char *dollar_label_defines;
839static long dollar_label_count;
604633ae 840static unsigned long dollar_label_max;
6efd877d
KR
841
842int
843dollar_label_defined (label)
844 long label;
845{
846 long *i;
847
848 know ((dollar_labels != NULL) || (dollar_label_count == 0));
849
850 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
2b68b820
KR
851 if (*i == label)
852 return dollar_label_defines[i - dollar_labels];
6efd877d
KR
853
854 /* if we get here, label isn't defined */
2b68b820 855 return 0;
6efd877d
KR
856} /* dollar_label_defined() */
857
858static int
859dollar_label_instance (label)
860 long label;
861{
862 long *i;
863
864 know ((dollar_labels != NULL) || (dollar_label_count == 0));
865
866 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
2b68b820
KR
867 if (*i == label)
868 return (dollar_label_instances[i - dollar_labels]);
6efd877d 869
2b68b820
KR
870 /* If we get here, we haven't seen the label before, therefore its instance
871 count is zero. */
872 return 0;
873}
6efd877d
KR
874
875void
876dollar_label_clear ()
877{
604633ae 878 memset (dollar_label_defines, '\0', (unsigned int) dollar_label_count);
2b68b820 879}
6efd877d
KR
880
881#define DOLLAR_LABEL_BUMP_BY 10
882
883void
884define_dollar_label (label)
885 long label;
886{
887 long *i;
888
889 for (i = dollar_labels; i < dollar_labels + dollar_label_count; ++i)
2b68b820
KR
890 if (*i == label)
891 {
892 ++dollar_label_instances[i - dollar_labels];
893 dollar_label_defines[i - dollar_labels] = 1;
894 return;
895 }
6efd877d
KR
896
897 /* if we get to here, we don't have label listed yet. */
898
899 if (dollar_labels == NULL)
900 {
901 dollar_labels = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
902 dollar_label_instances = (long *) xmalloc (DOLLAR_LABEL_BUMP_BY * sizeof (long));
903 dollar_label_defines = xmalloc (DOLLAR_LABEL_BUMP_BY);
904 dollar_label_max = DOLLAR_LABEL_BUMP_BY;
905 dollar_label_count = 0;
6efd877d
KR
906 }
907 else if (dollar_label_count == dollar_label_max)
908 {
909 dollar_label_max += DOLLAR_LABEL_BUMP_BY;
910 dollar_labels = (long *) xrealloc ((char *) dollar_labels,
911 dollar_label_max * sizeof (long));
912 dollar_label_instances = (long *) xrealloc ((char *) dollar_label_instances,
913 dollar_label_max * sizeof (long));
914 dollar_label_defines = xrealloc (dollar_label_defines, dollar_label_max);
915 } /* if we needed to grow */
916
917 dollar_labels[dollar_label_count] = label;
918 dollar_label_instances[dollar_label_count] = 1;
919 dollar_label_defines[dollar_label_count] = 1;
920 ++dollar_label_count;
2b68b820 921}
6efd877d
KR
922
923/*
924 * dollar_label_name()
925 *
926 * Caller must copy returned name: we re-use the area for the next name.
927 *
2b68b820
KR
928 * The mth occurence of label n: is turned into the symbol "Ln^Am"
929 * where n is the label number and m is the instance number. "L" makes
930 * it a label discarded unless debugging and "^A"('\1') ensures no
931 * ordinary symbol SHOULD get the same name as a local label
932 * symbol. The first "4:" is "L4^A1" - the m numbers begin at 1.
6efd877d
KR
933 *
934 * fb labels get the same treatment, except that ^B is used in place of ^A.
935 */
936
937char * /* Return local label name. */
938dollar_label_name (n, augend)
939 register long n; /* we just saw "n$:" : n a number */
940 register int augend; /* 0 for current instance, 1 for new instance */
941{
942 long i;
943 /* Returned to caller, then copied. used for created names ("4f") */
944 static char symbol_name_build[24];
945 register char *p;
946 register char *q;
947 char symbol_name_temporary[20]; /* build up a number, BACKWARDS */
948
949 know (n >= 0);
950 know (augend == 0 || augend == 1);
951 p = symbol_name_build;
952 *p++ = 'L';
953
954 /* Next code just does sprintf( {}, "%d", n); */
955 /* label number */
956 q = symbol_name_temporary;
957 for (*q++ = 0, i = n; i; ++q)
958 {
959 *q = i % 10 + '0';
960 i /= 10;
961 }
962 while ((*p = *--q) != '\0')
963 ++p;
964
965 *p++ = 1; /* ^A */
966
967 /* instance number */
968 q = symbol_name_temporary;
969 for (*q++ = 0, i = dollar_label_instance (n) + augend; i; ++q)
970 {
971 *q = i % 10 + '0';
972 i /= 10;
973 }
974 while ((*p++ = *--q) != '\0');;
975
976 /* The label, as a '\0' ended string, starts at symbol_name_build. */
2b68b820
KR
977 return symbol_name_build;
978}
6efd877d 979
6efd877d
KR
980/*
981 * Sombody else's idea of local labels. They are made by "n:" where n
982 * is any decimal digit. Refer to them with
983 * "nb" for previous (backward) n:
984 * or "nf" for next (forward) n:.
985 *
986 * We do a little better and let n be any number, not just a single digit, but
987 * since the other guy's assembler only does ten, we treat the first ten
988 * specially.
989 *
990 * Like someone else's assembler, we have one set of local label counters for
991 * entire assembly, not one set per (sub)segment like in most assemblers. This
992 * implies that one can refer to a label in another segment, and indeed some
993 * crufty compilers have done just that.
994 *
995 * Since there could be a LOT of these things, treat them as a sparse array.
996 */
997
998#define FB_LABEL_SPECIAL (10)
999
1000static long fb_low_counter[FB_LABEL_SPECIAL];
1001static long *fb_labels;
1002static long *fb_label_instances;
eec0de3f
KR
1003static long fb_label_count;
1004static long fb_label_max;
6efd877d
KR
1005
1006/* this must be more than FB_LABEL_SPECIAL */
1007#define FB_LABEL_BUMP_BY (FB_LABEL_SPECIAL + 6)
1008
1009static void
1010fb_label_init ()
1011{
1012 memset ((void *) fb_low_counter, '\0', sizeof (fb_low_counter));
6efd877d
KR
1013} /* fb_label_init() */
1014
1015/* add one to the instance number of this fb label */
1016void
1017fb_label_instance_inc (label)
1018 long label;
1019{
1020 long *i;
1021
1022 if (label < FB_LABEL_SPECIAL)
1023 {
1024 ++fb_low_counter[label];
1025 return;
1026 }
1027
e154ecf4 1028 if (fb_labels != NULL)
6efd877d 1029 {
e154ecf4
ILT
1030 for (i = fb_labels + FB_LABEL_SPECIAL;
1031 i < fb_labels + fb_label_count; ++i)
6efd877d 1032 {
e154ecf4
ILT
1033 if (*i == label)
1034 {
1035 ++fb_label_instances[i - fb_labels];
1036 return;
1037 } /* if we find it */
1038 } /* for each existing label */
1039 }
6efd877d
KR
1040
1041 /* if we get to here, we don't have label listed yet. */
1042
1043 if (fb_labels == NULL)
1044 {
1045 fb_labels = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1046 fb_label_instances = (long *) xmalloc (FB_LABEL_BUMP_BY * sizeof (long));
1047 fb_label_max = FB_LABEL_BUMP_BY;
1048 fb_label_count = FB_LABEL_SPECIAL;
1049
1050 }
1051 else if (fb_label_count == fb_label_max)
1052 {
1053 fb_label_max += FB_LABEL_BUMP_BY;
1054 fb_labels = (long *) xrealloc ((char *) fb_labels,
1055 fb_label_max * sizeof (long));
1056 fb_label_instances = (long *) xrealloc ((char *) fb_label_instances,
1057 fb_label_max * sizeof (long));
1058 } /* if we needed to grow */
1059
1060 fb_labels[fb_label_count] = label;
1061 fb_label_instances[fb_label_count] = 1;
1062 ++fb_label_count;
1ecd6c4a 1063}
6efd877d
KR
1064
1065static long
1066fb_label_instance (label)
1067 long label;
1068{
1069 long *i;
1070
1071 if (label < FB_LABEL_SPECIAL)
1072 {
1073 return (fb_low_counter[label]);
1074 }
1075
e154ecf4 1076 if (fb_labels != NULL)
6efd877d 1077 {
e154ecf4
ILT
1078 for (i = fb_labels + FB_LABEL_SPECIAL;
1079 i < fb_labels + fb_label_count; ++i)
6efd877d 1080 {
e154ecf4
ILT
1081 if (*i == label)
1082 {
1083 return (fb_label_instances[i - fb_labels]);
1084 } /* if we find it */
1085 } /* for each existing label */
1086 }
6efd877d 1087
e154ecf4
ILT
1088 /* We didn't find the label, so this must be a reference to the
1089 first instance. */
1090 return 0;
2b68b820 1091}
6efd877d
KR
1092
1093/*
1094 * fb_label_name()
1095 *
1096 * Caller must copy returned name: we re-use the area for the next name.
1097 *
2b68b820
KR
1098 * The mth occurence of label n: is turned into the symbol "Ln^Bm"
1099 * where n is the label number and m is the instance number. "L" makes
1100 * it a label discarded unless debugging and "^B"('\2') ensures no
1101 * ordinary symbol SHOULD get the same name as a local label
1102 * symbol. The first "4:" is "L4^B1" - the m numbers begin at 1.
6efd877d 1103 *
2b68b820 1104 * dollar labels get the same treatment, except that ^A is used in place of ^B. */
6efd877d
KR
1105
1106char * /* Return local label name. */
1107fb_label_name (n, augend)
1108 long n; /* we just saw "n:", "nf" or "nb" : n a number */
1109 long augend; /* 0 for nb, 1 for n:, nf */
1110{
1111 long i;
1112 /* Returned to caller, then copied. used for created names ("4f") */
1113 static char symbol_name_build[24];
1114 register char *p;
1115 register char *q;
1116 char symbol_name_temporary[20]; /* build up a number, BACKWARDS */
1117
1118 know (n >= 0);
1119 know (augend == 0 || augend == 1);
1120 p = symbol_name_build;
1121 *p++ = 'L';
1122
1123 /* Next code just does sprintf( {}, "%d", n); */
1124 /* label number */
1125 q = symbol_name_temporary;
1126 for (*q++ = 0, i = n; i; ++q)
1127 {
1128 *q = i % 10 + '0';
1129 i /= 10;
1130 }
1131 while ((*p = *--q) != '\0')
1132 ++p;
1133
1134 *p++ = 2; /* ^B */
1135
1136 /* instance number */
1137 q = symbol_name_temporary;
1138 for (*q++ = 0, i = fb_label_instance (n) + augend; i; ++q)
1139 {
1140 *q = i % 10 + '0';
1141 i /= 10;
1142 }
1143 while ((*p++ = *--q) != '\0');;
1144
1145 /* The label, as a '\0' ended string, starts at symbol_name_build. */
1146 return (symbol_name_build);
1147} /* fb_label_name() */
1148
a6c6eaf8 1149/*
6efd877d
KR
1150 * decode name that may have been generated by foo_label_name() above. If
1151 * the name wasn't generated by foo_label_name(), then return it unaltered.
a6c6eaf8
RP
1152 * This is used for error messages.
1153 */
a39116f1 1154
6efd877d
KR
1155char *
1156decode_local_label_name (s)
1157 char *s;
a6c6eaf8 1158{
6efd877d
KR
1159 char *p;
1160 char *symbol_decode;
1161 int label_number;
1162 int instance_number;
1163 char *type;
1164 const char *message_format = "\"%d\" (instance number %d of a %s label)";
1165
1166 if (s[0] != 'L')
56dc989a 1167 return s;
6efd877d
KR
1168
1169 for (label_number = 0, p = s + 1; isdigit (*p); ++p)
56dc989a 1170 label_number = (10 * label_number) + *p - '0';
6efd877d
KR
1171
1172 if (*p == 1)
56dc989a 1173 type = "dollar";
6efd877d 1174 else if (*p == 2)
56dc989a 1175 type = "fb";
6efd877d 1176 else
56dc989a 1177 return s;
6efd877d 1178
56dc989a
ILT
1179 for (instance_number = 0, p++; isdigit (*p); ++p)
1180 instance_number = (10 * instance_number) + *p - '0';
6efd877d
KR
1181
1182 symbol_decode = obstack_alloc (&notes, strlen (message_format) + 30);
56dc989a 1183 sprintf (symbol_decode, message_format, label_number, instance_number, type);
6efd877d 1184
56dc989a
ILT
1185 return symbol_decode;
1186}
a6c6eaf8 1187
85051959
ILT
1188/* Get the value of a symbol. */
1189
1190valueT
1191S_GET_VALUE (s)
1192 symbolS *s;
1193{
e702f6e6
KR
1194 if (!s->sy_resolved && !s->sy_resolving && s->sy_value.X_op != O_constant)
1195 resolve_symbol_value (s);
5ac34ac3 1196 if (s->sy_value.X_op != O_constant)
5868b1fe 1197 as_bad ("Attempt to get value of unresolved symbol %s", S_GET_NAME (s));
85051959
ILT
1198 return (valueT) s->sy_value.X_add_number;
1199}
1200
1201/* Set the value of a symbol. */
1202
1203void
1204S_SET_VALUE (s, val)
1205 symbolS *s;
1206 valueT val;
1207{
5ac34ac3 1208 s->sy_value.X_op = O_constant;
85051959 1209 s->sy_value.X_add_number = (offsetT) val;
0cafaab1 1210 s->sy_value.X_unsigned = 0;
85051959
ILT
1211}
1212
e702f6e6
KR
1213void
1214copy_symbol_attributes (dest, src)
1215 symbolS *dest, *src;
1216{
1217#ifdef BFD_ASSEMBLER
1218 /* In an expression, transfer the settings of these flags.
1219 The user can override later, of course. */
1220#define COPIED_SYMFLAGS (BSF_FUNCTION)
1221 dest->bsym->flags |= src->bsym->flags & COPIED_SYMFLAGS;
1222#endif
1223
1224#ifdef OBJ_COPY_SYMBOL_ATTRIBUTES
1225 OBJ_COPY_SYMBOL_ATTRIBUTES (dest, src);
1226#endif
1227}
1228
2b68b820
KR
1229#ifdef BFD_ASSEMBLER
1230
1231int
1232S_IS_EXTERNAL (s)
1233 symbolS *s;
1234{
1235 flagword flags = s->bsym->flags;
1236
1237 /* sanity check */
0cafaab1 1238 if (flags & BSF_LOCAL && flags & BSF_GLOBAL)
2b68b820
KR
1239 abort ();
1240
0cafaab1 1241 return (flags & BSF_GLOBAL) != 0;
2b68b820
KR
1242}
1243
1244int
1245S_IS_COMMON (s)
1246 symbolS *s;
1247{
0cafaab1 1248 return bfd_is_com_section (s->bsym->section);
2b68b820
KR
1249}
1250
1251int
1252S_IS_DEFINED (s)
1253 symbolS *s;
1254{
1255 return s->bsym->section != undefined_section;
1256}
1257
1258int
1259S_IS_DEBUG (s)
1260 symbolS *s;
1261{
1262 if (s->bsym->flags & BSF_DEBUGGING)
1263 return 1;
1264 return 0;
1265}
1266
1267int
1268S_IS_LOCAL (s)
1269 symbolS *s;
1270{
1271 flagword flags = s->bsym->flags;
1356d77d 1272 const char *name;
2b68b820
KR
1273
1274 /* sanity check */
0cafaab1 1275 if (flags & BSF_LOCAL && flags & BSF_GLOBAL)
2b68b820
KR
1276 abort ();
1277
2a0f64a5
ILT
1278 if (bfd_get_section (s->bsym) == reg_section)
1279 return 1;
1280
1356d77d
ILT
1281 name = S_GET_NAME (s);
1282 return (name != NULL
2b68b820 1283 && ! S_IS_DEBUG (s)
1356d77d
ILT
1284 && (strchr (name, '\001')
1285 || strchr (name, '\002')
1286 || (! flag_keep_locals
1287 && (LOCAL_LABEL (name)
1288 || (flag_mri
1289 && name[0] == '?'
1290 && name[1] == '?')))));
2b68b820
KR
1291}
1292
1293int
1294S_IS_EXTERN (s)
1295 symbolS *s;
1296{
1297 return S_IS_EXTERNAL (s);
1298}
1299
1300int
1301S_IS_STABD (s)
1302 symbolS *s;
1303{
1304 return S_GET_NAME (s) == 0;
1305}
1306
2b68b820
KR
1307CONST char *
1308S_GET_NAME (s)
1309 symbolS *s;
1310{
1311 return s->bsym->name;
1312}
1313
1314segT
1315S_GET_SEGMENT (s)
1316 symbolS *s;
1317{
1318 return s->bsym->section;
1319}
1320
2b68b820
KR
1321void
1322S_SET_SEGMENT (s, seg)
1323 symbolS *s;
1324 segT seg;
1325{
1326 s->bsym->section = seg;
1327}
1328
1329void
1330S_SET_EXTERNAL (s)
1331 symbolS *s;
1332{
56dc989a
ILT
1333 if ((s->bsym->flags & BSF_WEAK) != 0)
1334 as_warn ("%s already declared as weak", S_GET_NAME (s));
1ecd6c4a
KR
1335 s->bsym->flags |= BSF_GLOBAL;
1336 s->bsym->flags &= ~(BSF_LOCAL|BSF_WEAK);
2b68b820
KR
1337}
1338
1339void
1340S_CLEAR_EXTERNAL (s)
1341 symbolS *s;
1342{
56dc989a
ILT
1343 if ((s->bsym->flags & BSF_WEAK) != 0)
1344 as_warn ("%s already declared as weak", S_GET_NAME (s));
2b68b820 1345 s->bsym->flags |= BSF_LOCAL;
1ecd6c4a
KR
1346 s->bsym->flags &= ~(BSF_GLOBAL|BSF_WEAK);
1347}
1348
1349void
1350S_SET_WEAK (s)
1351 symbolS *s;
1352{
56dc989a
ILT
1353 if ((s->bsym->flags & BSF_GLOBAL) != 0)
1354 as_warn ("%s already declared as global", S_GET_NAME (s));
1ecd6c4a
KR
1355 s->bsym->flags |= BSF_WEAK;
1356 s->bsym->flags &= ~(BSF_GLOBAL|BSF_LOCAL);
2b68b820
KR
1357}
1358
1359void
1360S_SET_NAME (s, name)
1361 symbolS *s;
1362 char *name;
1363{
1364 s->bsym->name = name;
1365}
1366#endif /* BFD_ASSEMBLER */
1367
eec0de3f
KR
1368void
1369symbol_begin ()
1370{
1371 symbol_lastP = NULL;
1372 symbol_rootP = NULL; /* In case we have 0 symbols (!!) */
1373 sy_hash = hash_new ();
dacf29ea 1374
eec0de3f
KR
1375 memset ((char *) (&abs_symbol), '\0', sizeof (abs_symbol));
1376#ifdef BFD_ASSEMBLER
dacf29ea 1377#if defined (EMIT_SECTION_SYMBOLS) || !defined (RELOC_REQUIRES_SYMBOL)
eec0de3f 1378 abs_symbol.bsym = bfd_abs_section.symbol;
dacf29ea 1379#endif
eec0de3f
KR
1380#else
1381 /* Can't initialise a union. Sigh. */
1382 S_SET_SEGMENT (&abs_symbol, absolute_section);
1383#endif
dacf29ea 1384 abs_symbol.sy_value.X_op = O_constant;
db317fe7 1385 abs_symbol.sy_frag = &zero_address_frag;
dacf29ea 1386
56dc989a
ILT
1387 if (LOCAL_LABELS_FB)
1388 fb_label_init ();
eec0de3f
KR
1389}
1390
e702f6e6
KR
1391\f
1392int indent_level;
dacf29ea 1393
56dc989a
ILT
1394#if 0
1395
dacf29ea
KR
1396static void
1397indent ()
1398{
1399 printf ("%*s", indent_level * 4, "");
1400}
1401
56dc989a
ILT
1402#endif
1403
dacf29ea
KR
1404void print_expr_1 PARAMS ((FILE *, expressionS *));
1405void print_symbol_value_1 PARAMS ((FILE *, symbolS *));
1406
1407void
1408print_symbol_value_1 (file, sym)
1409 FILE *file;
1410 symbolS *sym;
1411{
1412 const char *name = S_GET_NAME (sym);
1413 if (!name || !name[0])
1414 name = "(unnamed)";
56dc989a 1415 fprintf (file, "sym %lx %s", (unsigned long) sym, name);
e702f6e6
KR
1416 if (sym->sy_frag != &zero_address_frag)
1417 fprintf (file, " frag %lx", (long) sym->sy_frag);
dacf29ea
KR
1418 if (sym->written)
1419 fprintf (file, " written");
1420 if (sym->sy_resolved)
1421 fprintf (file, " resolved");
e702f6e6 1422 else if (sym->sy_resolving)
dacf29ea
KR
1423 fprintf (file, " resolving");
1424 if (sym->sy_used_in_reloc)
1425 fprintf (file, " used-in-reloc");
1426 if (sym->sy_used)
1427 fprintf (file, " used");
87e48495
KR
1428 if (S_IS_LOCAL (sym))
1429 fprintf (file, " local");
1430 if (S_IS_EXTERN (sym))
1431 fprintf (file, " extern");
1432 if (S_IS_DEBUG (sym))
1433 fprintf (file, " debug");
1434 if (S_IS_DEFINED (sym))
1435 fprintf (file, " defined");
e702f6e6 1436 fprintf (file, " %s", segment_name (S_GET_SEGMENT (sym)));
dacf29ea
KR
1437 if (sym->sy_resolved)
1438 {
e702f6e6
KR
1439 segT s = S_GET_SEGMENT (sym);
1440
1441 if (s != undefined_section
1442 && s != expr_section)
1443 fprintf (file, " %lx", (long) S_GET_VALUE (sym));
dacf29ea 1444 }
e702f6e6 1445 else if (indent_level < 8 && S_GET_SEGMENT (sym) != undefined_section)
dacf29ea
KR
1446 {
1447 indent_level++;
1448 fprintf (file, "\n%*s<", indent_level * 4, "");
1449 print_expr_1 (file, &sym->sy_value);
1450 fprintf (file, ">");
1451 indent_level--;
1452 }
1453 fflush (file);
1454}
1455
1456void
1457print_symbol_value (sym)
1458 symbolS *sym;
1459{
1460 indent_level = 0;
1461 print_symbol_value_1 (stderr, sym);
1462 fprintf (stderr, "\n");
1463}
1464
1465void
1466print_expr_1 (file, exp)
1467 FILE *file;
1468 expressionS *exp;
1469{
1470 fprintf (file, "expr %lx ", (long) exp);
1471 switch (exp->X_op)
1472 {
1473 case O_illegal:
1474 fprintf (file, "illegal");
1475 break;
1476 case O_absent:
1477 fprintf (file, "absent");
1478 break;
1479 case O_constant:
1480 fprintf (file, "constant %lx", (long) exp->X_add_number);
1481 break;
1482 case O_symbol:
1483 indent_level++;
1484 fprintf (file, "symbol\n%*s<", indent_level * 4, "");
1485 print_symbol_value_1 (file, exp->X_add_symbol);
1486 fprintf (file, ">");
1487 maybe_print_addnum:
dacf29ea 1488 if (exp->X_add_number)
e702f6e6 1489 fprintf (file, "\n%*s%lx", indent_level * 4, "",
dacf29ea 1490 (long) exp->X_add_number);
e702f6e6 1491 indent_level--;
dacf29ea
KR
1492 break;
1493 case O_register:
1494 fprintf (file, "register #%d", (int) exp->X_add_number);
1495 break;
1496 case O_big:
1497 fprintf (file, "big");
1498 break;
1499 case O_uminus:
1500 fprintf (file, "uminus -<");
1501 indent_level++;
1502 print_symbol_value_1 (file, exp->X_add_symbol);
1503 fprintf (file, ">");
1504 goto maybe_print_addnum;
1505 case O_bit_not:
1506 fprintf (file, "bit_not");
1507 break;
1508 case O_multiply:
1509 fprintf (file, "multiply");
1510 break;
1511 case O_divide:
1512 fprintf (file, "divide");
1513 break;
1514 case O_modulus:
1515 fprintf (file, "modulus");
1516 break;
1517 case O_left_shift:
1518 fprintf (file, "lshift");
1519 break;
1520 case O_right_shift:
1521 fprintf (file, "rshift");
1522 break;
1523 case O_bit_inclusive_or:
1524 fprintf (file, "bit_ior");
1525 break;
1526 case O_bit_exclusive_or:
1527 fprintf (file, "bit_xor");
1528 break;
1529 case O_bit_and:
1530 fprintf (file, "bit_and");
1531 break;
1356d77d
ILT
1532 case O_eq:
1533 fprintf (file, "eq");
1534 break;
1535 case O_ne:
1536 fprintf (file, "ne");
1537 break;
1538 case O_lt:
1539 fprintf (file, "lt");
1540 break;
1541 case O_le:
1542 fprintf (file, "le");
1543 break;
1544 case O_ge:
1545 fprintf (file, "ge");
1546 break;
1547 case O_gt:
1548 fprintf (file, "gt");
1549 break;
73255941
ILT
1550 case O_logical_and:
1551 fprintf (file, "logical_and");
1552 break;
1553 case O_logical_or:
1554 fprintf (file, "logical_or");
1555 break;
dacf29ea
KR
1556 case O_add:
1557 indent_level++;
1558 fprintf (file, "add\n%*s<", indent_level * 4, "");
1559 print_symbol_value_1 (file, exp->X_add_symbol);
1560 fprintf (file, ">\n%*s<", indent_level * 4, "");
1561 print_symbol_value_1 (file, exp->X_op_symbol);
1562 fprintf (file, ">");
1563 goto maybe_print_addnum;
1564 case O_subtract:
1565 indent_level++;
1566 fprintf (file, "subtract\n%*s<", indent_level * 4, "");
1567 print_symbol_value_1 (file, exp->X_add_symbol);
1568 fprintf (file, ">\n%*s<", indent_level * 4, "");
1569 print_symbol_value_1 (file, exp->X_op_symbol);
1570 fprintf (file, ">");
1571 goto maybe_print_addnum;
1572 default:
1573 fprintf (file, "{unknown opcode %d}", (int) exp->X_op);
1574 break;
1575 }
1576 fflush (stdout);
1577}
1578
1579void
1580print_expr (exp)
1581 expressionS *exp;
1582{
1583 print_expr_1 (stderr, exp);
1584 fprintf (stderr, "\n");
1585}
1586
8b228fe9 1587/* end of symbols.c */
This page took 0.233868 seconds and 4 git commands to generate.