diff options
author | Nathan Rossi <nathan.rossi@xilinx.com> | 2013-12-16 15:01:13 +1000 |
---|---|---|
committer | Nathan Rossi <nathan.rossi@xilinx.com> | 2013-12-16 15:28:13 +1000 |
commit | 3ec0d044ea0c5fca26eecc0335bb9847871255ea (patch) | |
tree | e658d8dcfbdb27880b844e320dfec03b2e582465 /recipes-devtools | |
parent | 82fcd5710441815ef5ab1677db7f724b84f2ae45 (diff) | |
download | meta-xilinx-3ec0d044ea0c5fca26eecc0335bb9847871255ea.tar.gz |
binutils: Update binutils patches
* Update patches to match current Xilinx binutils work
Signed-off-by: Nathan Rossi <nathan.rossi@xilinx.com>
Diffstat (limited to 'recipes-devtools')
7 files changed, 515 insertions, 0 deletions
diff --git a/recipes-devtools/binutils/binutils-microblaze-2.23.2.inc b/recipes-devtools/binutils/binutils-microblaze-2.23.2.inc index 71112efb..b75ed20d 100644 --- a/recipes-devtools/binutils/binutils-microblaze-2.23.2.inc +++ b/recipes-devtools/binutils/binutils-microblaze-2.23.2.inc | |||
@@ -15,4 +15,10 @@ SRC_URI_append += " \ | |||
15 | file://0011-77625f8c77d14a67bc542bb790e6f826c725de4c.patch \ | 15 | file://0011-77625f8c77d14a67bc542bb790e6f826c725de4c.patch \ |
16 | file://0012-b0ea811a61103f378351c9aa2cb16bd3010b0a31.patch \ | 16 | file://0012-b0ea811a61103f378351c9aa2cb16bd3010b0a31.patch \ |
17 | file://0013-19e05575d97b6dc83dae1b8309624da3102d7a74.patch \ | 17 | file://0013-19e05575d97b6dc83dae1b8309624da3102d7a74.patch \ |
18 | file://0014-Patch-microblaze-Add-wdc.ext.clear-and-wdc.ext.flush.patch \ | ||
19 | file://0015-Patch-microblaze-Add-mlittle-endian-and-mbig-endian-.patch \ | ||
20 | file://0016-Disable-the-warning-message-for-eh_frame_hdr.patch \ | ||
21 | file://0017-Fix-relaxation-of-assembler-resolved-reference.patch \ | ||
22 | file://0018-Fixup-debug_loc-sections-after-linker-relaxati.patch \ | ||
23 | file://0019-upstream-change-to-garbage-collection-s.patch \ | ||
18 | " | 24 | " |
diff --git a/recipes-devtools/binutils/files/0014-Patch-microblaze-Add-wdc.ext.clear-and-wdc.ext.flush.patch b/recipes-devtools/binutils/files/0014-Patch-microblaze-Add-wdc.ext.clear-and-wdc.ext.flush.patch new file mode 100644 index 00000000..cb58f603 --- /dev/null +++ b/recipes-devtools/binutils/files/0014-Patch-microblaze-Add-wdc.ext.clear-and-wdc.ext.flush.patch | |||
@@ -0,0 +1,67 @@ | |||
1 | From: David Holsgrove <david.holsgrove@xilinx.com> | ||
2 | Date: Wed, 8 May 2013 11:03:36 +1000 | ||
3 | Subject: Add wdc.ext.clear and wdc.ext.flush insns | ||
4 | |||
5 | Added two new instructions, wdc.ext.clear and wdc.ext.flush, | ||
6 | to enable MicroBlaze to flush an external cache, which is | ||
7 | used with the new coherency support for multiprocessing. | ||
8 | |||
9 | Signed-off-by:nagaraju <nmekala@xilix.com> | ||
10 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | ||
11 | Upstream-Status: Pending | ||
12 | --- | ||
13 | opcodes/microblaze-opc.h | 5 ++++- | ||
14 | opcodes/microblaze-opcm.h | 6 +++--- | ||
15 | 2 files changed, 7 insertions(+), 4 deletions(-) | ||
16 | |||
17 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | ||
18 | index e9da12a..dd56ab5 100644 | ||
19 | --- a/opcodes/microblaze-opc.h | ||
20 | +++ b/opcodes/microblaze-opc.h | ||
21 | @@ -91,6 +91,7 @@ | ||
22 | #define OPCODE_MASK_H3 0xFC000600 /* High 6 bits and bits 21, 22. */ | ||
23 | #define OPCODE_MASK_H32 0xFC00FC00 /* High 6 bits and bit 16-21. */ | ||
24 | #define OPCODE_MASK_H34B 0xFC0000FF /* High 6 bits and low 8 bits. */ | ||
25 | +#define OPCODE_MASK_H35B 0xFC0004FF /* High 6 bits and low 9 bits. */ | ||
26 | #define OPCODE_MASK_H34C 0xFC0007E0 /* High 6 bits and bits 21-26. */ | ||
27 | |||
28 | /* New Mask for msrset, msrclr insns. */ | ||
29 | @@ -101,7 +102,7 @@ | ||
30 | #define DELAY_SLOT 1 | ||
31 | #define NO_DELAY_SLOT 0 | ||
32 | |||
33 | -#define MAX_OPCODES 289 | ||
34 | +#define MAX_OPCODES 291 | ||
35 | |||
36 | struct op_code_struct | ||
37 | { | ||
38 | @@ -174,7 +175,9 @@ struct op_code_struct | ||
39 | {"wic", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000068, OPCODE_MASK_H34B, wic, special_inst }, | ||
40 | {"wdc", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000064, OPCODE_MASK_H34B, wdc, special_inst }, | ||
41 | {"wdc.clear", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000066, OPCODE_MASK_H34B, wdcclear, special_inst }, | ||
42 | + {"wdc.ext.clear", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000466, OPCODE_MASK_H35B, wdcextclear, special_inst }, | ||
43 | {"wdc.flush", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000074, OPCODE_MASK_H34B, wdcflush, special_inst }, | ||
44 | + {"wdc.ext.flush", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000476, OPCODE_MASK_H35B, wdcextflush, special_inst }, | ||
45 | {"mts", INST_TYPE_SPECIAL_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MTS, 0x9400C000, OPCODE_MASK_H13S, mts, special_inst }, | ||
46 | {"mfs", INST_TYPE_RD_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MFS, 0x94008000, OPCODE_MASK_H23S, mfs, special_inst }, | ||
47 | {"br", INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst }, | ||
48 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | ||
49 | index 124cdec..8e531f9 100644 | ||
50 | --- a/opcodes/microblaze-opcm.h | ||
51 | +++ b/opcodes/microblaze-opcm.h | ||
52 | @@ -31,9 +31,9 @@ enum microblaze_instr | ||
53 | idiv, idivu, bsll, bsra, bsrl, get, put, nget, nput, cget, cput, | ||
54 | ncget, ncput, muli, bslli, bsrai, bsrli, mului, or, and, xor, | ||
55 | andn, pcmpbf, pcmpbc, pcmpeq, pcmpne, sra, src, srl, sext8, sext16, | ||
56 | - wic, wdc, wdcclear, wdcflush, mts, mfs, mbar, br, brd, | ||
57 | - brld, bra, brad, brald, microblaze_brk, beq, beqd, bne, bned, blt, | ||
58 | - bltd, ble, bled, bgt, bgtd, bge, bged, ori, andi, xori, andni, | ||
59 | + wic, wdc, wdcclear, wdcextclear, wdcflush, wdcextflush, mts, mfs, mbar, | ||
60 | + br, brd, brld, bra, brad, brald, microblaze_brk, beq, beqd, bne, bned, | ||
61 | + blt, bltd, ble, bled, bgt, bgtd, bge, bged, ori, andi, xori, andni, | ||
62 | imm, rtsd, rtid, rtbd, rted, bri, brid, brlid, brai, braid, bralid, | ||
63 | brki, beqi, beqid, bnei, bneid, blti, bltid, blei, bleid, bgti, | ||
64 | bgtid, bgei, bgeid, lbu, lbur, lhu, lhur, lw, lwr, lwx, sb, sbr, sh, | ||
65 | -- | ||
66 | 1.7.9.5 | ||
67 | |||
diff --git a/recipes-devtools/binutils/files/0015-Patch-microblaze-Add-mlittle-endian-and-mbig-endian-.patch b/recipes-devtools/binutils/files/0015-Patch-microblaze-Add-mlittle-endian-and-mbig-endian-.patch new file mode 100644 index 00000000..984fda3f --- /dev/null +++ b/recipes-devtools/binutils/files/0015-Patch-microblaze-Add-mlittle-endian-and-mbig-endian-.patch | |||
@@ -0,0 +1,64 @@ | |||
1 | From: nagaraju <nmekala@xilix.com> | ||
2 | Date: Tue, 19 Mar 2013 17:18:23 +0530 | ||
3 | Subject: Add mlittle-endian and mbig-endian flags | ||
4 | |||
5 | Added support in gas for mlittle-endian and mbig-endian flags | ||
6 | as options. | ||
7 | |||
8 | Updated show usage for MicroBlaze specific assembler options | ||
9 | to include new entries. | ||
10 | |||
11 | Signed-off-by:nagaraju <nmekala@xilix.com> | ||
12 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | ||
13 | Upstream-Status: Pending | ||
14 | --- | ||
15 | gas/config/tc-microblaze.c | 9 +++++++++ | ||
16 | 1 file changed, 9 insertions(+) | ||
17 | |||
18 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | ||
19 | index 872737b..b241743 100644 | ||
20 | --- a/gas/config/tc-microblaze.c | ||
21 | +++ b/gas/config/tc-microblaze.c | ||
22 | @@ -37,6 +37,8 @@ | ||
23 | |||
24 | #define OPTION_EB (OPTION_MD_BASE + 0) | ||
25 | #define OPTION_EL (OPTION_MD_BASE + 1) | ||
26 | +#define OPTION_LITTLE (OPTION_MD_BASE + 2) | ||
27 | +#define OPTION_BIG (OPTION_MD_BASE + 3) | ||
28 | |||
29 | void microblaze_generate_symbol (char *sym); | ||
30 | static bfd_boolean check_spl_reg (unsigned *); | ||
31 | @@ -1824,6 +1826,8 @@ struct option md_longopts[] = | ||
32 | { | ||
33 | {"EB", no_argument, NULL, OPTION_EB}, | ||
34 | {"EL", no_argument, NULL, OPTION_EL}, | ||
35 | + {"mlittle-endian", no_argument, NULL, OPTION_LITTLE}, | ||
36 | + {"mbig-endian", no_argument, NULL, OPTION_BIG}, | ||
37 | { NULL, no_argument, NULL, 0} | ||
38 | }; | ||
39 | |||
40 | @@ -2457,9 +2461,11 @@ md_parse_option (int c, char * arg ATTRIBUTE_UNUSED) | ||
41 | switch (c) | ||
42 | { | ||
43 | case OPTION_EB: | ||
44 | + case OPTION_BIG: | ||
45 | target_big_endian = 1; | ||
46 | break; | ||
47 | case OPTION_EL: | ||
48 | + case OPTION_LITTLE: | ||
49 | target_big_endian = 0; | ||
50 | break; | ||
51 | default: | ||
52 | @@ -2474,6 +2480,9 @@ md_show_usage (FILE * stream ATTRIBUTE_UNUSED) | ||
53 | /* fprintf(stream, _("\ | ||
54 | MicroBlaze options:\n\ | ||
55 | -noSmall Data in the comm and data sections do not go into the small data section\n")); */ | ||
56 | + fprintf (stream, _(" MicroBlaze specific assembler options:\n")); | ||
57 | + fprintf (stream, " -%-23s%s\n", "mbig-endian", N_("assemble for a big endian cpu")); | ||
58 | + fprintf (stream, " -%-23s%s\n", "mlittle-endian", N_("assemble for a little endian cpu")); | ||
59 | } | ||
60 | |||
61 | |||
62 | -- | ||
63 | 1.7.9.5 | ||
64 | |||
diff --git a/recipes-devtools/binutils/files/0016-Disable-the-warning-message-for-eh_frame_hdr.patch b/recipes-devtools/binutils/files/0016-Disable-the-warning-message-for-eh_frame_hdr.patch new file mode 100644 index 00000000..f6616a1b --- /dev/null +++ b/recipes-devtools/binutils/files/0016-Disable-the-warning-message-for-eh_frame_hdr.patch | |||
@@ -0,0 +1,33 @@ | |||
1 | From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com> | ||
2 | Date: Fri, 22 Jun 2012 01:20:20 +0200 | ||
3 | Subject: Disable the warning message for eh_frame_hdr | ||
4 | |||
5 | Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> | ||
6 | Upstream-Status: Pending | ||
7 | --- | ||
8 | bfd/elf-eh-frame.c | 9 ++++++--- | ||
9 | 1 file changed, 6 insertions(+), 3 deletions(-) | ||
10 | |||
11 | diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c | ||
12 | index a75d806..de69cef 100644 | ||
13 | --- a/bfd/elf-eh-frame.c | ||
14 | +++ b/bfd/elf-eh-frame.c | ||
15 | @@ -913,9 +913,12 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info, | ||
16 | goto success; | ||
17 | |||
18 | free_no_table: | ||
19 | - (*info->callbacks->einfo) | ||
20 | - (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"), | ||
21 | - abfd, sec); | ||
22 | + /* FIXME: Remove the microblaze specifics when relaxing gets fixed. */ | ||
23 | + if (bfd_get_arch(abfd) != bfd_arch_microblaze) { | ||
24 | + (*info->callbacks->einfo) | ||
25 | + (_("%P: error in %B(%A); no .eh_frame_hdr table will be created.\n"), | ||
26 | + abfd, sec); | ||
27 | + } | ||
28 | hdr_info->table = FALSE; | ||
29 | if (sec_info) | ||
30 | free (sec_info); | ||
31 | -- | ||
32 | 1.7.9.5 | ||
33 | |||
diff --git a/recipes-devtools/binutils/files/0017-Fix-relaxation-of-assembler-resolved-reference.patch b/recipes-devtools/binutils/files/0017-Fix-relaxation-of-assembler-resolved-reference.patch new file mode 100644 index 00000000..fb3ff355 --- /dev/null +++ b/recipes-devtools/binutils/files/0017-Fix-relaxation-of-assembler-resolved-reference.patch | |||
@@ -0,0 +1,75 @@ | |||
1 | From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com> | ||
2 | Date: Tue, 14 Feb 2012 01:00:22 +0100 | ||
3 | Subject: Fix relaxation of assembler resolved references | ||
4 | |||
5 | Upstream-Status: Pending | ||
6 | --- | ||
7 | bfd/elf32-microblaze.c | 39 +++++++++++++++++++++++++++++++++++++++ | ||
8 | gas/config/tc-microblaze.c | 1 + | ||
9 | 2 files changed, 40 insertions(+) | ||
10 | |||
11 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | ||
12 | index 502e3c9..9de2479 100644 | ||
13 | --- a/bfd/elf32-microblaze.c | ||
14 | +++ b/bfd/elf32-microblaze.c | ||
15 | @@ -1906,6 +1906,45 @@ microblaze_elf_relax_section (bfd *abfd, | ||
16 | irelscanend = irelocs + o->reloc_count; | ||
17 | for (irelscan = irelocs; irelscan < irelscanend; irelscan++) | ||
18 | { | ||
19 | + if (ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_NONE) | ||
20 | + { | ||
21 | + unsigned int val; | ||
22 | + | ||
23 | + isym = isymbuf + ELF32_R_SYM (irelscan->r_info); | ||
24 | + | ||
25 | + /* This was a PC-relative instruction that was completely resolved. */ | ||
26 | + if (ocontents == NULL) | ||
27 | + { | ||
28 | + if (elf_section_data (o)->this_hdr.contents != NULL) | ||
29 | + ocontents = elf_section_data (o)->this_hdr.contents; | ||
30 | + else | ||
31 | + { | ||
32 | + /* We always cache the section contents. | ||
33 | + Perhaps, if info->keep_memory is FALSE, we | ||
34 | + should free them, if we are permitted to. */ | ||
35 | + | ||
36 | + if (o->rawsize == 0) | ||
37 | + o->rawsize = o->size; | ||
38 | + ocontents = (bfd_byte *) bfd_malloc (o->rawsize); | ||
39 | + if (ocontents == NULL) | ||
40 | + goto error_return; | ||
41 | + if (!bfd_get_section_contents (abfd, o, ocontents, | ||
42 | + (file_ptr) 0, | ||
43 | + o->rawsize)) | ||
44 | + goto error_return; | ||
45 | + elf_section_data (o)->this_hdr.contents = ocontents; | ||
46 | + } | ||
47 | + } | ||
48 | + | ||
49 | + irelscan->r_addend -= calc_fixup (irelscan->r_addend | ||
50 | + + isym->st_value, sec); | ||
51 | + val = bfd_get_32 (abfd, ocontents + irelscan->r_offset); | ||
52 | + microblaze_bfd_write_imm_value_32 (abfd, ocontents + irelscan->r_offset, | ||
53 | + irelscan->r_addend); | ||
54 | + } | ||
55 | + if (ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64_NONE) { | ||
56 | + fprintf(stderr, "Unhandled NONE 64\n"); | ||
57 | + } | ||
58 | if (ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32) | ||
59 | { | ||
60 | isym = isymbuf + ELF32_R_SYM (irelscan->r_info); | ||
61 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | ||
62 | index b241743..7dd5895 100644 | ||
63 | --- a/gas/config/tc-microblaze.c | ||
64 | +++ b/gas/config/tc-microblaze.c | ||
65 | @@ -2169,6 +2169,7 @@ md_apply_fix (fixS * fixP, | ||
66 | else | ||
67 | fixP->fx_r_type = BFD_RELOC_NONE; | ||
68 | fixP->fx_addsy = section_symbol (absolute_section); | ||
69 | + fixP->fx_done = 0; | ||
70 | } | ||
71 | return; | ||
72 | } | ||
73 | -- | ||
74 | 1.7.9.5 | ||
75 | |||
diff --git a/recipes-devtools/binutils/files/0018-Fixup-debug_loc-sections-after-linker-relaxati.patch b/recipes-devtools/binutils/files/0018-Fixup-debug_loc-sections-after-linker-relaxati.patch new file mode 100644 index 00000000..05a3e083 --- /dev/null +++ b/recipes-devtools/binutils/files/0018-Fixup-debug_loc-sections-after-linker-relaxati.patch | |||
@@ -0,0 +1,232 @@ | |||
1 | From: David Holsgrove <david.holsgrove@xilinx.com> | ||
2 | Date: Mon, 4 Feb 2013 12:15:22 +1000 | ||
3 | Subject: Fixup debug_loc sections after linker relaxation | ||
4 | |||
5 | Adds a new reloctype R_MICROBLAZE_32_NONE, used for passing | ||
6 | reloc info from the assembler to the linker when the linker | ||
7 | manages to fully resolve a local symbol reference. | ||
8 | |||
9 | This is a workaround for design flaws in the assembler to | ||
10 | linker interface with regards to linker relaxation. | ||
11 | |||
12 | Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> | ||
13 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | ||
14 | Upstream-Status: Pending | ||
15 | --- | ||
16 | bfd/bfd-in2.h | 7 ++++++- | ||
17 | bfd/elf32-microblaze.c | 45 ++++++++++++++++++++++++++++++++++++-------- | ||
18 | bfd/libbfd.h | 1 + | ||
19 | bfd/reloc.c | 6 ++++++ | ||
20 | binutils/readelf.c | 4 ++++ | ||
21 | gas/config/tc-microblaze.c | 3 +++ | ||
22 | include/elf/microblaze.h | 1 + | ||
23 | 7 files changed, 58 insertions(+), 9 deletions(-) | ||
24 | |||
25 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | ||
26 | index 1e47573..d50375e 100644 | ||
27 | --- a/bfd/bfd-in2.h | ||
28 | +++ b/bfd/bfd-in2.h | ||
29 | @@ -5035,9 +5035,14 @@ value relative to the read-write small data area anchor */ | ||
30 | expressions of the form "Symbol Op Symbol" */ | ||
31 | BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM, | ||
32 | |||
33 | -/* This is a 64 bit reloc that stores the 32 bit pc relative | ||
34 | +/* This is a 32 bit reloc that stores the 32 bit pc relative | ||
35 | value in two words (with an imm instruction). No relocation is | ||
36 | done here - only used for relaxing */ | ||
37 | + BFD_RELOC_MICROBLAZE_32_NONE, | ||
38 | + | ||
39 | +/* This is a 64 bit reloc that stores the 32 bit pc relative | ||
40 | +value in two words (with an imm instruction). No relocation is | ||
41 | +done here - only used for relaxing */ | ||
42 | BFD_RELOC_MICROBLAZE_64_NONE, | ||
43 | |||
44 | /* This is a 64 bit reloc that stores the 32 bit pc relative | ||
45 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | ||
46 | index 9de2479..1f20e23 100644 | ||
47 | --- a/bfd/elf32-microblaze.c | ||
48 | +++ b/bfd/elf32-microblaze.c | ||
49 | @@ -177,6 +177,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
50 | FALSE), /* PC relative offset? */ | ||
51 | |||
52 | /* This reloc does nothing. Used for relaxation. */ | ||
53 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ | ||
54 | + 0, /* Rightshift. */ | ||
55 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
56 | + 32, /* Bitsize. */ | ||
57 | + TRUE, /* PC_relative. */ | ||
58 | + 0, /* Bitpos. */ | ||
59 | + complain_overflow_bitfield, /* Complain on overflow. */ | ||
60 | + NULL, /* Special Function. */ | ||
61 | + "R_MICROBLAZE_32_NONE",/* Name. */ | ||
62 | + FALSE, /* Partial Inplace. */ | ||
63 | + 0, /* Source Mask. */ | ||
64 | + 0, /* Dest Mask. */ | ||
65 | + FALSE), /* PC relative offset? */ | ||
66 | + | ||
67 | HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ | ||
68 | 0, /* Rightshift. */ | ||
69 | 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
70 | @@ -532,7 +546,10 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | ||
71 | case BFD_RELOC_NONE: | ||
72 | microblaze_reloc = R_MICROBLAZE_NONE; | ||
73 | break; | ||
74 | - case BFD_RELOC_MICROBLAZE_64_NONE: | ||
75 | + case BFD_RELOC_MICROBLAZE_32_NONE: | ||
76 | + microblaze_reloc = R_MICROBLAZE_32_NONE; | ||
77 | + break; | ||
78 | + case BFD_RELOC_MICROBLAZE_64_NONE: | ||
79 | microblaze_reloc = R_MICROBLAZE_64_NONE; | ||
80 | break; | ||
81 | case BFD_RELOC_32: | ||
82 | @@ -1851,14 +1868,22 @@ microblaze_elf_relax_section (bfd *abfd, | ||
83 | } | ||
84 | break; | ||
85 | case R_MICROBLAZE_NONE: | ||
86 | + case R_MICROBLAZE_32_NONE: | ||
87 | { | ||
88 | /* This was a PC-relative instruction that was | ||
89 | completely resolved. */ | ||
90 | int sfix, efix; | ||
91 | + unsigned int val; | ||
92 | bfd_vma target_address; | ||
93 | target_address = irel->r_addend + irel->r_offset; | ||
94 | sfix = calc_fixup (irel->r_offset, 0, sec); | ||
95 | efix = calc_fixup (target_address, 0, sec); | ||
96 | + | ||
97 | + /* Validate the in-band val. */ | ||
98 | + val = bfd_get_32 (abfd, contents + irel->r_offset); | ||
99 | + if (val != irel->r_addend && ELF32_R_TYPE (irel->r_info) == R_MICROBLAZE_32_NONE) { | ||
100 | + fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); | ||
101 | + } | ||
102 | irel->r_addend -= (efix - sfix); | ||
103 | /* Should use HOWTO. */ | ||
104 | microblaze_bfd_write_imm_value_32 (abfd, contents + irel->r_offset, | ||
105 | @@ -1906,12 +1931,16 @@ microblaze_elf_relax_section (bfd *abfd, | ||
106 | irelscanend = irelocs + o->reloc_count; | ||
107 | for (irelscan = irelocs; irelscan < irelscanend; irelscan++) | ||
108 | { | ||
109 | - if (ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_NONE) | ||
110 | + if (1 && ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_NONE) | ||
111 | { | ||
112 | unsigned int val; | ||
113 | |||
114 | isym = isymbuf + ELF32_R_SYM (irelscan->r_info); | ||
115 | |||
116 | + /* hax: We only do the following fixup for debug location lists. */ | ||
117 | + if (strcmp(".debug_loc", o->name)) | ||
118 | + continue; | ||
119 | + | ||
120 | /* This was a PC-relative instruction that was completely resolved. */ | ||
121 | if (ocontents == NULL) | ||
122 | { | ||
123 | @@ -1936,15 +1965,15 @@ microblaze_elf_relax_section (bfd *abfd, | ||
124 | } | ||
125 | } | ||
126 | |||
127 | - irelscan->r_addend -= calc_fixup (irelscan->r_addend | ||
128 | - + isym->st_value, sec); | ||
129 | val = bfd_get_32 (abfd, ocontents + irelscan->r_offset); | ||
130 | + if (val != irelscan->r_addend) { | ||
131 | + fprintf(stderr, "%d: CORRUPT relax reloc! %x %lx\n", __LINE__, val, irelscan->r_addend); | ||
132 | + } | ||
133 | + | ||
134 | + irelscan->r_addend -= calc_fixup (irelscan->r_addend, 0, sec); | ||
135 | microblaze_bfd_write_imm_value_32 (abfd, ocontents + irelscan->r_offset, | ||
136 | irelscan->r_addend); | ||
137 | } | ||
138 | - if (ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64_NONE) { | ||
139 | - fprintf(stderr, "Unhandled NONE 64\n"); | ||
140 | - } | ||
141 | if (ELF32_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32) | ||
142 | { | ||
143 | isym = isymbuf + ELF32_R_SYM (irelscan->r_info); | ||
144 | @@ -2004,7 +2033,7 @@ microblaze_elf_relax_section (bfd *abfd, | ||
145 | elf_section_data (o)->this_hdr.contents = ocontents; | ||
146 | } | ||
147 | } | ||
148 | - irelscan->r_addend -= calc_fixup (irel->r_addend | ||
149 | + irelscan->r_addend -= calc_fixup (irelscan->r_addend | ||
150 | + isym->st_value, | ||
151 | 0, | ||
152 | sec); | ||
153 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h | ||
154 | index e20013a..7a943eb 100644 | ||
155 | --- a/bfd/libbfd.h | ||
156 | +++ b/bfd/libbfd.h | ||
157 | @@ -2411,6 +2411,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | ||
158 | "BFD_RELOC_MICROBLAZE_32_ROSDA", | ||
159 | "BFD_RELOC_MICROBLAZE_32_RWSDA", | ||
160 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", | ||
161 | + "BFD_RELOC_MICROBLAZE_32_NONE", | ||
162 | "BFD_RELOC_MICROBLAZE_64_NONE", | ||
163 | "BFD_RELOC_MICROBLAZE_64_GOTPC", | ||
164 | "BFD_RELOC_MICROBLAZE_64_GOT", | ||
165 | diff --git a/bfd/reloc.c b/bfd/reloc.c | ||
166 | index 76669fa..99496d8 100644 | ||
167 | --- a/bfd/reloc.c | ||
168 | +++ b/bfd/reloc.c | ||
169 | @@ -5842,6 +5842,12 @@ ENUMDOC | ||
170 | This is a 32 bit reloc for the microblaze to handle | ||
171 | expressions of the form "Symbol Op Symbol" | ||
172 | ENUM | ||
173 | + BFD_RELOC_MICROBLAZE_32_NONE | ||
174 | +ENUMDOC | ||
175 | + This is a 32 bit reloc that stores the 32 bit pc relative | ||
176 | + value in two words (with an imm instruction). No relocation is | ||
177 | + done here - only used for relaxing | ||
178 | +ENUM | ||
179 | BFD_RELOC_MICROBLAZE_64_NONE | ||
180 | ENUMDOC | ||
181 | This is a 64 bit reloc that stores the 32 bit pc relative | ||
182 | diff --git a/binutils/readelf.c b/binutils/readelf.c | ||
183 | index d9ec436..df892de 100644 | ||
184 | --- a/binutils/readelf.c | ||
185 | +++ b/binutils/readelf.c | ||
186 | @@ -10207,6 +10207,10 @@ is_none_reloc (unsigned int reloc_type) | ||
187 | return reloc_type == 0; | ||
188 | case EM_AARCH64: | ||
189 | return reloc_type == 0 || reloc_type == 256; | ||
190 | + case EM_MICROBLAZE: | ||
191 | + return reloc_type == 30 /* R_MICROBLAZE_32_NONE. */ | ||
192 | + || reloc_type == 0 /* R_MICROBLAZE_NONE. */ | ||
193 | + || reloc_type == 9; /* R_MICROBLAZE_64_NONE. */ | ||
194 | case EM_XTENSA_OLD: | ||
195 | case EM_XTENSA: | ||
196 | return (reloc_type == 0 /* R_XTENSA_NONE. */ | ||
197 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | ||
198 | index 7dd5895..884819f 100644 | ||
199 | --- a/gas/config/tc-microblaze.c | ||
200 | +++ b/gas/config/tc-microblaze.c | ||
201 | @@ -2166,6 +2166,8 @@ md_apply_fix (fixS * fixP, | ||
202 | moves code around due to relaxing. */ | ||
203 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) | ||
204 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | ||
205 | + else if (fixP->fx_r_type == BFD_RELOC_32) | ||
206 | + fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; | ||
207 | else | ||
208 | fixP->fx_r_type = BFD_RELOC_NONE; | ||
209 | fixP->fx_addsy = section_symbol (absolute_section); | ||
210 | @@ -2387,6 +2389,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | ||
211 | switch (fixp->fx_r_type) | ||
212 | { | ||
213 | case BFD_RELOC_NONE: | ||
214 | + case BFD_RELOC_MICROBLAZE_32_NONE: | ||
215 | case BFD_RELOC_MICROBLAZE_64_NONE: | ||
216 | case BFD_RELOC_32: | ||
217 | case BFD_RELOC_MICROBLAZE_32_LO: | ||
218 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h | ||
219 | index c4d9821..72771e8 100644 | ||
220 | --- a/include/elf/microblaze.h | ||
221 | +++ b/include/elf/microblaze.h | ||
222 | @@ -58,6 +58,7 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) | ||
223 | RELOC_NUMBER (R_MICROBLAZE_TLSDTPREL64, 27) /* TLS Offset Within TLS Block */ | ||
224 | RELOC_NUMBER (R_MICROBLAZE_TLSGOTTPREL32, 28) /* TLS Offset From Thread Pointer */ | ||
225 | RELOC_NUMBER (R_MICROBLAZE_TLSTPREL32, 29) /* TLS Offset From Thread Pointer */ | ||
226 | + RELOC_NUMBER (R_MICROBLAZE_32_NONE, 30) | ||
227 | |||
228 | END_RELOC_NUMBERS (R_MICROBLAZE_max) | ||
229 | |||
230 | -- | ||
231 | 1.7.9.5 | ||
232 | |||
diff --git a/recipes-devtools/binutils/files/0019-upstream-change-to-garbage-collection-s.patch b/recipes-devtools/binutils/files/0019-upstream-change-to-garbage-collection-s.patch new file mode 100644 index 00000000..e062ef0e --- /dev/null +++ b/recipes-devtools/binutils/files/0019-upstream-change-to-garbage-collection-s.patch | |||
@@ -0,0 +1,38 @@ | |||
1 | From: David Holsgrove <david.holsgrove@xilinx.com> | ||
2 | Date: Wed, 27 Feb 2013 13:56:11 +1000 | ||
3 | Subject: upstream change to garbage collection sweep causes mb regression | ||
4 | |||
5 | Upstream change for PR13177 now clears the def_regular during gc_sweep of a | ||
6 | section. (All other archs in binutils/bfd/elf32-*.c received an update | ||
7 | to a warning about unresolvable relocations - this warning is not present | ||
8 | in binutils/bfd/elf32-microblaze.c, but this warning check would not | ||
9 | prevent the error being seen) | ||
10 | |||
11 | The visible issue with this change is when running a c++ application | ||
12 | in Petalinux which links libstdc++.so for exception handling it segfaults | ||
13 | on execution. | ||
14 | |||
15 | This does not occur if static linking libstdc++.a, so its during the | ||
16 | relocations for a shared lib with garbage collection this occurs | ||
17 | |||
18 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | ||
19 | Upstream-Status: Pending | ||
20 | --- | ||
21 | bfd/elflink.c | 1 - | ||
22 | 1 file changed, 1 deletion(-) | ||
23 | |||
24 | diff --git a/bfd/elflink.c b/bfd/elflink.c | ||
25 | index bcd3add..e6d7bfb 100644 | ||
26 | --- a/bfd/elflink.c | ||
27 | +++ b/bfd/elflink.c | ||
28 | @@ -11870,7 +11870,6 @@ elf_gc_sweep_symbol (struct elf_link_hash_entry *h, void *data) | ||
29 | |||
30 | inf = (struct elf_gc_sweep_symbol_info *) data; | ||
31 | (*inf->hide_symbol) (inf->info, h, TRUE); | ||
32 | - h->def_regular = 0; | ||
33 | h->ref_regular = 0; | ||
34 | h->ref_regular_nonweak = 0; | ||
35 | } | ||
36 | -- | ||
37 | 1.7.9.5 | ||
38 | |||