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