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