OLD | NEW |
1 /* TILE-Gx-specific support for ELF. | 1 /* TILE-Gx-specific support for ELF. |
2 Copyright 2011 Free Software Foundation, Inc. | 2 Copyright 2011, 2012 Free Software Foundation, Inc. |
3 | 3 |
4 This file is part of BFD, the Binary File Descriptor library. | 4 This file is part of BFD, the Binary File Descriptor library. |
5 | 5 |
6 This program is free software; you can redistribute it and/or modify | 6 This program is free software; you can redistribute it and/or modify |
7 it under the terms of the GNU General Public License as published by | 7 it under the terms of the GNU General Public License as published by |
8 the Free Software Foundation; either version 3 of the License, or | 8 the Free Software Foundation; either version 3 of the License, or |
9 (at your option) any later version. | 9 (at your option) any later version. |
10 | 10 |
11 This program is distributed in the hope that it will be useful, | 11 This program is distributed in the hope that it will be useful, |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | 12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 GNU General Public License for more details. | 14 GNU General Public License for more details. |
15 | 15 |
16 You should have received a copy of the GNU General Public License | 16 You should have received a copy of the GNU General Public License |
17 along with this program; if not, write to the Free Software | 17 along with this program; if not, write to the Free Software |
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, |
19 MA 02110-1301, USA. */ | 19 MA 02110-1301, USA. */ |
20 | 20 |
| 21 #include "sysdep.h" |
21 #include "bfd.h" | 22 #include "bfd.h" |
22 #include "sysdep.h" | |
23 #include "libbfd.h" | 23 #include "libbfd.h" |
24 #include "elf-bfd.h" | 24 #include "elf-bfd.h" |
25 #include "elf/tilegx.h" | 25 #include "elf/tilegx.h" |
26 #include "opcode/tilegx.h" | 26 #include "opcode/tilegx.h" |
27 #include "libiberty.h" | 27 #include "libiberty.h" |
28 #include "elfxx-tilegx.h" | 28 #include "elfxx-tilegx.h" |
29 | 29 |
30 #define ABI_64_P(abfd) \ | 30 #define ABI_64_P(abfd) \ |
31 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64) | 31 (get_elf_backend_data (abfd)->s->elfclass == ELFCLASS64) |
32 | 32 |
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
483 | 483 |
484 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PCREL, 0), | 484 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW0_LAST_PCREL, 0), |
485 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PCREL, 0), | 485 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW0_LAST_PCREL, 0), |
486 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW1_LAST_PCREL, 16), | 486 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW1_LAST_PCREL, 16), |
487 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW1_LAST_PCREL, 16), | 487 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW1_LAST_PCREL, 16), |
488 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW2_LAST_PCREL, 32), | 488 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X0_HW2_LAST_PCREL, 32), |
489 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW2_LAST_PCREL, 32), | 489 TILEGX_IMM16_HOWTO_LAST_PCREL (R_TILEGX_IMM16_X1_HW2_LAST_PCREL, 32), |
490 | 490 |
491 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_GOT, 0), | 491 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_GOT, 0), |
492 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_GOT, 0), | 492 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_GOT, 0), |
493 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW1_GOT, 16), | 493 /* These relocs are currently not defined. */ |
494 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW1_GOT, 16), | 494 EMPTY_HOWTO (66), |
495 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW2_GOT, 32), | 495 EMPTY_HOWTO (67), |
496 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW2_GOT, 32), | 496 EMPTY_HOWTO (68), |
497 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW3_GOT, 48), | 497 EMPTY_HOWTO (69), |
498 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW3_GOT, 48), | 498 EMPTY_HOWTO (70), |
| 499 EMPTY_HOWTO (71), |
499 | 500 |
500 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 0), | 501 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_GOT, 0), |
501 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 0), | 502 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_GOT, 0), |
502 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 16), | 503 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_GOT, 16), |
503 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 16), | 504 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_GOT, 16), |
504 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW2_LAST_GOT, 32), | 505 /* These relocs are currently not defined. */ |
505 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW2_LAST_GOT, 32), | 506 EMPTY_HOWTO (76), |
| 507 EMPTY_HOWTO (77), |
506 | 508 |
507 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_GD, 0), | 509 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_GD, 0), |
508 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_GD, 0), | 510 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_GD, 0), |
509 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW1_TLS_GD, 16), | 511 |
510 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW1_TLS_GD, 16), | 512 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW0_TLS_LE, 0), |
511 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW2_TLS_GD, 32), | 513 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW0_TLS_LE, 0), |
512 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW2_TLS_GD, 32), | 514 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_LE, 0), |
513 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X0_HW3_TLS_GD, 48), | 515 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_LE, 0), |
514 TILEGX_IMM16_HOWTO (R_TILEGX_IMM16_X1_HW3_TLS_GD, 48), | 516 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_LE, 16), |
| 517 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_LE, 16), |
515 | 518 |
516 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 0), | 519 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW0_LAST_TLS_GD, 0), |
517 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 0), | 520 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW0_LAST_TLS_GD, 0), |
518 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 16), | 521 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW1_LAST_TLS_GD, 16), |
519 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 16), | 522 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW1_LAST_TLS_GD, 16), |
520 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X0_HW2_LAST_TLS_GD, 32), | 523 EMPTY_HOWTO (90), |
521 TILEGX_IMM16_HOWTO_LAST (R_TILEGX_IMM16_X1_HW2_LAST_TLS_GD, 32), | 524 EMPTY_HOWTO (91), |
522 | 525 |
523 #define TILEGX_IMM16_HOWTO_TLS_IE(name, rshift) \ | 526 #define TILEGX_IMM16_HOWTO_TLS_IE(name, rshift) \ |
524 HOWTO (name, rshift, 1, 16, FALSE, 0, \ | 527 HOWTO (name, rshift, 1, 16, FALSE, 0, \ |
525 complain_overflow_dont, bfd_elf_generic_reloc, \ | 528 complain_overflow_dont, bfd_elf_generic_reloc, \ |
526 #name, FALSE, 0, 0xffff, TRUE) | 529 #name, FALSE, 0, 0xffff, TRUE) |
527 | 530 |
528 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW0_TLS_IE, 0), | 531 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW0_TLS_IE, 0), |
529 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW0_TLS_IE, 0), | 532 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW0_TLS_IE, 0), |
530 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW1_TLS_IE, 16), | 533 EMPTY_HOWTO (94), |
531 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW1_TLS_IE, 16), | 534 EMPTY_HOWTO (95), |
532 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW2_TLS_IE, 32), | 535 EMPTY_HOWTO (96), |
533 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW2_TLS_IE, 32), | 536 EMPTY_HOWTO (97), |
534 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X0_HW3_TLS_IE, 48), | 537 EMPTY_HOWTO (98), |
535 TILEGX_IMM16_HOWTO_TLS_IE (R_TILEGX_IMM16_X1_HW3_TLS_IE, 48), | 538 EMPTY_HOWTO (99), |
536 | 539 |
537 #define TILEGX_IMM16_HOWTO_LAST_TLS_IE(name, rshift) \ | 540 #define TILEGX_IMM16_HOWTO_LAST_TLS_IE(name, rshift) \ |
538 HOWTO (name, rshift, 1, 16, FALSE, 0, \ | 541 HOWTO (name, rshift, 1, 16, FALSE, 0, \ |
539 complain_overflow_signed, bfd_elf_generic_reloc, \ | 542 complain_overflow_signed, bfd_elf_generic_reloc, \ |
540 #name, FALSE, 0, 0xffff, TRUE) | 543 #name, FALSE, 0, 0xffff, TRUE) |
541 | 544 |
542 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 0), | 545 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW0_LAST_TLS_IE, 0), |
543 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 0), | 546 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW0_LAST_TLS_IE, 0), |
544 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 16), | 547 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW1_LAST_TLS_IE, 16), |
545 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 16), | 548 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW1_LAST_TLS_IE, 16), |
546 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X0_HW2_LAST_TLS_IE, 32), | 549 EMPTY_HOWTO (104), |
547 TILEGX_IMM16_HOWTO_LAST_TLS_IE (R_TILEGX_IMM16_X1_HW2_LAST_TLS_IE, 32), | 550 EMPTY_HOWTO (105), |
548 | 551 |
549 HOWTO(R_TILEGX_TLS_DTPMOD64, 0, 0, 0, FALSE, 0, complain_overflow_dont, | 552 HOWTO(R_TILEGX_TLS_DTPMOD64, 0, 0, 0, FALSE, 0, complain_overflow_dont, |
550 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD64", | 553 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD64", |
551 FALSE, 0, 0, TRUE), | 554 FALSE, 0, 0, TRUE), |
552 HOWTO(R_TILEGX_TLS_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, | 555 HOWTO(R_TILEGX_TLS_DTPOFF64, 0, 4, 64, FALSE, 0, complain_overflow_bitfield, |
553 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF64", | 556 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF64", |
554 FALSE, 0, -1, TRUE), | 557 FALSE, 0, -1, TRUE), |
555 HOWTO(R_TILEGX_TLS_TPOFF64, 0, 0, 0, FALSE, 0, complain_overflow_dont, | 558 HOWTO(R_TILEGX_TLS_TPOFF64, 0, 0, 0, FALSE, 0, complain_overflow_dont, |
556 bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF64", | 559 bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF64", |
557 FALSE, 0, 0, TRUE), | 560 FALSE, 0, 0, TRUE), |
558 | 561 |
559 HOWTO(R_TILEGX_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont, | 562 HOWTO(R_TILEGX_TLS_DTPMOD32, 0, 0, 0, FALSE, 0, complain_overflow_dont, |
560 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD32", | 563 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPMOD32", |
561 FALSE, 0, 0, TRUE), | 564 FALSE, 0, 0, TRUE), |
562 HOWTO(R_TILEGX_TLS_DTPOFF32, 0, 4, 32, FALSE, 0, complain_overflow_bitfield, | 565 HOWTO(R_TILEGX_TLS_DTPOFF32, 0, 4, 32, FALSE, 0, complain_overflow_bitfield, |
563 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF32", | 566 bfd_elf_generic_reloc, "R_TILEGX_TLS_DTPOFF32", |
564 FALSE, 0, -1, TRUE), | 567 FALSE, 0, -1, TRUE), |
565 HOWTO(R_TILEGX_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont, | 568 HOWTO(R_TILEGX_TLS_TPOFF32, 0, 0, 0, FALSE, 0, complain_overflow_dont, |
566 bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF32", | 569 bfd_elf_generic_reloc, "R_TILEGX_TLS_TPOFF32", |
567 FALSE, 0, 0, TRUE) | 570 FALSE, 0, 0, TRUE), |
| 571 |
| 572 HOWTO (R_TILEGX_TLS_GD_CALL, /* type */ |
| 573 » TILEGX_LOG2_BUNDLE_ALIGNMENT_IN_BYTES, /* rightshift */ |
| 574 » 2,» » » /* size (0 = byte, 1 = short, 2 = long) */ |
| 575 » 27,» » » /* bitsize */ |
| 576 » TRUE,» » » /* pc_relative */ |
| 577 » 0,» » » /* bitpos */ |
| 578 » complain_overflow_signed,/* complain_on_overflow */ |
| 579 » bfd_elf_generic_reloc, /* special_function */ |
| 580 » "R_TILEGX_TLS_GD_CALL", /* name */ |
| 581 » FALSE,»» » /* partial_inplace */ |
| 582 » 0,» » » /* src_mask */ |
| 583 » -1,» » » /* dst_mask */ |
| 584 » TRUE), » » /* pcrel_offset */ |
| 585 |
| 586 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_GD_ADD, 0, 8), |
| 587 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_GD_ADD, 0, 8), |
| 588 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0_TLS_GD_ADD, 0, 8), |
| 589 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1_TLS_GD_ADD, 0, 8), |
| 590 TILEGX_IMM_HOWTO(R_TILEGX_TLS_IE_LOAD, 0, 8), |
| 591 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X0_TLS_ADD, 0, 8), |
| 592 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_X1_TLS_ADD, 0, 8), |
| 593 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y0_TLS_ADD, 0, 8), |
| 594 TILEGX_IMM_HOWTO(R_TILEGX_IMM8_Y1_TLS_ADD, 0, 8), |
568 }; | 595 }; |
569 | 596 |
570 static reloc_howto_type tilegx_elf_howto_table2 [] = | 597 static reloc_howto_type tilegx_elf_howto_table2 [] = |
571 { | 598 { |
572 /* GNU extension to record C++ vtable hierarchy */ | 599 /* GNU extension to record C++ vtable hierarchy */ |
573 HOWTO (R_TILEGX_GNU_VTINHERIT, /* type */ | 600 HOWTO (R_TILEGX_GNU_VTINHERIT, /* type */ |
574 0, /* rightshift */ | 601 0, /* rightshift */ |
575 4, /* size (0 = byte, 1 = short, 2 = long) */ | 602 4, /* size (0 = byte, 1 = short, 2 = long) */ |
576 0, /* bitsize */ | 603 0, /* bitsize */ |
577 FALSE, /* pc_relative */ | 604 FALSE, /* pc_relative */ |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_PCREL) | 703 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_PCREL) |
677 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_PCREL) | 704 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_PCREL) |
678 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_PCREL) | 705 SIMPLE_REMAP (TILEGX_IMM16_X0_HW2_PCREL) |
679 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_PCREL) | 706 SIMPLE_REMAP (TILEGX_IMM16_X1_HW2_PCREL) |
680 SIMPLE_REMAP (TILEGX_IMM16_X0_HW3_PCREL) | 707 SIMPLE_REMAP (TILEGX_IMM16_X0_HW3_PCREL) |
681 SIMPLE_REMAP (TILEGX_IMM16_X1_HW3_PCREL) | 708 SIMPLE_REMAP (TILEGX_IMM16_X1_HW3_PCREL) |
682 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_PCREL) | 709 SIMPLE_REMAP (TILEGX_IMM16_X0_HW0_LAST_PCREL) |
683 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_PCREL) | 710 SIMPLE_REMAP (TILEGX_IMM16_X1_HW0_LAST_PCREL) |
684 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_PCREL) | 711 SIMPLE_REMAP (TILEGX_IMM16_X0_HW1_LAST_PCREL) |
685 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_PCREL) | 712 SIMPLE_REMAP (TILEGX_IMM16_X1_HW1_LAST_PCREL) |
error: old chunk mismatch |
None
OLD | NEW |