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