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