1 /* This module handles expression trees. 2 Copyright (C) 1991-2016 Free Software Foundation, Inc. 3 Written by Steve Chamberlain of Cygnus Support <sac (at) cygnus.com>. 4 5 This file is part of the GNU Binutils. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program; if not, write to the Free Software 19 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, 20 MA 02110-1301, USA. */ 21 22 23 /* This module is in charge of working out the contents of expressions. 24 25 It has to keep track of the relative/absness of a symbol etc. This 26 is done by keeping all values in a struct (an etree_value_type) 27 which contains a value, a section to which it is relative and a 28 valid bit. */ 29 30 #include "sysdep.h" 31 #include "bfd.h" 32 #include "bfdlink.h" 33 34 #include "ld.h" 35 #include "ldmain.h" 36 #include "ldmisc.h" 37 #include "ldexp.h" 38 #include "ldlex.h" 39 #include <ldgram.h> 40 #include "ldlang.h" 41 #include "libiberty.h" 42 #include "safe-ctype.h" 43 44 static void exp_fold_tree_1 (etree_type *); 45 static bfd_vma align_n (bfd_vma, bfd_vma); 46 47 segment_type *segments; 48 49 struct ldexp_control expld; 50 51 /* This structure records symbols for which we need to keep track of 52 definedness for use in the DEFINED () test. */ 53 54 struct definedness_hash_entry 55 { 56 struct bfd_hash_entry root; 57 unsigned int by_object : 1; 58 unsigned int by_script : 1; 59 unsigned int iteration : 1; 60 }; 61 62 static struct bfd_hash_table definedness_table; 63 64 /* Print the string representation of the given token. Surround it 65 with spaces if INFIX_P is TRUE. */ 66 67 static void 68 exp_print_token (token_code_type code, int infix_p) 69 { 70 static const struct 71 { 72 token_code_type code; 73 const char *name; 74 } 75 table[] = 76 { 77 { INT, "int" }, 78 { NAME, "NAME" }, 79 { PLUSEQ, "+=" }, 80 { MINUSEQ, "-=" }, 81 { MULTEQ, "*=" }, 82 { DIVEQ, "/=" }, 83 { LSHIFTEQ, "<<=" }, 84 { RSHIFTEQ, ">>=" }, 85 { ANDEQ, "&=" }, 86 { OREQ, "|=" }, 87 { OROR, "||" }, 88 { ANDAND, "&&" }, 89 { EQ, "==" }, 90 { NE, "!=" }, 91 { LE, "<=" }, 92 { GE, ">=" }, 93 { LSHIFT, "<<" }, 94 { RSHIFT, ">>" }, 95 { LOG2CEIL, "LOG2CEIL" }, 96 { ALIGN_K, "ALIGN" }, 97 { BLOCK, "BLOCK" }, 98 { QUAD, "QUAD" }, 99 { SQUAD, "SQUAD" }, 100 { LONG, "LONG" }, 101 { SHORT, "SHORT" }, 102 { BYTE, "BYTE" }, 103 { SECTIONS, "SECTIONS" }, 104 { SIZEOF_HEADERS, "SIZEOF_HEADERS" }, 105 { MEMORY, "MEMORY" }, 106 { DEFINED, "DEFINED" }, 107 { TARGET_K, "TARGET" }, 108 { SEARCH_DIR, "SEARCH_DIR" }, 109 { MAP, "MAP" }, 110 { ENTRY, "ENTRY" }, 111 { NEXT, "NEXT" }, 112 { ALIGNOF, "ALIGNOF" }, 113 { SIZEOF, "SIZEOF" }, 114 { ADDR, "ADDR" }, 115 { LOADADDR, "LOADADDR" }, 116 { CONSTANT, "CONSTANT" }, 117 { ABSOLUTE, "ABSOLUTE" }, 118 { MAX_K, "MAX" }, 119 { MIN_K, "MIN" }, 120 { ASSERT_K, "ASSERT" }, 121 { REL, "relocatable" }, 122 { DATA_SEGMENT_ALIGN, "DATA_SEGMENT_ALIGN" }, 123 { DATA_SEGMENT_RELRO_END, "DATA_SEGMENT_RELRO_END" }, 124 { DATA_SEGMENT_END, "DATA_SEGMENT_END" }, 125 { ORIGIN, "ORIGIN" }, 126 { LENGTH, "LENGTH" }, 127 { SEGMENT_START, "SEGMENT_START" } 128 }; 129 unsigned int idx; 130 131 for (idx = 0; idx < ARRAY_SIZE (table); idx++) 132 if (table[idx].code == code) 133 break; 134 135 if (infix_p) 136 fputc (' ', config.map_file); 137 138 if (idx < ARRAY_SIZE (table)) 139 fputs (table[idx].name, config.map_file); 140 else if (code < 127) 141 fputc (code, config.map_file); 142 else 143 fprintf (config.map_file, "<code %d>", code); 144 145 if (infix_p) 146 fputc (' ', config.map_file); 147 } 148 149 static void 150 make_log2ceil (void) 151 { 152 bfd_vma value = expld.result.value; 153 bfd_vma result = -1; 154 bfd_boolean round_up = FALSE; 155 156 do 157 { 158 result++; 159 /* If more than one bit is set in the value we will need to round up. */ 160 if ((value > 1) && (value & 1)) 161 round_up = TRUE; 162 } 163 while (value >>= 1); 164 165 if (round_up) 166 result += 1; 167 expld.result.section = NULL; 168 expld.result.value = result; 169 } 170 171 static void 172 make_abs (void) 173 { 174 if (expld.result.section != NULL) 175 expld.result.value += expld.result.section->vma; 176 expld.result.section = bfd_abs_section_ptr; 177 } 178 179 static void 180 new_abs (bfd_vma value) 181 { 182 expld.result.valid_p = TRUE; 183 expld.result.section = bfd_abs_section_ptr; 184 expld.result.value = value; 185 expld.result.str = NULL; 186 } 187 188 etree_type * 189 exp_intop (bfd_vma value) 190 { 191 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value)); 192 new_e->type.node_code = INT; 193 new_e->type.filename = ldlex_filename (); 194 new_e->type.lineno = lineno; 195 new_e->value.value = value; 196 new_e->value.str = NULL; 197 new_e->type.node_class = etree_value; 198 return new_e; 199 } 200 201 etree_type * 202 exp_bigintop (bfd_vma value, char *str) 203 { 204 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->value)); 205 new_e->type.node_code = INT; 206 new_e->type.filename = ldlex_filename (); 207 new_e->type.lineno = lineno; 208 new_e->value.value = value; 209 new_e->value.str = str; 210 new_e->type.node_class = etree_value; 211 return new_e; 212 } 213 214 /* Build an expression representing an unnamed relocatable value. */ 215 216 etree_type * 217 exp_relop (asection *section, bfd_vma value) 218 { 219 etree_type *new_e = (etree_type *) stat_alloc (sizeof (new_e->rel)); 220 new_e->type.node_code = REL; 221 new_e->type.filename = ldlex_filename (); 222 new_e->type.lineno = lineno; 223 new_e->type.node_class = etree_rel; 224 new_e->rel.section = section; 225 new_e->rel.value = value; 226 return new_e; 227 } 228 229 static void 230 new_number (bfd_vma value) 231 { 232 expld.result.valid_p = TRUE; 233 expld.result.value = value; 234 expld.result.str = NULL; 235 expld.result.section = NULL; 236 } 237 238 static void 239 new_rel (bfd_vma value, asection *section) 240 { 241 expld.result.valid_p = TRUE; 242 expld.result.value = value; 243 expld.result.str = NULL; 244 expld.result.section = section; 245 } 246 247 static void 248 new_rel_from_abs (bfd_vma value) 249 { 250 expld.result.valid_p = TRUE; 251 expld.result.value = value - expld.section->vma; 252 expld.result.str = NULL; 253 expld.result.section = expld.section; 254 } 255 256 /* New-function for the definedness hash table. */ 257 258 static struct bfd_hash_entry * 259 definedness_newfunc (struct bfd_hash_entry *entry, 260 struct bfd_hash_table *table ATTRIBUTE_UNUSED, 261 const char *name ATTRIBUTE_UNUSED) 262 { 263 struct definedness_hash_entry *ret = (struct definedness_hash_entry *) entry; 264 265 if (ret == NULL) 266 ret = (struct definedness_hash_entry *) 267 bfd_hash_allocate (table, sizeof (struct definedness_hash_entry)); 268 269 if (ret == NULL) 270 einfo (_("%P%F: bfd_hash_allocate failed creating symbol %s\n"), name); 271 272 ret->by_object = 0; 273 ret->by_script = 0; 274 ret->iteration = 0; 275 return &ret->root; 276 } 277 278 /* Called during processing of linker script script expressions. 279 For symbols assigned in a linker script, return a struct describing 280 where the symbol is defined relative to the current expression, 281 otherwise return NULL. */ 282 283 static struct definedness_hash_entry * 284 symbol_defined (const char *name) 285 { 286 return ((struct definedness_hash_entry *) 287 bfd_hash_lookup (&definedness_table, name, FALSE, FALSE)); 288 } 289 290 /* Update the definedness state of NAME. Return FALSE if script symbol 291 is multiply defining a strong symbol in an object. */ 292 293 static bfd_boolean 294 update_definedness (const char *name, struct bfd_link_hash_entry *h) 295 { 296 bfd_boolean ret; 297 struct definedness_hash_entry *defentry 298 = (struct definedness_hash_entry *) 299 bfd_hash_lookup (&definedness_table, name, TRUE, FALSE); 300 301 if (defentry == NULL) 302 einfo (_("%P%F: bfd_hash_lookup failed creating symbol %s\n"), name); 303 304 /* If the symbol was already defined, and not by a script, then it 305 must be defined by an object file or by the linker target code. */ 306 ret = TRUE; 307 if (!defentry->by_script 308 && (h->type == bfd_link_hash_defined 309 || h->type == bfd_link_hash_defweak 310 || h->type == bfd_link_hash_common)) 311 { 312 defentry->by_object = 1; 313 if (h->type == bfd_link_hash_defined 314 && h->u.def.section->output_section != NULL 315 && !h->linker_def) 316 ret = FALSE; 317 } 318 319 defentry->by_script = 1; 320 defentry->iteration = lang_statement_iteration; 321 return ret; 322 } 323 324 static void 325 fold_unary (etree_type *tree) 326 { 327 exp_fold_tree_1 (tree->unary.child); 328 if (expld.result.valid_p) 329 { 330 switch (tree->type.node_code) 331 { 332 case ALIGN_K: 333 if (expld.phase != lang_first_phase_enum) 334 new_rel_from_abs (align_n (expld.dot, expld.result.value)); 335 else 336 expld.result.valid_p = FALSE; 337 break; 338 339 case ABSOLUTE: 340 make_abs (); 341 break; 342 343 case LOG2CEIL: 344 make_log2ceil (); 345 break; 346 347 case '~': 348 expld.result.value = ~expld.result.value; 349 break; 350 351 case '!': 352 expld.result.value = !expld.result.value; 353 break; 354 355 case '-': 356 expld.result.value = -expld.result.value; 357 break; 358 359 case NEXT: 360 /* Return next place aligned to value. */ 361 if (expld.phase != lang_first_phase_enum) 362 { 363 make_abs (); 364 expld.result.value = align_n (expld.dot, expld.result.value); 365 } 366 else 367 expld.result.valid_p = FALSE; 368 break; 369 370 case DATA_SEGMENT_END: 371 if (expld.phase == lang_first_phase_enum 372 || expld.section != bfd_abs_section_ptr) 373 { 374 expld.result.valid_p = FALSE; 375 } 376 else if (expld.dataseg.phase == exp_dataseg_align_seen 377 || expld.dataseg.phase == exp_dataseg_relro_seen) 378 { 379 expld.dataseg.phase = exp_dataseg_end_seen; 380 expld.dataseg.end = expld.result.value; 381 } 382 else if (expld.dataseg.phase == exp_dataseg_done 383 || expld.dataseg.phase == exp_dataseg_adjust 384 || expld.dataseg.phase == exp_dataseg_relro_adjust) 385 { 386 /* OK. */ 387 } 388 else 389 expld.result.valid_p = FALSE; 390 break; 391 392 default: 393 FAIL (); 394 break; 395 } 396 } 397 } 398 399 static void 400 fold_binary (etree_type *tree) 401 { 402 etree_value_type lhs; 403 exp_fold_tree_1 (tree->binary.lhs); 404 405 /* The SEGMENT_START operator is special because its first 406 operand is a string, not the name of a symbol. Note that the 407 operands have been swapped, so binary.lhs is second (default) 408 operand, binary.rhs is first operand. */ 409 if (expld.result.valid_p && tree->type.node_code == SEGMENT_START) 410 { 411 const char *segment_name; 412 segment_type *seg; 413 414 /* Check to see if the user has overridden the default 415 value. */ 416 segment_name = tree->binary.rhs->name.name; 417 for (seg = segments; seg; seg = seg->next) 418 if (strcmp (seg->name, segment_name) == 0) 419 { 420 if (!seg->used 421 && config.magic_demand_paged 422 && (seg->value % config.maxpagesize) != 0) 423 einfo (_("%P: warning: address of `%s' " 424 "isn't multiple of maximum page size\n"), 425 segment_name); 426 seg->used = TRUE; 427 new_rel_from_abs (seg->value); 428 break; 429 } 430 return; 431 } 432 433 lhs = expld.result; 434 exp_fold_tree_1 (tree->binary.rhs); 435 expld.result.valid_p &= lhs.valid_p; 436 437 if (expld.result.valid_p) 438 { 439 if (lhs.section != expld.result.section) 440 { 441 /* If the values are from different sections, and neither is 442 just a number, make both the source arguments absolute. */ 443 if (expld.result.section != NULL 444 && lhs.section != NULL) 445 { 446 make_abs (); 447 lhs.value += lhs.section->vma; 448 lhs.section = bfd_abs_section_ptr; 449 } 450 451 /* If the rhs is just a number, keep the lhs section. */ 452 else if (expld.result.section == NULL) 453 { 454 expld.result.section = lhs.section; 455 /* Make this NULL so that we know one of the operands 456 was just a number, for later tests. */ 457 lhs.section = NULL; 458 } 459 } 460 /* At this point we know that both operands have the same 461 section, or at least one of them is a plain number. */ 462 463 switch (tree->type.node_code) 464 { 465 /* Arithmetic operators, bitwise AND, bitwise OR and XOR 466 keep the section of one of their operands only when the 467 other operand is a plain number. Losing the section when 468 operating on two symbols, ie. a result of a plain number, 469 is required for subtraction and XOR. It's justifiable 470 for the other operations on the grounds that adding, 471 multiplying etc. two section relative values does not 472 really make sense unless they are just treated as 473 numbers. 474 The same argument could be made for many expressions 475 involving one symbol and a number. For example, 476 "1 << x" and "100 / x" probably should not be given the 477 section of x. The trouble is that if we fuss about such 478 things the rules become complex and it is onerous to 479 document ld expression evaluation. */ 480 #define BOP(x, y) \ 481 case x: \ 482 expld.result.value = lhs.value y expld.result.value; \ 483 if (expld.result.section == lhs.section) \ 484 expld.result.section = NULL; \ 485 break; 486 487 /* Comparison operators, logical AND, and logical OR always 488 return a plain number. */ 489 #define BOPN(x, y) \ 490 case x: \ 491 expld.result.value = lhs.value y expld.result.value; \ 492 expld.result.section = NULL; \ 493 break; 494 495 BOP ('+', +); 496 BOP ('*', *); 497 BOP ('-', -); 498 BOP (LSHIFT, <<); 499 BOP (RSHIFT, >>); 500 BOP ('&', &); 501 BOP ('^', ^); 502 BOP ('|', |); 503 BOPN (EQ, ==); 504 BOPN (NE, !=); 505 BOPN ('<', <); 506 BOPN ('>', >); 507 BOPN (LE, <=); 508 BOPN (GE, >=); 509 BOPN (ANDAND, &&); 510 BOPN (OROR, ||); 511 512 case '%': 513 if (expld.result.value != 0) 514 expld.result.value = ((bfd_signed_vma) lhs.value 515 % (bfd_signed_vma) expld.result.value); 516 else if (expld.phase != lang_mark_phase_enum) 517 einfo (_("%F%S %% by zero\n"), tree->binary.rhs); 518 if (expld.result.section == lhs.section) 519 expld.result.section = NULL; 520 break; 521 522 case '/': 523 if (expld.result.value != 0) 524 expld.result.value = ((bfd_signed_vma) lhs.value 525 / (bfd_signed_vma) expld.result.value); 526 else if (expld.phase != lang_mark_phase_enum) 527 einfo (_("%F%S / by zero\n"), tree->binary.rhs); 528 if (expld.result.section == lhs.section) 529 expld.result.section = NULL; 530 break; 531 532 case MAX_K: 533 if (lhs.value > expld.result.value) 534 expld.result.value = lhs.value; 535 break; 536 537 case MIN_K: 538 if (lhs.value < expld.result.value) 539 expld.result.value = lhs.value; 540 break; 541 542 case ALIGN_K: 543 expld.result.value = align_n (lhs.value, expld.result.value); 544 break; 545 546 case DATA_SEGMENT_ALIGN: 547 expld.dataseg.relro = exp_dataseg_relro_start; 548 if (expld.phase == lang_first_phase_enum 549 || expld.section != bfd_abs_section_ptr) 550 expld.result.valid_p = FALSE; 551 else 552 { 553 bfd_vma maxpage = lhs.value; 554 bfd_vma commonpage = expld.result.value; 555 556 expld.result.value = align_n (expld.dot, maxpage); 557 if (expld.dataseg.phase == exp_dataseg_relro_adjust) 558 expld.result.value = expld.dataseg.base; 559 else if (expld.dataseg.phase == exp_dataseg_adjust) 560 { 561 if (commonpage < maxpage) 562 expld.result.value += ((expld.dot + commonpage - 1) 563 & (maxpage - commonpage)); 564 } 565 else 566 { 567 expld.result.value += expld.dot & (maxpage - 1); 568 if (expld.dataseg.phase == exp_dataseg_done) 569 { 570 /* OK. */ 571 } 572 else if (expld.dataseg.phase == exp_dataseg_none) 573 { 574 expld.dataseg.phase = exp_dataseg_align_seen; 575 expld.dataseg.base = expld.result.value; 576 expld.dataseg.pagesize = commonpage; 577 expld.dataseg.maxpagesize = maxpage; 578 expld.dataseg.relro_end = 0; 579 } 580 else 581 expld.result.valid_p = FALSE; 582 } 583 } 584 break; 585 586 case DATA_SEGMENT_RELRO_END: 587 /* Operands swapped! DATA_SEGMENT_RELRO_END(offset,exp) 588 has offset in expld.result and exp in lhs. */ 589 expld.dataseg.relro = exp_dataseg_relro_end; 590 expld.dataseg.relro_offset = expld.result.value; 591 if (expld.phase == lang_first_phase_enum 592 || expld.section != bfd_abs_section_ptr) 593 expld.result.valid_p = FALSE; 594 else if (expld.dataseg.phase == exp_dataseg_align_seen 595 || expld.dataseg.phase == exp_dataseg_adjust 596 || expld.dataseg.phase == exp_dataseg_relro_adjust 597 || expld.dataseg.phase == exp_dataseg_done) 598 { 599 if (expld.dataseg.phase == exp_dataseg_align_seen 600 || expld.dataseg.phase == exp_dataseg_relro_adjust) 601 expld.dataseg.relro_end = lhs.value + expld.result.value; 602 603 if (expld.dataseg.phase == exp_dataseg_relro_adjust 604 && (expld.dataseg.relro_end 605 & (expld.dataseg.pagesize - 1))) 606 { 607 expld.dataseg.relro_end += expld.dataseg.pagesize - 1; 608 expld.dataseg.relro_end &= ~(expld.dataseg.pagesize - 1); 609 expld.result.value = (expld.dataseg.relro_end 610 - expld.result.value); 611 } 612 else 613 expld.result.value = lhs.value; 614 615 if (expld.dataseg.phase == exp_dataseg_align_seen) 616 expld.dataseg.phase = exp_dataseg_relro_seen; 617 } 618 else 619 expld.result.valid_p = FALSE; 620 break; 621 622 default: 623 FAIL (); 624 } 625 } 626 } 627 628 static void 629 fold_trinary (etree_type *tree) 630 { 631 exp_fold_tree_1 (tree->trinary.cond); 632 if (expld.result.valid_p) 633 exp_fold_tree_1 (expld.result.value 634 ? tree->trinary.lhs 635 : tree->trinary.rhs); 636 } 637 638 static void 639 fold_name (etree_type *tree) 640 { 641 memset (&expld.result, 0, sizeof (expld.result)); 642 643 switch (tree->type.node_code) 644 { 645 case SIZEOF_HEADERS: 646 if (expld.phase != lang_first_phase_enum) 647 { 648 bfd_vma hdr_size = 0; 649 /* Don't find the real header size if only marking sections; 650 The bfd function may cache incorrect data. */ 651 if (expld.phase != lang_mark_phase_enum) 652 hdr_size = bfd_sizeof_headers (link_info.output_bfd, &link_info); 653 new_number (hdr_size); 654 } 655 break; 656 657 case DEFINED: 658 if (expld.phase != lang_first_phase_enum) 659 { 660 struct bfd_link_hash_entry *h; 661 struct definedness_hash_entry *def; 662 663 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 664 &link_info, 665 tree->name.name, 666 FALSE, FALSE, TRUE); 667 new_number (h != NULL 668 && (h->type == bfd_link_hash_defined 669 || h->type == bfd_link_hash_defweak 670 || h->type == bfd_link_hash_common) 671 && ((def = symbol_defined (tree->name.name)) == NULL 672 || def->by_object 673 || def->iteration == (lang_statement_iteration & 1))); 674 } 675 break; 676 677 case NAME: 678 if (expld.assign_name != NULL 679 && strcmp (expld.assign_name, tree->name.name) == 0) 680 { 681 /* Self-assignment is only allowed for absolute symbols 682 defined in a linker script. */ 683 struct bfd_link_hash_entry *h; 684 struct definedness_hash_entry *def; 685 686 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 687 &link_info, 688 tree->name.name, 689 FALSE, FALSE, TRUE); 690 if (!(h != NULL 691 && (h->type == bfd_link_hash_defined 692 || h->type == bfd_link_hash_defweak) 693 && h->u.def.section == bfd_abs_section_ptr 694 && (def = symbol_defined (tree->name.name)) != NULL 695 && def->iteration == (lang_statement_iteration & 1))) 696 expld.assign_name = NULL; 697 } 698 if (expld.phase == lang_first_phase_enum) 699 ; 700 else if (tree->name.name[0] == '.' && tree->name.name[1] == 0) 701 new_rel_from_abs (expld.dot); 702 else 703 { 704 struct bfd_link_hash_entry *h; 705 706 h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 707 &link_info, 708 tree->name.name, 709 TRUE, FALSE, TRUE); 710 if (!h) 711 einfo (_("%P%F: bfd_link_hash_lookup failed: %E\n")); 712 else if (h->type == bfd_link_hash_defined 713 || h->type == bfd_link_hash_defweak) 714 { 715 asection *output_section; 716 717 output_section = h->u.def.section->output_section; 718 if (output_section == NULL) 719 { 720 if (expld.phase == lang_mark_phase_enum) 721 new_rel (h->u.def.value, h->u.def.section); 722 else 723 einfo (_("%X%S: unresolvable symbol `%s'" 724 " referenced in expression\n"), 725 tree, tree->name.name); 726 } 727 else if (output_section == bfd_abs_section_ptr 728 && (expld.section != bfd_abs_section_ptr 729 || config.sane_expr)) 730 new_number (h->u.def.value + h->u.def.section->output_offset); 731 else 732 new_rel (h->u.def.value + h->u.def.section->output_offset, 733 output_section); 734 } 735 else if (expld.phase == lang_final_phase_enum 736 || (expld.phase != lang_mark_phase_enum 737 && expld.assigning_to_dot)) 738 einfo (_("%F%S: undefined symbol `%s'" 739 " referenced in expression\n"), 740 tree, tree->name.name); 741 else if (h->type == bfd_link_hash_new) 742 { 743 h->type = bfd_link_hash_undefined; 744 h->u.undef.abfd = NULL; 745 if (h->u.undef.next == NULL && h != link_info.hash->undefs_tail) 746 bfd_link_add_undef (link_info.hash, h); 747 } 748 } 749 break; 750 751 case ADDR: 752 if (expld.phase != lang_first_phase_enum) 753 { 754 lang_output_section_statement_type *os; 755 756 os = lang_output_section_find (tree->name.name); 757 if (os == NULL) 758 { 759 if (expld.phase == lang_final_phase_enum) 760 einfo (_("%F%S: undefined section `%s'" 761 " referenced in expression\n"), 762 tree, tree->name.name); 763 } 764 else if (os->processed_vma) 765 new_rel (0, os->bfd_section); 766 } 767 break; 768 769 case LOADADDR: 770 if (expld.phase != lang_first_phase_enum) 771 { 772 lang_output_section_statement_type *os; 773 774 os = lang_output_section_find (tree->name.name); 775 if (os == NULL) 776 { 777 if (expld.phase == lang_final_phase_enum) 778 einfo (_("%F%S: undefined section `%s'" 779 " referenced in expression\n"), 780 tree, tree->name.name); 781 } 782 else if (os->processed_lma) 783 { 784 if (os->load_base == NULL) 785 new_abs (os->bfd_section->lma); 786 else 787 { 788 exp_fold_tree_1 (os->load_base); 789 if (expld.result.valid_p) 790 make_abs (); 791 } 792 } 793 } 794 break; 795 796 case SIZEOF: 797 case ALIGNOF: 798 if (expld.phase != lang_first_phase_enum) 799 { 800 lang_output_section_statement_type *os; 801 802 os = lang_output_section_find (tree->name.name); 803 if (os == NULL) 804 { 805 if (expld.phase == lang_final_phase_enum) 806 einfo (_("%F%S: undefined section `%s'" 807 " referenced in expression\n"), 808 tree, tree->name.name); 809 new_number (0); 810 } 811 else if (os->bfd_section != NULL) 812 { 813 bfd_vma val; 814 815 if (tree->type.node_code == SIZEOF) 816 val = (os->bfd_section->size 817 / bfd_octets_per_byte (link_info.output_bfd)); 818 else 819 val = (bfd_vma)1 << os->bfd_section->alignment_power; 820 821 new_number (val); 822 } 823 else 824 new_number (0); 825 } 826 break; 827 828 case LENGTH: 829 { 830 if (expld.phase != lang_first_phase_enum) 831 { 832 lang_memory_region_type *mem; 833 834 mem = lang_memory_region_lookup (tree->name.name, FALSE); 835 if (mem != NULL) 836 new_number (mem->length); 837 else 838 einfo (_("%F%S: undefined MEMORY region `%s'" 839 " referenced in expression\n"), 840 tree, tree->name.name); 841 } 842 } 843 break; 844 845 case ORIGIN: 846 if (expld.phase != lang_first_phase_enum) 847 { 848 lang_memory_region_type *mem; 849 850 mem = lang_memory_region_lookup (tree->name.name, FALSE); 851 if (mem != NULL) 852 new_rel_from_abs (mem->origin); 853 else 854 einfo (_("%F%S: undefined MEMORY region `%s'" 855 " referenced in expression\n"), 856 tree, tree->name.name); 857 } 858 break; 859 860 case CONSTANT: 861 if (strcmp (tree->name.name, "MAXPAGESIZE") == 0) 862 new_number (config.maxpagesize); 863 else if (strcmp (tree->name.name, "COMMONPAGESIZE") == 0) 864 new_number (config.commonpagesize); 865 else 866 einfo (_("%F%S: unknown constant `%s' referenced in expression\n"), 867 tree, tree->name.name); 868 break; 869 870 default: 871 FAIL (); 872 break; 873 } 874 } 875 876 /* Return true if TREE is '.'. */ 877 878 static bfd_boolean 879 is_dot (const etree_type *tree) 880 { 881 return (tree->type.node_class == etree_name 882 && tree->type.node_code == NAME 883 && tree->name.name[0] == '.' 884 && tree->name.name[1] == 0); 885 } 886 887 /* Return true if TREE is a constant equal to VAL. */ 888 889 static bfd_boolean 890 is_value (const etree_type *tree, bfd_vma val) 891 { 892 return (tree->type.node_class == etree_value 893 && tree->value.value == val); 894 } 895 896 /* Return true if TREE is an absolute symbol equal to VAL defined in 897 a linker script. */ 898 899 static bfd_boolean 900 is_sym_value (const etree_type *tree, bfd_vma val) 901 { 902 struct bfd_link_hash_entry *h; 903 struct definedness_hash_entry *def; 904 905 return (tree->type.node_class == etree_name 906 && tree->type.node_code == NAME 907 && (def = symbol_defined (tree->name.name)) != NULL 908 && def->by_script 909 && def->iteration == (lang_statement_iteration & 1) 910 && (h = bfd_wrapped_link_hash_lookup (link_info.output_bfd, 911 &link_info, 912 tree->name.name, 913 FALSE, FALSE, TRUE)) != NULL 914 && h->type == bfd_link_hash_defined 915 && h->u.def.section == bfd_abs_section_ptr 916 && h->u.def.value == val); 917 } 918 919 /* Return true if TREE is ". != 0". */ 920 921 static bfd_boolean 922 is_dot_ne_0 (const etree_type *tree) 923 { 924 return (tree->type.node_class == etree_binary 925 && tree->type.node_code == NE 926 && is_dot (tree->binary.lhs) 927 && is_value (tree->binary.rhs, 0)); 928 } 929 930 /* Return true if TREE is ". = . + 0" or ". = . + sym" where sym is an 931 absolute constant with value 0 defined in a linker script. */ 932 933 static bfd_boolean 934 is_dot_plus_0 (const etree_type *tree) 935 { 936 return (tree->type.node_class == etree_binary 937 && tree->type.node_code == '+' 938 && is_dot (tree->binary.lhs) 939 && (is_value (tree->binary.rhs, 0) 940 || is_sym_value (tree->binary.rhs, 0))); 941 } 942 943 /* Return true if TREE is "ALIGN (. != 0 ? some_expression : 1)". */ 944 945 static bfd_boolean 946 is_align_conditional (const etree_type *tree) 947 { 948 if (tree->type.node_class == etree_unary 949 && tree->type.node_code == ALIGN_K) 950 { 951 tree = tree->unary.child; 952 return (tree->type.node_class == etree_trinary 953 && is_dot_ne_0 (tree->trinary.cond) 954 && is_value (tree->trinary.rhs, 1)); 955 } 956 return FALSE; 957 } 958 959 /* Subroutine of exp_fold_tree_1 for copying a symbol type. */ 960 961 static void 962 try_copy_symbol_type (struct bfd_link_hash_entry *h, etree_type *src) 963 { 964 if (src->type.node_class == etree_name) 965 { 966 struct bfd_link_hash_entry *hsrc; 967 968 hsrc = bfd_link_hash_lookup (link_info.hash, src->name.name, 969 FALSE, FALSE, TRUE); 970 if (hsrc) 971 bfd_copy_link_hash_symbol_type (link_info.output_bfd, h, 972 hsrc); 973 } 974 } 975 976 static void 977 exp_fold_tree_1 (etree_type *tree) 978 { 979 if (tree == NULL) 980 { 981 memset (&expld.result, 0, sizeof (expld.result)); 982 return; 983 } 984 985 switch (tree->type.node_class) 986 { 987 case etree_value: 988 if (expld.section == bfd_abs_section_ptr 989 && !config.sane_expr) 990 new_abs (tree->value.value); 991 else 992 new_number (tree->value.value); 993 expld.result.str = tree->value.str; 994 break; 995 996 case etree_rel: 997 if (expld.phase != lang_first_phase_enum) 998 { 999 asection *output_section = tree->rel.section->output_section; 1000 new_rel (tree->rel.value + tree->rel.section->output_offset, 1001 output_section); 1002 } 1003 else 1004 memset (&expld.result, 0, sizeof (expld.result)); 1005 break; 1006 1007 case etree_assert: 1008 exp_fold_tree_1 (tree->assert_s.child); 1009 if (expld.phase == lang_final_phase_enum && !expld.result.value) 1010 einfo ("%X%P: %s\n", tree->assert_s.message); 1011 break; 1012 1013 case etree_unary: 1014 fold_unary (tree); 1015 break; 1016 1017 case etree_binary: 1018 fold_binary (tree); 1019 break; 1020 1021 case etree_trinary: 1022 fold_trinary (tree); 1023 break; 1024 1025 case etree_assign: 1026 case etree_provide: 1027 case etree_provided: 1028 if (tree->assign.dst[0] == '.' && tree->assign.dst[1] == 0) 1029 { 1030 if (tree->type.node_class != etree_assign) 1031 einfo (_("%F%S can not PROVIDE assignment to" 1032 " location counter\n"), tree); 1033 if (expld.phase != lang_first_phase_enum) 1034 { 1035 /* Notify the folder that this is an assignment to dot. */ 1036 expld.assigning_to_dot = TRUE; 1037 exp_fold_tree_1 (tree->assign.src); 1038 expld.assigning_to_dot = FALSE; 1039 1040 /* If we are assigning to dot inside an output section 1041 arrange to keep the section, except for certain 1042 expressions that evaluate to zero. We ignore . = 0, 1043 . = . + 0, and . = ALIGN (. != 0 ? expr : 1). 1044 We can't ignore all expressions that evaluate to zero 1045 because an otherwise empty section might have padding 1046 added by an alignment expression that changes with 1047 relaxation. Such a section might have zero size 1048 before relaxation and so be stripped incorrectly. */ 1049 if (expld.phase == lang_mark_phase_enum 1050 && expld.section != bfd_abs_section_ptr 1051 && !(expld.result.valid_p 1052 && expld.result.value == 0 1053 && (is_value (tree->assign.src, 0) 1054 || is_sym_value (tree->assign.src, 0) 1055 || is_dot_plus_0 (tree->assign.src) 1056 || is_align_conditional (tree->assign.src)))) 1057 expld.section->flags |= SEC_KEEP; 1058 1059 if (!expld.result.valid_p) 1060 { 1061 if (expld.phase != lang_mark_phase_enum) 1062 einfo (_("%F%S invalid assignment to" 1063 " location counter\n"), tree); 1064 } 1065 else if (expld.dotp == NULL) 1066 einfo (_("%F%S assignment to location counter" 1067 " invalid outside of SECTIONS\n"), tree); 1068 1069 /* After allocation, assignment to dot should not be 1070 done inside an output section since allocation adds a 1071 padding statement that effectively duplicates the 1072 assignment. */ 1073 else if (expld.phase <= lang_allocating_phase_enum 1074 || expld.section == bfd_abs_section_ptr) 1075 { 1076 bfd_vma nextdot; 1077 1078 nextdot = expld.result.value; 1079 if (expld.result.section != NULL) 1080 nextdot += expld.result.section->vma; 1081 else 1082 nextdot += expld.section->vma; 1083 if (nextdot < expld.dot 1084 && expld.section != bfd_abs_section_ptr) 1085 einfo (_("%F%S cannot move location counter backwards" 1086 " (from %V to %V)\n"), 1087 tree, expld.dot, nextdot); 1088 else 1089 { 1090 expld.dot = nextdot; 1091 *expld.dotp = nextdot; 1092 } 1093 } 1094 } 1095 else 1096 memset (&expld.result, 0, sizeof (expld.result)); 1097 } 1098 else 1099 { 1100 struct bfd_link_hash_entry *h = NULL; 1101 1102 if (tree->type.node_class == etree_provide) 1103 { 1104 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, 1105 FALSE, FALSE, TRUE); 1106 if (h == NULL 1107 || !(h->type == bfd_link_hash_new 1108 || h->type == bfd_link_hash_undefined 1109 || h->type == bfd_link_hash_undefweak 1110 || h->linker_def)) 1111 { 1112 /* Do nothing. The symbol was never referenced, or 1113 was defined in some object file. Note that 1114 undefweak symbols are defined by PROVIDE. This 1115 is to support glibc use of __rela_iplt_start and 1116 similar weak references. */ 1117 break; 1118 } 1119 } 1120 1121 expld.assign_name = tree->assign.dst; 1122 exp_fold_tree_1 (tree->assign.src); 1123 /* expld.assign_name remaining equal to tree->assign.dst 1124 below indicates the evaluation of tree->assign.src did 1125 not use the value of tree->assign.dst. We don't allow 1126 self assignment until the final phase for two reasons: 1127 1) Expressions are evaluated multiple times. With 1128 relaxation, the number of times may vary. 1129 2) Section relative symbol values cannot be correctly 1130 converted to absolute values, as is required by many 1131 expressions, until final section sizing is complete. */ 1132 if ((expld.result.valid_p 1133 && (expld.phase == lang_final_phase_enum 1134 || expld.assign_name != NULL)) 1135 || (expld.phase <= lang_mark_phase_enum 1136 && tree->type.node_class == etree_assign 1137 && tree->assign.defsym)) 1138 { 1139 if (h == NULL) 1140 { 1141 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, 1142 TRUE, FALSE, TRUE); 1143 if (h == NULL) 1144 einfo (_("%P%F:%s: hash creation failed\n"), 1145 tree->assign.dst); 1146 } 1147 1148 if (expld.result.section == NULL) 1149 expld.result.section = expld.section; 1150 if (!update_definedness (tree->assign.dst, h) && 0) 1151 { 1152 /* Symbol was already defined. For now this error 1153 is disabled because it causes failures in the ld 1154 testsuite: ld-elf/var1, ld-scripts/defined5, and 1155 ld-scripts/pr14962. Some of these no doubt 1156 reflect scripts used in the wild. */ 1157 (*link_info.callbacks->multiple_definition) 1158 (&link_info, h, link_info.output_bfd, 1159 expld.result.section, expld.result.value); 1160 } 1161 h->type = bfd_link_hash_defined; 1162 h->u.def.value = expld.result.value; 1163 h->u.def.section = expld.result.section; 1164 h->linker_def = 0; 1165 if (tree->type.node_class == etree_provide) 1166 tree->type.node_class = etree_provided; 1167 1168 /* Copy the symbol type if this is a simple assignment of 1169 one symbol to another. Also, handle the case of a foldable 1170 ternary conditional with names on either side. */ 1171 if (tree->assign.src->type.node_class == etree_name) 1172 try_copy_symbol_type (h, tree->assign.src); 1173 else if (tree->assign.src->type.node_class == etree_trinary) 1174 { 1175 exp_fold_tree_1 (tree->assign.src->trinary.cond); 1176 if (expld.result.valid_p) 1177 { 1178 if (expld.result.value 1179 && tree->assign.src->trinary.lhs->type.node_class 1180 == etree_name) 1181 try_copy_symbol_type (h, tree->assign.src->trinary.lhs); 1182 1183 if (!expld.result.value 1184 && tree->assign.src->trinary.rhs->type.node_class 1185 == etree_name) 1186 try_copy_symbol_type (h, tree->assign.src->trinary.rhs); 1187 } 1188 } 1189 } 1190 else if (expld.phase == lang_final_phase_enum) 1191 { 1192 h = bfd_link_hash_lookup (link_info.hash, tree->assign.dst, 1193 FALSE, FALSE, TRUE); 1194 if (h != NULL 1195 && h->type == bfd_link_hash_new) 1196 h->type = bfd_link_hash_undefined; 1197 } 1198 expld.assign_name = NULL; 1199 } 1200 break; 1201 1202 case etree_name: 1203 fold_name (tree); 1204 break; 1205 1206 default: 1207 FAIL (); 1208 memset (&expld.result, 0, sizeof (expld.result)); 1209 break; 1210 } 1211 } 1212 1213 void 1214 exp_fold_tree (etree_type *tree, asection *current_section, bfd_vma *dotp) 1215 { 1216 expld.dot = *dotp; 1217 expld.dotp = dotp; 1218 expld.section = current_section; 1219 exp_fold_tree_1 (tree); 1220 } 1221 1222 void 1223 exp_fold_tree_no_dot (etree_type *tree) 1224 { 1225 expld.dot = 0; 1226 expld.dotp = NULL; 1227 expld.section = bfd_abs_section_ptr; 1228 exp_fold_tree_1 (tree); 1229 } 1230 1231 etree_type * 1232 exp_binop (int code, etree_type *lhs, etree_type *rhs) 1233 { 1234 etree_type value, *new_e; 1235 1236 value.type.node_code = code; 1237 value.type.filename = lhs->type.filename; 1238 value.type.lineno = lhs->type.lineno; 1239 value.binary.lhs = lhs; 1240 value.binary.rhs = rhs; 1241 value.type.node_class = etree_binary; 1242 exp_fold_tree_no_dot (&value); 1243 if (expld.result.valid_p) 1244 return exp_intop (expld.result.value); 1245 1246 new_e = (etree_type *) stat_alloc (sizeof (new_e->binary)); 1247 memcpy (new_e, &value, sizeof (new_e->binary)); 1248 return new_e; 1249 } 1250 1251 etree_type * 1252 exp_trinop (int code, etree_type *cond, etree_type *lhs, etree_type *rhs) 1253 { 1254 etree_type value, *new_e; 1255 1256 value.type.node_code = code; 1257 value.type.filename = cond->type.filename; 1258 value.type.lineno = cond->type.lineno; 1259 value.trinary.lhs = lhs; 1260 value.trinary.cond = cond; 1261 value.trinary.rhs = rhs; 1262 value.type.node_class = etree_trinary; 1263 exp_fold_tree_no_dot (&value); 1264 if (expld.result.valid_p) 1265 return exp_intop (expld.result.value); 1266 1267 new_e = (etree_type *) stat_alloc (sizeof (new_e->trinary)); 1268 memcpy (new_e, &value, sizeof (new_e->trinary)); 1269 return new_e; 1270 } 1271 1272 etree_type * 1273 exp_unop (int code, etree_type *child) 1274 { 1275 etree_type value, *new_e; 1276 1277 value.unary.type.node_code = code; 1278 value.unary.type.filename = child->type.filename; 1279 value.unary.type.lineno = child->type.lineno; 1280 value.unary.child = child; 1281 value.unary.type.node_class = etree_unary; 1282 exp_fold_tree_no_dot (&value); 1283 if (expld.result.valid_p) 1284 return exp_intop (expld.result.value); 1285 1286 new_e = (etree_type *) stat_alloc (sizeof (new_e->unary)); 1287 memcpy (new_e, &value, sizeof (new_e->unary)); 1288 return new_e; 1289 } 1290 1291 etree_type * 1292 exp_nameop (int code, const char *name) 1293 { 1294 etree_type value, *new_e; 1295 1296 value.name.type.node_code = code; 1297 value.name.type.filename = ldlex_filename (); 1298 value.name.type.lineno = lineno; 1299 value.name.name = name; 1300 value.name.type.node_class = etree_name; 1301 1302 exp_fold_tree_no_dot (&value); 1303 if (expld.result.valid_p) 1304 return exp_intop (expld.result.value); 1305 1306 new_e = (etree_type *) stat_alloc (sizeof (new_e->name)); 1307 memcpy (new_e, &value, sizeof (new_e->name)); 1308 return new_e; 1309 1310 } 1311 1312 static etree_type * 1313 exp_assop (const char *dst, 1314 etree_type *src, 1315 enum node_tree_enum class, 1316 bfd_boolean defsym, 1317 bfd_boolean hidden) 1318 { 1319 etree_type *n; 1320 1321 n = (etree_type *) stat_alloc (sizeof (n->assign)); 1322 n->assign.type.node_code = '='; 1323 n->assign.type.filename = src->type.filename; 1324 n->assign.type.lineno = src->type.lineno; 1325 n->assign.type.node_class = class; 1326 n->assign.src = src; 1327 n->assign.dst = dst; 1328 n->assign.defsym = defsym; 1329 n->assign.hidden = hidden; 1330 return n; 1331 } 1332 1333 /* Handle linker script assignments and HIDDEN. */ 1334 1335 etree_type * 1336 exp_assign (const char *dst, etree_type *src, bfd_boolean hidden) 1337 { 1338 return exp_assop (dst, src, etree_assign, FALSE, hidden); 1339 } 1340 1341 /* Handle --defsym command-line option. */ 1342 1343 etree_type * 1344 exp_defsym (const char *dst, etree_type *src) 1345 { 1346 return exp_assop (dst, src, etree_assign, TRUE, FALSE); 1347 } 1348 1349 /* Handle PROVIDE. */ 1350 1351 etree_type * 1352 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden) 1353 { 1354 return exp_assop (dst, src, etree_provide, FALSE, hidden); 1355 } 1356 1357 /* Handle ASSERT. */ 1358 1359 etree_type * 1360 exp_assert (etree_type *exp, const char *message) 1361 { 1362 etree_type *n; 1363 1364 n = (etree_type *) stat_alloc (sizeof (n->assert_s)); 1365 n->assert_s.type.node_code = '!'; 1366 n->assert_s.type.filename = exp->type.filename; 1367 n->assert_s.type.lineno = exp->type.lineno; 1368 n->assert_s.type.node_class = etree_assert; 1369 n->assert_s.child = exp; 1370 n->assert_s.message = message; 1371 return n; 1372 } 1373 1374 void 1375 exp_print_tree (etree_type *tree) 1376 { 1377 bfd_boolean function_like; 1378 1379 if (config.map_file == NULL) 1380 config.map_file = stderr; 1381 1382 if (tree == NULL) 1383 { 1384 minfo ("NULL TREE\n"); 1385 return; 1386 } 1387 1388 switch (tree->type.node_class) 1389 { 1390 case etree_value: 1391 minfo ("0x%v", tree->value.value); 1392 return; 1393 case etree_rel: 1394 if (tree->rel.section->owner != NULL) 1395 minfo ("%B:", tree->rel.section->owner); 1396 minfo ("%s+0x%v", tree->rel.section->name, tree->rel.value); 1397 return; 1398 case etree_assign: 1399 fputs (tree->assign.dst, config.map_file); 1400 exp_print_token (tree->type.node_code, TRUE); 1401 exp_print_tree (tree->assign.src); 1402 break; 1403 case etree_provide: 1404 case etree_provided: 1405 fprintf (config.map_file, "PROVIDE (%s, ", tree->assign.dst); 1406 exp_print_tree (tree->assign.src); 1407 fputc (')', config.map_file); 1408 break; 1409 case etree_binary: 1410 function_like = FALSE; 1411 switch (tree->type.node_code) 1412 { 1413 case MAX_K: 1414 case MIN_K: 1415 case ALIGN_K: 1416 case DATA_SEGMENT_ALIGN: 1417 case DATA_SEGMENT_RELRO_END: 1418 function_like = TRUE; 1419 break; 1420 case SEGMENT_START: 1421 /* Special handling because arguments are in reverse order and 1422 the segment name is quoted. */ 1423 exp_print_token (tree->type.node_code, FALSE); 1424 fputs (" (\"", config.map_file); 1425 exp_print_tree (tree->binary.rhs); 1426 fputs ("\", ", config.map_file); 1427 exp_print_tree (tree->binary.lhs); 1428 fputc (')', config.map_file); 1429 return; 1430 } 1431 if (function_like) 1432 { 1433 exp_print_token (tree->type.node_code, FALSE); 1434 fputc (' ', config.map_file); 1435 } 1436 fputc ('(', config.map_file); 1437 exp_print_tree (tree->binary.lhs); 1438 if (function_like) 1439 fprintf (config.map_file, ", "); 1440 else 1441 exp_print_token (tree->type.node_code, TRUE); 1442 exp_print_tree (tree->binary.rhs); 1443 fputc (')', config.map_file); 1444 break; 1445 case etree_trinary: 1446 exp_print_tree (tree->trinary.cond); 1447 fputc ('?', config.map_file); 1448 exp_print_tree (tree->trinary.lhs); 1449 fputc (':', config.map_file); 1450 exp_print_tree (tree->trinary.rhs); 1451 break; 1452 case etree_unary: 1453 exp_print_token (tree->unary.type.node_code, FALSE); 1454 if (tree->unary.child) 1455 { 1456 fprintf (config.map_file, " ("); 1457 exp_print_tree (tree->unary.child); 1458 fputc (')', config.map_file); 1459 } 1460 break; 1461 1462 case etree_assert: 1463 fprintf (config.map_file, "ASSERT ("); 1464 exp_print_tree (tree->assert_s.child); 1465 fprintf (config.map_file, ", %s)", tree->assert_s.message); 1466 break; 1467 1468 case etree_name: 1469 if (tree->type.node_code == NAME) 1470 fputs (tree->name.name, config.map_file); 1471 else 1472 { 1473 exp_print_token (tree->type.node_code, FALSE); 1474 if (tree->name.name) 1475 fprintf (config.map_file, " (%s)", tree->name.name); 1476 } 1477 break; 1478 default: 1479 FAIL (); 1480 break; 1481 } 1482 } 1483 1484 bfd_vma 1485 exp_get_vma (etree_type *tree, bfd_vma def, char *name) 1486 { 1487 if (tree != NULL) 1488 { 1489 exp_fold_tree_no_dot (tree); 1490 if (expld.result.valid_p) 1491 return expld.result.value; 1492 else if (name != NULL && expld.phase != lang_mark_phase_enum) 1493 einfo (_("%F%S: nonconstant expression for %s\n"), 1494 tree, name); 1495 } 1496 return def; 1497 } 1498 1499 int 1500 exp_get_value_int (etree_type *tree, int def, char *name) 1501 { 1502 return exp_get_vma (tree, def, name); 1503 } 1504 1505 fill_type * 1506 exp_get_fill (etree_type *tree, fill_type *def, char *name) 1507 { 1508 fill_type *fill; 1509 size_t len; 1510 unsigned int val; 1511 1512 if (tree == NULL) 1513 return def; 1514 1515 exp_fold_tree_no_dot (tree); 1516 if (!expld.result.valid_p) 1517 { 1518 if (name != NULL && expld.phase != lang_mark_phase_enum) 1519 einfo (_("%F%S: nonconstant expression for %s\n"), 1520 tree, name); 1521 return def; 1522 } 1523 1524 if (expld.result.str != NULL && (len = strlen (expld.result.str)) != 0) 1525 { 1526 unsigned char *dst; 1527 unsigned char *s; 1528 fill = (fill_type *) xmalloc ((len + 1) / 2 + sizeof (*fill) - 1); 1529 fill->size = (len + 1) / 2; 1530 dst = fill->data; 1531 s = (unsigned char *) expld.result.str; 1532 val = 0; 1533 do 1534 { 1535 unsigned int digit; 1536 1537 digit = *s++ - '0'; 1538 if (digit > 9) 1539 digit = (digit - 'A' + '0' + 10) & 0xf; 1540 val <<= 4; 1541 val += digit; 1542 --len; 1543 if ((len & 1) == 0) 1544 { 1545 *dst++ = val; 1546 val = 0; 1547 } 1548 } 1549 while (len != 0); 1550 } 1551 else 1552 { 1553 fill = (fill_type *) xmalloc (4 + sizeof (*fill) - 1); 1554 val = expld.result.value; 1555 fill->data[0] = (val >> 24) & 0xff; 1556 fill->data[1] = (val >> 16) & 0xff; 1557 fill->data[2] = (val >> 8) & 0xff; 1558 fill->data[3] = (val >> 0) & 0xff; 1559 fill->size = 4; 1560 } 1561 return fill; 1562 } 1563 1564 bfd_vma 1565 exp_get_abs_int (etree_type *tree, int def, char *name) 1566 { 1567 if (tree != NULL) 1568 { 1569 exp_fold_tree_no_dot (tree); 1570 1571 if (expld.result.valid_p) 1572 { 1573 if (expld.result.section != NULL) 1574 expld.result.value += expld.result.section->vma; 1575 return expld.result.value; 1576 } 1577 else if (name != NULL && expld.phase != lang_mark_phase_enum) 1578 { 1579 einfo (_("%F%S: nonconstant expression for %s\n"), 1580 tree, name); 1581 } 1582 } 1583 return def; 1584 } 1585 1586 static bfd_vma 1587 align_n (bfd_vma value, bfd_vma align) 1588 { 1589 if (align <= 1) 1590 return value; 1591 1592 value = (value + align - 1) / align; 1593 return value * align; 1594 } 1595 1596 void 1597 ldexp_init (void) 1598 { 1599 /* The value "13" is ad-hoc, somewhat related to the expected number of 1600 assignments in a linker script. */ 1601 if (!bfd_hash_table_init_n (&definedness_table, 1602 definedness_newfunc, 1603 sizeof (struct definedness_hash_entry), 1604 13)) 1605 einfo (_("%P%F: can not create hash table: %E\n")); 1606 } 1607 1608 void 1609 ldexp_finish (void) 1610 { 1611 bfd_hash_table_free (&definedness_table); 1612 } 1613