1 1.1 skrll /* symbols.c -symbol table- 2 1.1.1.12 christos Copyright (C) 1987-2026 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.1.12 christos newsymP->bsym = bsymnew; 795 1.1.1.12 christos 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), &orgsymP->bsym, 799 1.1 skrll bfd_asymbol_bfd (bsymnew), &newsymP->bsym); 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