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