diff options
| author | Mark Hatle <mark.hatle@xilinx.com> | 2021-12-02 04:23:52 -0800 |
|---|---|---|
| committer | Mark Hatle <mark.hatle@xilinx.com> | 2022-01-14 11:21:32 -0800 |
| commit | d458a64c2f6828c41a69b4c223fe42c3c6cdfefd (patch) | |
| tree | e3b7ed7851c643dcf2f3fa32d71abcc718bae328 /meta-microblaze/recipes-devtools/binutils | |
| parent | 29a9511c3004d3ad8a0e9a66e6cd312677b8cc68 (diff) | |
| download | meta-xilinx-d458a64c2f6828c41a69b4c223fe42c3c6cdfefd.tar.gz | |
binutils: Upgraade to honister version
Signed-off-by: Mark Hatle <mark.hatle@xilinx.com>
Diffstat (limited to 'meta-microblaze/recipes-devtools/binutils')
59 files changed, 3912 insertions, 5446 deletions
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils-microblaze.inc b/meta-microblaze/recipes-devtools/binutils/binutils-microblaze.inc index 44f4cc79..462bbefd 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils-microblaze.inc +++ b/meta-microblaze/recipes-devtools/binutils/binutils-microblaze.inc | |||
| @@ -14,47 +14,29 @@ SRC_URI:append = " \ | |||
| 14 | file://0011-Patch-Microblaze-fixed-bug-in-GCC-so-that-It-will-su.patch \ | 14 | file://0011-Patch-Microblaze-fixed-bug-in-GCC-so-that-It-will-su.patch \ |
| 15 | file://0012-fixing-the-constant-range-check-issue.patch \ | 15 | file://0012-fixing-the-constant-range-check-issue.patch \ |
| 16 | file://0013-Patch-Microblaze-Compiler-will-give-error-messages-i.patch \ | 16 | file://0013-Patch-Microblaze-Compiler-will-give-error-messages-i.patch \ |
| 17 | file://0014-intial-commit-of-MB-64-bit.patch \ | 17 | file://0014-Patch-MicroBlaze-initial-support-for-MicroBlaze-64-b.patch \ |
| 18 | file://0015-MB-X-initial-commit.patch \ | 18 | file://0015-Patch-Microblaze-negl-instruction-is-overriding-rsub.patch \ |
| 19 | file://0016-Patch-Microblaze-negl-instruction-is-overriding-rsub.patch \ | 19 | file://0016-Added-relocations-for-MB-X.patch \ |
| 20 | file://0017-Added-relocations-for-MB-X.patch \ | 20 | file://0017-Fixed-MB-x-relocation-issues.patch \ |
| 21 | file://0018-Fixed-MB-x-relocation-issues.patch \ | 21 | file://0018-Fixing-the-branch-related-issues.patch \ |
| 22 | file://0019-Fixing-the-branch-related-issues.patch \ | 22 | file://0019-Fixed-address-computation-issues-with-64bit-address.patch \ |
| 23 | file://0020-Fixed-address-computation-issues-with-64bit-address.patch \ | 23 | file://0020-Patch-MicroBlaze-Adding-new-relocation-to-support-64.patch \ |
| 24 | file://0021-Adding-new-relocation-to-support-64bit-rodata.patch \ | 24 | file://0021-fixing-the-.bss-relocation-issue.patch \ |
| 25 | file://0022-fixing-the-.bss-relocation-issue.patch \ | 25 | file://0022-Fixed-the-bug-in-the-R_MICROBLAZE_64_NONE-relocation.patch \ |
| 26 | file://0023-Fixed-the-bug-in-the-R_MICROBLAZE_64_NONE-relocation.patch \ | 26 | file://0023-Revert-ld-Remove-unused-expression-state.patch \ |
| 27 | file://0024-Revert-ld-Remove-unused-expression-state.patch \ | 27 | file://0024-fixing-the-long-long-long-mingw-toolchain-issue.patch \ |
| 28 | file://0025-fixing-the-long-long-long-mingw-toolchain-issue.patch \ | 28 | file://0025-Added-support-to-new-arithmetic-single-register-inst.patch \ |
| 29 | file://0026-Added-support-to-new-arithmetic-single-register-inst.patch \ | 29 | file://0026-Patch-MicroBlaze-double-imml-generation-for-64-bit-v.patch \ |
| 30 | file://0027-Patch-MicroBlaze-double-imml-generation-for-64-bit-v.patch \ | 30 | file://0027-Fixed-bug-in-generation-of-IMML-instruction-for-the.patch \ |
| 31 | file://0028-Fixed-bug-in-generation-of-IMML-instruction-for-the.patch \ | 31 | file://0028-Patch-MicroBlaze-m64-This-patch-will-remove-imml-0-a.patch \ |
| 32 | file://0029-Patch-MicroBlaze-m64-This-patch-will-remove-imml-0-a.patch \ | 32 | file://0029-Patch-MicroBlaze-improper-address-mapping-of-PROVIDE.patch \ |
| 33 | file://0030-Patch-MicroBlaze-improper-address-mapping-of-PROVIDE.patch \ | 33 | file://0030-Patch-microblaze-Changing-the-long-to-long-long-as-i.patch \ |
| 34 | file://0031-gas-revert-moving-of-md_pseudo_table-from-const.patch \ | 34 | file://0031-gas-revert-moving-of-md_pseudo_table-from-const.patch \ |
| 35 | file://0032-ld-emulparams-elf64microblaze-Fix-emulation-generati.patch \ | 35 | file://0032-ld-emulparams-elf64microblaze-Fix-emulation-generati.patch \ |
| 36 | file://0033-Add-initial-port-of-linux-gdbserver-add-gdb_proc_ser.patch \ | 36 | file://0033-Add-initial-port-of-linux-gdbserver.patch \ |
| 37 | file://0034-Initial-port-of-core-reading-support-Added-support-f.patch \ | 37 | file://0034-Initial-port-of-core-reading-support.patch \ |
| 38 | file://0035-Fix-debug-message-when-register-is-unavailable.patch \ | 38 | file://0035-Fix-debug-message-when-register-is-unavailable.patch \ |
| 39 | file://0036-revert-master-rebase-changes-to-gdbserver.patch \ | 39 | file://0036-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch \ |
| 40 | file://0037-revert-master-rebase-changes-to-gdbserver-previous-c.patch \ | 40 | file://0037-Fixing-the-issues-related-to-GDB-7.12.patch \ |
| 41 | file://0038-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch \ | 41 | file://0038-Patch-MB-MB-binutils-Upstream-port-issues.patch \ |
| 42 | file://0039-Initial-support-for-native-gdb.patch \ | ||
| 43 | file://0040-Fixing-the-issues-related-to-GDB-7.12-added-all-the-.patch \ | ||
| 44 | file://0041-Adding-64-bit-MB-support-Added-new-architecture-to-M.patch \ | ||
| 45 | file://0042-porting-GDB-for-linux.patch \ | ||
| 46 | file://0043-Binutils-security-check-is-causing-build-error-for-w.patch \ | ||
| 47 | file://0044-Correcting-the-register-names-from-slr-shr-to-rslr-r.patch \ | ||
| 48 | file://0045-Removing-the-header-gdb_assert.h-from-MB-target-file.patch \ | ||
| 49 | file://0046-bfd-cpu-microblaze.c-Enhance-disassembler.patch \ | ||
| 50 | file://0047-bfd-elf64-microblaze.c-Fix-build-failures.patch \ | ||
| 51 | file://0048-bfd-elf-microblaze.c-Remove-obsolete-entries.patch \ | ||
| 52 | file://0049-bfd-elf64-microblaze.c-Resolve-various-compiler-warn.patch \ | ||
| 53 | file://0050-opcodes-microblaze-dis.c-Fix-compile-warnings.patch \ | ||
| 54 | file://0051-gdb-microblaze-tdep.c-Remove-unused-functions.patch \ | ||
| 55 | file://0052-sim-Allow-microblaze-architecture.patch \ | ||
| 56 | file://0053-gdb-Fix-microblaze-target-compilation.patch \ | ||
| 57 | file://0054-Patch-MicroBlaze.patch \ | ||
| 58 | file://0055-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch \ | ||
| 59 | file://0056-Patch-microblaze-Changing-the-long-to-long-long-as-i.patch \ | ||
| 60 | " | 42 | " |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0001-Add-wdc.ext.clear-and-wdc.ext.flush-insns.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0001-Add-wdc.ext.clear-and-wdc.ext.flush-insns.patch index fe3f2bff..c34600e5 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0001-Add-wdc.ext.clear-and-wdc.ext.flush-insns.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0001-Add-wdc.ext.clear-and-wdc.ext.flush-insns.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 212bd1115f13cc0904fb5556751585c775bc51a6 Mon Sep 17 00:00:00 2001 | 1 | From baa73267935dc5854f4e07c809a46e42aa8cca4b Mon Sep 17 00:00:00 2001 |
| 2 | From: David Holsgrove <david.holsgrove@xilinx.com> | 2 | From: David Holsgrove <david.holsgrove@xilinx.com> |
| 3 | Date: Wed, 8 May 2013 11:03:36 +1000 | 3 | Date: Wed, 8 May 2013 11:03:36 +1000 |
| 4 | Subject: [PATCH 01/52] Add wdc.ext.clear and wdc.ext.flush insns | 4 | Subject: [PATCH 01/38] Add wdc.ext.clear and wdc.ext.flush insns |
| 5 | 5 | ||
| 6 | Added two new instructions, wdc.ext.clear and wdc.ext.flush, | 6 | Added two new instructions, wdc.ext.clear and wdc.ext.flush, |
| 7 | to enable MicroBlaze to flush an external cache, which is | 7 | to enable MicroBlaze to flush an external cache, which is |
| @@ -15,7 +15,7 @@ Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | |||
| 15 | 2 files changed, 6 insertions(+), 3 deletions(-) | 15 | 2 files changed, 6 insertions(+), 3 deletions(-) |
| 16 | 16 | ||
| 17 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 17 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 18 | index 27d8684df0..b6c5016e4d 100644 | 18 | index 080d238bd2b..746566fdb87 100644 |
| 19 | --- a/opcodes/microblaze-opc.h | 19 | --- a/opcodes/microblaze-opc.h |
| 20 | +++ b/opcodes/microblaze-opc.h | 20 | +++ b/opcodes/microblaze-opc.h |
| 21 | @@ -91,6 +91,7 @@ | 21 | @@ -91,6 +91,7 @@ |
| @@ -33,9 +33,9 @@ index 27d8684df0..b6c5016e4d 100644 | |||
| 33 | -#define MAX_OPCODES 289 | 33 | -#define MAX_OPCODES 289 |
| 34 | +#define MAX_OPCODES 291 | 34 | +#define MAX_OPCODES 291 |
| 35 | 35 | ||
| 36 | struct op_code_struct | 36 | const struct op_code_struct |
| 37 | { | 37 | { |
| 38 | @@ -174,7 +175,9 @@ struct op_code_struct | 38 | @@ -174,7 +175,9 @@ const 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 }, | 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 }, | 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 }, | 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 }, |
| @@ -46,7 +46,7 @@ index 27d8684df0..b6c5016e4d 100644 | |||
| 46 | {"mfs", INST_TYPE_RD_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_MFS, 0x94008000, OPCODE_MASK_H23S, mfs, 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 }, | 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 | 48 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h |
| 49 | index aa53dfe6bb..795c57b5ff 100644 | 49 | index 6dd3694f4be..10d7e883366 100644 |
| 50 | --- a/opcodes/microblaze-opcm.h | 50 | --- a/opcodes/microblaze-opcm.h |
| 51 | +++ b/opcodes/microblaze-opcm.h | 51 | +++ b/opcodes/microblaze-opcm.h |
| 52 | @@ -33,8 +33,8 @@ enum microblaze_instr | 52 | @@ -33,8 +33,8 @@ enum microblaze_instr |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0002-Add-mlittle-endian-and-mbig-endian-flags.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0002-Add-mlittle-endian-and-mbig-endian-flags.patch index 78f4be14..03fcf2f0 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0002-Add-mlittle-endian-and-mbig-endian-flags.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0002-Add-mlittle-endian-and-mbig-endian-flags.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 23ed5e7ab73a2b5dc1ca09362d4815a643a2d187 Mon Sep 17 00:00:00 2001 | 1 | From 2c240d885b5871571d93af64baf2e67f077f735c Mon Sep 17 00:00:00 2001 |
| 2 | From: nagaraju <nmekala@xilix.com> | 2 | From: nagaraju <nmekala@xilix.com> |
| 3 | Date: Tue, 19 Mar 2013 17:18:23 +0530 | 3 | Date: Tue, 19 Mar 2013 17:18:23 +0530 |
| 4 | Subject: [PATCH 02/52] Add mlittle-endian and mbig-endian flags | 4 | Subject: [PATCH 02/38] Add mlittle-endian and mbig-endian flags |
| 5 | 5 | ||
| 6 | Added support in gas for mlittle-endian and mbig-endian flags | 6 | Added support in gas for mlittle-endian and mbig-endian flags |
| 7 | as options. | 7 | as options. |
| @@ -16,7 +16,7 @@ Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | |||
| 16 | 1 file changed, 9 insertions(+) | 16 | 1 file changed, 9 insertions(+) |
| 17 | 17 | ||
| 18 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 18 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 19 | index ae5d36dc9c..34eeb97235 100644 | 19 | index 881172d5274..d6fc400cef9 100644 |
| 20 | --- a/gas/config/tc-microblaze.c | 20 | --- a/gas/config/tc-microblaze.c |
| 21 | +++ b/gas/config/tc-microblaze.c | 21 | +++ b/gas/config/tc-microblaze.c |
| 22 | @@ -37,6 +37,8 @@ | 22 | @@ -37,6 +37,8 @@ |
| @@ -27,8 +27,8 @@ index ae5d36dc9c..34eeb97235 100644 | |||
| 27 | +#define OPTION_BIG (OPTION_MD_BASE + 3) | 27 | +#define OPTION_BIG (OPTION_MD_BASE + 3) |
| 28 | 28 | ||
| 29 | void microblaze_generate_symbol (char *sym); | 29 | void microblaze_generate_symbol (char *sym); |
| 30 | static bfd_boolean check_spl_reg (unsigned *); | 30 | static bool check_spl_reg (unsigned *); |
| 31 | @@ -1842,6 +1844,8 @@ struct option md_longopts[] = | 31 | @@ -1854,6 +1856,8 @@ struct option md_longopts[] = |
| 32 | { | 32 | { |
| 33 | {"EB", no_argument, NULL, OPTION_EB}, | 33 | {"EB", no_argument, NULL, OPTION_EB}, |
| 34 | {"EL", no_argument, NULL, OPTION_EL}, | 34 | {"EL", no_argument, NULL, OPTION_EL}, |
| @@ -37,7 +37,7 @@ index ae5d36dc9c..34eeb97235 100644 | |||
| 37 | { NULL, no_argument, NULL, 0} | 37 | { NULL, no_argument, NULL, 0} |
| 38 | }; | 38 | }; |
| 39 | 39 | ||
| 40 | @@ -2494,9 +2498,11 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) | 40 | @@ -2507,9 +2511,11 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) |
| 41 | switch (c) | 41 | switch (c) |
| 42 | { | 42 | { |
| 43 | case OPTION_EB: | 43 | case OPTION_EB: |
| @@ -49,7 +49,7 @@ index ae5d36dc9c..34eeb97235 100644 | |||
| 49 | target_big_endian = 0; | 49 | target_big_endian = 0; |
| 50 | break; | 50 | break; |
| 51 | default: | 51 | default: |
| 52 | @@ -2511,6 +2517,9 @@ md_show_usage (FILE * stream ATTRIBUTE_UNUSED) | 52 | @@ -2524,6 +2530,9 @@ md_show_usage (FILE * stream ATTRIBUTE_UNUSED) |
| 53 | /* fprintf(stream, _("\ | 53 | /* fprintf(stream, _("\ |
| 54 | MicroBlaze options:\n\ | 54 | MicroBlaze options:\n\ |
| 55 | -noSmall Data in the comm and data sections do not go into the small data section\n")); */ | 55 | -noSmall Data in the comm and data sections do not go into the small data section\n")); */ |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0003-Disable-the-warning-message-for-eh_frame_hdr.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0003-Disable-the-warning-message-for-eh_frame_hdr.patch index 96ddefa0..b76020f5 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0003-Disable-the-warning-message-for-eh_frame_hdr.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0003-Disable-the-warning-message-for-eh_frame_hdr.patch | |||
| @@ -1,15 +1,18 @@ | |||
| 1 | From f74d7754befd636c6139261e6c6b23ed49aa0fa9 Mon Sep 17 00:00:00 2001 | 1 | From fc6844169e72155a008d963c3991ed084e0d0890 Mon Sep 17 00:00:00 2001 |
| 2 | From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com> | 2 | From: "Edgar E. Iglesias" <edgar.iglesias@gmail.com> |
| 3 | Date: Fri, 22 Jun 2012 01:20:20 +0200 | 3 | Date: Fri, 22 Jun 2012 01:20:20 +0200 |
| 4 | Subject: [PATCH 03/52] Disable the warning message for eh_frame_hdr | 4 | Subject: [PATCH 03/38] Disable the warning message for eh_frame_hdr |
| 5 | 5 | ||
| 6 | Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> | 6 | Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com> |
| 7 | |||
| 8 | Conflicts: | ||
| 9 | bfd/elf-eh-frame.c | ||
| 7 | --- | 10 | --- |
| 8 | bfd/elf-eh-frame.c | 3 +++ | 11 | bfd/elf-eh-frame.c | 3 +++ |
| 9 | 1 file changed, 3 insertions(+) | 12 | 1 file changed, 3 insertions(+) |
| 10 | 13 | ||
| 11 | diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c | 14 | diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c |
| 12 | index 7a129b00f8..d5e4a5c062 100644 | 15 | index 6ce6d225cff..c6b0c122459 100644 |
| 13 | --- a/bfd/elf-eh-frame.c | 16 | --- a/bfd/elf-eh-frame.c |
| 14 | +++ b/bfd/elf-eh-frame.c | 17 | +++ b/bfd/elf-eh-frame.c |
| 15 | @@ -1044,10 +1044,13 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info, | 18 | @@ -1044,10 +1044,13 @@ _bfd_elf_parse_eh_frame (bfd *abfd, struct bfd_link_info *info, |
| @@ -23,7 +26,7 @@ index 7a129b00f8..d5e4a5c062 100644 | |||
| 23 | (_("error in %pB(%pA); no .eh_frame_hdr table will be created"), | 26 | (_("error in %pB(%pA); no .eh_frame_hdr table will be created"), |
| 24 | abfd, sec); | 27 | abfd, sec); |
| 25 | +} | 28 | +} |
| 26 | hdr_info->u.dwarf.table = FALSE; | 29 | hdr_info->u.dwarf.table = false; |
| 27 | free (sec_info); | 30 | free (sec_info); |
| 28 | success: | 31 | success: |
| 29 | -- | 32 | -- |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0004-LOCAL-Fix-relaxation-of-assembler-resolved-reference.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0004-LOCAL-Fix-relaxation-of-assembler-resolved-reference.patch index a63ad020..03b84798 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0004-LOCAL-Fix-relaxation-of-assembler-resolved-reference.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0004-LOCAL-Fix-relaxation-of-assembler-resolved-reference.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 6aadc146948741df27125cc2253ba9a50efa5cfc Mon Sep 17 00:00:00 2001 | 1 | From 786c2252440ed07d05c1ab37675e5138e7b44bb8 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Tue, 8 Nov 2016 11:54:08 +0530 | 3 | Date: Tue, 8 Nov 2016 11:54:08 +0530 |
| 4 | Subject: [PATCH 04/52] [LOCAL]: Fix relaxation of assembler resolved | 4 | Subject: [PATCH 04/38] [LOCAL]: Fix relaxation of assembler resolved |
| 5 | references,Fixup debug_loc sections after linker relaxation Adds a new | 5 | references,Fixup debug_loc sections after linker relaxation Adds a new |
| 6 | reloctype R_MICROBLAZE_32_NONE, used for passing reloc info from the | 6 | reloctype R_MICROBLAZE_32_NONE, used for passing reloc info from the |
| 7 | assembler to the linker when the linker manages to fully resolve a local | 7 | assembler to the linker when the linker manages to fully resolve a local |
| @@ -17,6 +17,9 @@ Conflicts: | |||
| 17 | bfd/elf32-microblaze.c | 17 | bfd/elf32-microblaze.c |
| 18 | binutils/readelf.c | 18 | binutils/readelf.c |
| 19 | include/elf/microblaze.h | 19 | include/elf/microblaze.h |
| 20 | |||
| 21 | Conflicts: | ||
| 22 | binutils/readelf.c | ||
| 20 | --- | 23 | --- |
| 21 | bfd/bfd-in2.h | 5 ++ | 24 | bfd/bfd-in2.h | 5 ++ |
| 22 | bfd/elf32-microblaze.c | 126 ++++++++++++++++++++++++++++--------- | 25 | bfd/elf32-microblaze.c | 126 ++++++++++++++++++++++++++++--------- |
| @@ -28,10 +31,10 @@ Conflicts: | |||
| 28 | 7 files changed, 119 insertions(+), 29 deletions(-) | 31 | 7 files changed, 119 insertions(+), 29 deletions(-) |
| 29 | 32 | ||
| 30 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | 33 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h |
| 31 | index 35ef4d755b..1bd19a2b63 100644 | 34 | index 9a698316980..943bc2e914c 100644 |
| 32 | --- a/bfd/bfd-in2.h | 35 | --- a/bfd/bfd-in2.h |
| 33 | +++ b/bfd/bfd-in2.h | 36 | +++ b/bfd/bfd-in2.h |
| 34 | @@ -5428,6 +5428,11 @@ value relative to the read-write small data area anchor */ | 37 | @@ -5423,6 +5423,11 @@ value relative to the read-write small data area anchor */ |
| 35 | expressions of the form "Symbol Op Symbol" */ | 38 | expressions of the form "Symbol Op Symbol" */ |
| 36 | BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM, | 39 | BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM, |
| 37 | 40 | ||
| @@ -44,11 +47,11 @@ index 35ef4d755b..1bd19a2b63 100644 | |||
| 44 | value in two words (with an imm instruction). No relocation is | 47 | value in two words (with an imm instruction). No relocation is |
| 45 | done here - only used for relaxing */ | 48 | done here - only used for relaxing */ |
| 46 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 49 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
| 47 | index 693fc71f73..e9715eae6a 100644 | 50 | index d9c0d93a01a..2316e085d1f 100644 |
| 48 | --- a/bfd/elf32-microblaze.c | 51 | --- a/bfd/elf32-microblaze.c |
| 49 | +++ b/bfd/elf32-microblaze.c | 52 | +++ b/bfd/elf32-microblaze.c |
| 50 | @@ -177,6 +177,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | 53 | @@ -175,6 +175,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = |
| 51 | FALSE), /* PC relative offset? */ | 54 | false), /* PC relative offset? */ |
| 52 | 55 | ||
| 53 | /* This reloc does nothing. Used for relaxation. */ | 56 | /* This reloc does nothing. Used for relaxation. */ |
| 54 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ | 57 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ |
| @@ -68,7 +71,7 @@ index 693fc71f73..e9715eae6a 100644 | |||
| 68 | HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ | 71 | HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ |
| 69 | 0, /* Rightshift. */ | 72 | 0, /* Rightshift. */ |
| 70 | 3, /* Size (0 = byte, 1 = short, 2 = long). */ | 73 | 3, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 71 | @@ -562,7 +576,10 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | 74 | @@ -560,7 +574,10 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, |
| 72 | case BFD_RELOC_NONE: | 75 | case BFD_RELOC_NONE: |
| 73 | microblaze_reloc = R_MICROBLAZE_NONE; | 76 | microblaze_reloc = R_MICROBLAZE_NONE; |
| 74 | break; | 77 | break; |
| @@ -80,7 +83,7 @@ index 693fc71f73..e9715eae6a 100644 | |||
| 80 | microblaze_reloc = R_MICROBLAZE_64_NONE; | 83 | microblaze_reloc = R_MICROBLAZE_64_NONE; |
| 81 | break; | 84 | break; |
| 82 | case BFD_RELOC_32: | 85 | case BFD_RELOC_32: |
| 83 | @@ -1914,18 +1931,26 @@ microblaze_elf_relax_section (bfd *abfd, | 86 | @@ -1910,18 +1927,26 @@ microblaze_elf_relax_section (bfd *abfd, |
| 84 | } | 87 | } |
| 85 | break; | 88 | break; |
| 86 | case R_MICROBLAZE_NONE: | 89 | case R_MICROBLAZE_NONE: |
| @@ -111,7 +114,7 @@ index 693fc71f73..e9715eae6a 100644 | |||
| 111 | } | 114 | } |
| 112 | break; | 115 | break; |
| 113 | case R_MICROBLAZE_64_NONE: | 116 | case R_MICROBLAZE_64_NONE: |
| 114 | @@ -1969,30 +1994,73 @@ microblaze_elf_relax_section (bfd *abfd, | 117 | @@ -1965,30 +1990,73 @@ microblaze_elf_relax_section (bfd *abfd, |
| 115 | irelscanend = irelocs + o->reloc_count; | 118 | irelscanend = irelocs + o->reloc_count; |
| 116 | for (irelscan = irelocs; irelscan < irelscanend; irelscan++) | 119 | for (irelscan = irelocs; irelscan < irelscanend; irelscan++) |
| 117 | { | 120 | { |
| @@ -208,7 +211,7 @@ index 693fc71f73..e9715eae6a 100644 | |||
| 208 | o->rawsize)) | 211 | o->rawsize)) |
| 209 | goto error_return; | 212 | goto error_return; |
| 210 | elf_section_data (o)->this_hdr.contents = ocontents; | 213 | elf_section_data (o)->this_hdr.contents = ocontents; |
| 211 | @@ -2028,7 +2096,7 @@ microblaze_elf_relax_section (bfd *abfd, | 214 | @@ -2024,7 +2092,7 @@ microblaze_elf_relax_section (bfd *abfd, |
| 212 | elf_section_data (o)->this_hdr.contents = ocontents; | 215 | elf_section_data (o)->this_hdr.contents = ocontents; |
| 213 | } | 216 | } |
| 214 | } | 217 | } |
| @@ -218,10 +221,10 @@ index 693fc71f73..e9715eae6a 100644 | |||
| 218 | 0, | 221 | 0, |
| 219 | sec); | 222 | sec); |
| 220 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h | 223 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h |
| 221 | index b97534fc9f..c1551b9240 100644 | 224 | index c37ddc03cfd..4153b94564d 100644 |
| 222 | --- a/bfd/libbfd.h | 225 | --- a/bfd/libbfd.h |
| 223 | +++ b/bfd/libbfd.h | 226 | +++ b/bfd/libbfd.h |
| 224 | @@ -2967,6 +2967,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | 227 | @@ -2988,6 +2988,7 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", |
| 225 | "BFD_RELOC_MICROBLAZE_32_ROSDA", | 228 | "BFD_RELOC_MICROBLAZE_32_ROSDA", |
| 226 | "BFD_RELOC_MICROBLAZE_32_RWSDA", | 229 | "BFD_RELOC_MICROBLAZE_32_RWSDA", |
| 227 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", | 230 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", |
| @@ -230,10 +233,10 @@ index b97534fc9f..c1551b9240 100644 | |||
| 230 | "BFD_RELOC_MICROBLAZE_64_GOTPC", | 233 | "BFD_RELOC_MICROBLAZE_64_GOTPC", |
| 231 | "BFD_RELOC_MICROBLAZE_64_GOT", | 234 | "BFD_RELOC_MICROBLAZE_64_GOT", |
| 232 | diff --git a/bfd/reloc.c b/bfd/reloc.c | 235 | diff --git a/bfd/reloc.c b/bfd/reloc.c |
| 233 | index 9aba84ca81..9b39b41941 100644 | 236 | index 6d920e1df06..3a08f7a8a42 100644 |
| 234 | --- a/bfd/reloc.c | 237 | --- a/bfd/reloc.c |
| 235 | +++ b/bfd/reloc.c | 238 | +++ b/bfd/reloc.c |
| 236 | @@ -6858,6 +6858,12 @@ ENUM | 239 | @@ -6896,6 +6896,12 @@ ENUM |
| 237 | ENUMDOC | 240 | ENUMDOC |
| 238 | This is a 32 bit reloc for the microblaze to handle | 241 | This is a 32 bit reloc for the microblaze to handle |
| 239 | expressions of the form "Symbol Op Symbol" | 242 | expressions of the form "Symbol Op Symbol" |
| @@ -247,13 +250,13 @@ index 9aba84ca81..9b39b41941 100644 | |||
| 247 | BFD_RELOC_MICROBLAZE_64_NONE | 250 | BFD_RELOC_MICROBLAZE_64_NONE |
| 248 | ENUMDOC | 251 | ENUMDOC |
| 249 | diff --git a/binutils/readelf.c b/binutils/readelf.c | 252 | diff --git a/binutils/readelf.c b/binutils/readelf.c |
| 250 | index 6057515a89..2b797ef2db 100644 | 253 | index a6073f7ec80..5b25fb9a52a 100644 |
| 251 | --- a/binutils/readelf.c | 254 | --- a/binutils/readelf.c |
| 252 | +++ b/binutils/readelf.c | 255 | +++ b/binutils/readelf.c |
| 253 | @@ -13187,6 +13187,10 @@ is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type) | 256 | @@ -14057,6 +14057,10 @@ is_8bit_abs_reloc (Filedata * filedata, unsigned int reloc_type) |
| 254 | return reloc_type == 1; /* R_Z80_8. */ | 257 | return reloc_type == 1; /* R_Z80_8. */ |
| 255 | default: | 258 | default: |
| 256 | return FALSE; | 259 | return false; |
| 257 | + case EM_MICROBLAZE: | 260 | + case EM_MICROBLAZE: |
| 258 | + return reloc_type == 33 /* R_MICROBLAZE_32_NONE. */ | 261 | + return reloc_type == 33 /* R_MICROBLAZE_32_NONE. */ |
| 259 | + || reloc_type == 0 /* R_MICROBLAZE_NONE. */ | 262 | + || reloc_type == 0 /* R_MICROBLAZE_NONE. */ |
| @@ -262,10 +265,10 @@ index 6057515a89..2b797ef2db 100644 | |||
| 262 | } | 265 | } |
| 263 | 266 | ||
| 264 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 267 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 265 | index 34eeb97235..74a63abeb0 100644 | 268 | index d6fc400cef9..87efc2b7a46 100644 |
| 266 | --- a/gas/config/tc-microblaze.c | 269 | --- a/gas/config/tc-microblaze.c |
| 267 | +++ b/gas/config/tc-microblaze.c | 270 | +++ b/gas/config/tc-microblaze.c |
| 268 | @@ -2198,9 +2198,12 @@ md_apply_fix (fixS * fixP, | 271 | @@ -2211,9 +2211,12 @@ md_apply_fix (fixS * fixP, |
| 269 | moves code around due to relaxing. */ | 272 | moves code around due to relaxing. */ |
| 270 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) | 273 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) |
| 271 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | 274 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; |
| @@ -278,7 +281,7 @@ index 34eeb97235..74a63abeb0 100644 | |||
| 278 | } | 281 | } |
| 279 | return; | 282 | return; |
| 280 | } | 283 | } |
| 281 | @@ -2421,6 +2424,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | 284 | @@ -2434,6 +2437,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) |
| 282 | switch (fixp->fx_r_type) | 285 | switch (fixp->fx_r_type) |
| 283 | { | 286 | { |
| 284 | case BFD_RELOC_NONE: | 287 | case BFD_RELOC_NONE: |
| @@ -287,7 +290,7 @@ index 34eeb97235..74a63abeb0 100644 | |||
| 287 | case BFD_RELOC_32: | 290 | case BFD_RELOC_32: |
| 288 | case BFD_RELOC_MICROBLAZE_32_LO: | 291 | case BFD_RELOC_MICROBLAZE_32_LO: |
| 289 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h | 292 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h |
| 290 | index 2fec296967..3978a3dc01 100644 | 293 | index 66b4fda8f54..936ef484289 100644 |
| 291 | --- a/include/elf/microblaze.h | 294 | --- a/include/elf/microblaze.h |
| 292 | +++ b/include/elf/microblaze.h | 295 | +++ b/include/elf/microblaze.h |
| 293 | @@ -61,6 +61,8 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) | 296 | @@ -61,6 +61,8 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0005-upstream-change-to-garbage-collection-sweep-causes-m.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0005-upstream-change-to-garbage-collection-sweep-causes-m.patch index 95e4a363..f2419c4c 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0005-upstream-change-to-garbage-collection-sweep-causes-m.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0005-upstream-change-to-garbage-collection-sweep-causes-m.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 4fc5075cebc9c76053b5ff683ab75c9e8b46ca1a Mon Sep 17 00:00:00 2001 | 1 | From 48e989bf1ff9ce0250256afc95d40d75fa098e21 Mon Sep 17 00:00:00 2001 |
| 2 | From: David Holsgrove <david.holsgrove@xilinx.com> | 2 | From: David Holsgrove <david.holsgrove@xilinx.com> |
| 3 | Date: Wed, 27 Feb 2013 13:56:11 +1000 | 3 | Date: Wed, 27 Feb 2013 13:56:11 +1000 |
| 4 | Subject: [PATCH 05/52] upstream change to garbage collection sweep causes mb | 4 | Subject: [PATCH 05/38] upstream change to garbage collection sweep causes mb |
| 5 | regression | 5 | regression |
| 6 | 6 | ||
| 7 | Upstream change for PR13177 now clears the def_regular during gc_sweep of a | 7 | Upstream change for PR13177 now clears the def_regular during gc_sweep of a |
| @@ -18,18 +18,21 @@ This does not occur if static linking libstdc++.a, so its during the | |||
| 18 | relocations for a shared lib with garbage collection this occurs | 18 | relocations for a shared lib with garbage collection this occurs |
| 19 | 19 | ||
| 20 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | 20 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> |
| 21 | |||
| 22 | Conflicts: | ||
| 23 | bfd/elflink.c | ||
| 21 | --- | 24 | --- |
| 22 | bfd/elflink.c | 1 - | 25 | bfd/elflink.c | 1 - |
| 23 | 1 file changed, 1 deletion(-) | 26 | 1 file changed, 1 deletion(-) |
| 24 | 27 | ||
| 25 | diff --git a/bfd/elflink.c b/bfd/elflink.c | 28 | diff --git a/bfd/elflink.c b/bfd/elflink.c |
| 26 | index 998b72f228..2daf8fdf6a 100644 | 29 | index 9a05208253c..bdfbcecef92 100644 |
| 27 | --- a/bfd/elflink.c | 30 | --- a/bfd/elflink.c |
| 28 | +++ b/bfd/elflink.c | 31 | +++ b/bfd/elflink.c |
| 29 | @@ -6372,7 +6372,6 @@ elf_gc_sweep_symbol (struct elf_link_hash_entry *h, void *data) | 32 | @@ -6432,7 +6432,6 @@ elf_gc_sweep_symbol (struct elf_link_hash_entry *h, void *data) |
| 30 | 33 | ||
| 31 | inf = (struct elf_gc_sweep_symbol_info *) data; | 34 | inf = (struct elf_gc_sweep_symbol_info *) data; |
| 32 | (*inf->hide_symbol) (inf->info, h, TRUE); | 35 | (*inf->hide_symbol) (inf->info, h, true); |
| 33 | - h->def_regular = 0; | 36 | - h->def_regular = 0; |
| 34 | h->ref_regular = 0; | 37 | h->ref_regular = 0; |
| 35 | h->ref_regular_nonweak = 0; | 38 | h->ref_regular_nonweak = 0; |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0006-Fix-bug-in-TLSTPREL-Relocation.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0006-Fix-bug-in-TLSTPREL-Relocation.patch index fcbd662e..5221bb33 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0006-Fix-bug-in-TLSTPREL-Relocation.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0006-Fix-bug-in-TLSTPREL-Relocation.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 4e8bd012d3025a6f6b2b2794930f1bfbad7932e8 Mon Sep 17 00:00:00 2001 | 1 | From a150edd000f83578755a749bb8c44553e0dbc1f0 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Mon, 15 Jun 2015 16:50:30 +0530 | 3 | Date: Mon, 15 Jun 2015 16:50:30 +0530 |
| 4 | Subject: [PATCH 06/52] Fix bug in TLSTPREL Relocation | 4 | Subject: [PATCH 06/38] Fix bug in TLSTPREL Relocation |
| 5 | 5 | ||
| 6 | Fixed the problem related to the fixup/relocations TLSTPREL. | 6 | Fixed the problem related to the fixup/relocations TLSTPREL. |
| 7 | When the fixup is applied the addend is not added at the correct offset | 7 | When the fixup is applied the addend is not added at the correct offset |
| @@ -13,10 +13,10 @@ big & little-endian compilers | |||
| 13 | 1 file changed, 2 insertions(+), 2 deletions(-) | 13 | 1 file changed, 2 insertions(+), 2 deletions(-) |
| 14 | 14 | ||
| 15 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 15 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
| 16 | index e9715eae6a..9c4f809eaa 100644 | 16 | index 2316e085d1f..e0729c6a194 100644 |
| 17 | --- a/bfd/elf32-microblaze.c | 17 | --- a/bfd/elf32-microblaze.c |
| 18 | +++ b/bfd/elf32-microblaze.c | 18 | +++ b/bfd/elf32-microblaze.c |
| 19 | @@ -1447,9 +1447,9 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 19 | @@ -1443,9 +1443,9 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 20 | relocation += addend; | 20 | relocation += addend; |
| 21 | relocation -= dtprel_base(info); | 21 | relocation -= dtprel_base(info); |
| 22 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 22 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0007-Added-Address-extension-instructions.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0007-Added-Address-extension-instructions.patch index fd15e23c..2f1d83d7 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0007-Added-Address-extension-instructions.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0007-Added-Address-extension-instructions.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 1d1344e5786d435f4f492739d0c477befa4c6906 Mon Sep 17 00:00:00 2001 | 1 | From fc3bbcce05e1726bf98948cebfef841b84df73cb Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Mon, 18 Jan 2016 12:28:21 +0530 | 3 | Date: Mon, 18 Jan 2016 12:28:21 +0530 |
| 4 | Subject: [PATCH 07/52] Added Address extension instructions | 4 | Subject: [PATCH 07/38] Added Address extension instructions |
| 5 | 5 | ||
| 6 | This patch adds the support of new instructions which are required | 6 | This patch adds the support of new instructions which are required |
| 7 | for supporting Address extension feature. | 7 | for supporting Address extension feature. |
| @@ -24,10 +24,10 @@ Conflicts: | |||
| 24 | 2 files changed, 16 insertions(+), 5 deletions(-) | 24 | 2 files changed, 16 insertions(+), 5 deletions(-) |
| 25 | 25 | ||
| 26 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 26 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 27 | index b6c5016e4d..1f1ade40b2 100644 | 27 | index 746566fdb87..5d165dcdf91 100644 |
| 28 | --- a/opcodes/microblaze-opc.h | 28 | --- a/opcodes/microblaze-opc.h |
| 29 | +++ b/opcodes/microblaze-opc.h | 29 | +++ b/opcodes/microblaze-opc.h |
| 30 | @@ -178,8 +178,11 @@ struct op_code_struct | 30 | @@ -178,8 +178,11 @@ const struct op_code_struct |
| 31 | {"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 }, | 31 | {"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 }, |
| 32 | {"wdc.flush", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000074, OPCODE_MASK_H34B, wdcflush, special_inst }, | 32 | {"wdc.flush", INST_TYPE_R1_R2_SPECIAL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x90000074, OPCODE_MASK_H34B, wdcflush, special_inst }, |
| 33 | {"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 }, | 33 | {"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 }, |
| @@ -39,7 +39,7 @@ index b6c5016e4d..1f1ade40b2 100644 | |||
| 39 | {"br", INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst }, | 39 | {"br", INST_TYPE_R2, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98000000, OPCODE_MASK_H124, br, branch_inst }, |
| 40 | {"brd", INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst }, | 40 | {"brd", INST_TYPE_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98100000, OPCODE_MASK_H124, brd, branch_inst }, |
| 41 | {"brld", INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst }, | 41 | {"brld", INST_TYPE_RD_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x98140000, OPCODE_MASK_H24, brld, branch_inst }, |
| 42 | @@ -229,18 +232,24 @@ struct op_code_struct | 42 | @@ -229,18 +232,24 @@ const struct op_code_struct |
| 43 | {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst }, | 43 | {"bgeid", INST_TYPE_R1_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBEA00000, OPCODE_MASK_H1, bgeid, branch_inst }, |
| 44 | {"lbu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst }, | 44 | {"lbu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000000, OPCODE_MASK_H4, lbu, memory_load_inst }, |
| 45 | {"lbur", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000200, OPCODE_MASK_H4, lbur, memory_load_inst }, | 45 | {"lbur", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC0000200, OPCODE_MASK_H4, lbur, memory_load_inst }, |
| @@ -64,7 +64,7 @@ index b6c5016e4d..1f1ade40b2 100644 | |||
| 64 | {"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst }, | 64 | {"lbui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE0000000, OPCODE_MASK_H, lbui, memory_load_inst }, |
| 65 | {"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst }, | 65 | {"lhui", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE4000000, OPCODE_MASK_H, lhui, memory_load_inst }, |
| 66 | {"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst }, | 66 | {"lwi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, lwi, memory_load_inst }, |
| 67 | @@ -405,6 +414,8 @@ struct op_code_struct | 67 | @@ -405,6 +414,8 @@ const struct op_code_struct |
| 68 | {"clz", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900000E0, OPCODE_MASK_H34, clz, special_inst }, | 68 | {"clz", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900000E0, OPCODE_MASK_H34, clz, special_inst }, |
| 69 | {"mbar", INST_TYPE_IMM5, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8020004, OPCODE_MASK_HN, mbar, special_inst }, | 69 | {"mbar", INST_TYPE_IMM5, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8020004, OPCODE_MASK_HN, mbar, special_inst }, |
| 70 | {"sleep", INST_TYPE_NONE, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBA020004, OPCODE_MASK_HN, invalid_inst, special_inst }, /* translates to mbar 16. */ | 70 | {"sleep", INST_TYPE_NONE, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBA020004, OPCODE_MASK_HN, invalid_inst, special_inst }, /* translates to mbar 16. */ |
| @@ -74,7 +74,7 @@ index b6c5016e4d..1f1ade40b2 100644 | |||
| 74 | {"swaph", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900001E2, OPCODE_MASK_H4, swaph, arithmetic_inst }, | 74 | {"swaph", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900001E2, OPCODE_MASK_H4, swaph, arithmetic_inst }, |
| 75 | {"", 0, 0, 0, 0, 0, 0, 0, 0}, | 75 | {"", 0, 0, 0, 0, 0, 0, 0, 0}, |
| 76 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | 76 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h |
| 77 | index 795c57b5ff..b05e319862 100644 | 77 | index 10d7e883366..250fd6a250a 100644 |
| 78 | --- a/opcodes/microblaze-opcm.h | 78 | --- a/opcodes/microblaze-opcm.h |
| 79 | +++ b/opcodes/microblaze-opcm.h | 79 | +++ b/opcodes/microblaze-opcm.h |
| 80 | @@ -33,13 +33,13 @@ enum microblaze_instr | 80 | @@ -33,13 +33,13 @@ enum microblaze_instr |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0008-fixing-the-MAX_OPCODES-to-correct-value.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0008-fixing-the-MAX_OPCODES-to-correct-value.patch index 8564003c..4c3caa51 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0008-fixing-the-MAX_OPCODES-to-correct-value.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0008-fixing-the-MAX_OPCODES-to-correct-value.patch | |||
| @@ -1,14 +1,14 @@ | |||
| 1 | From b2e494ee992ef0509bd2a4512f62841098631219 Mon Sep 17 00:00:00 2001 | 1 | From bb27e620e2911e472eee6c1ee4fb2a1e722b65aa Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Thu, 28 Jan 2016 14:07:34 +0530 | 3 | Date: Thu, 28 Jan 2016 14:07:34 +0530 |
| 4 | Subject: [PATCH 08/52] fixing the MAX_OPCODES to correct value | 4 | Subject: [PATCH 08/38] fixing the MAX_OPCODES to correct value |
| 5 | 5 | ||
| 6 | --- | 6 | --- |
| 7 | opcodes/microblaze-opc.h | 2 +- | 7 | opcodes/microblaze-opc.h | 2 +- |
| 8 | 1 file changed, 1 insertion(+), 1 deletion(-) | 8 | 1 file changed, 1 insertion(+), 1 deletion(-) |
| 9 | 9 | ||
| 10 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 10 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 11 | index 1f1ade40b2..c7a506b845 100644 | 11 | index 5d165dcdf91..bf53e492b9a 100644 |
| 12 | --- a/opcodes/microblaze-opc.h | 12 | --- a/opcodes/microblaze-opc.h |
| 13 | +++ b/opcodes/microblaze-opc.h | 13 | +++ b/opcodes/microblaze-opc.h |
| 14 | @@ -102,7 +102,7 @@ | 14 | @@ -102,7 +102,7 @@ |
| @@ -18,7 +18,7 @@ index 1f1ade40b2..c7a506b845 100644 | |||
| 18 | -#define MAX_OPCODES 291 | 18 | -#define MAX_OPCODES 291 |
| 19 | +#define MAX_OPCODES 299 | 19 | +#define MAX_OPCODES 299 |
| 20 | 20 | ||
| 21 | struct op_code_struct | 21 | const struct op_code_struct |
| 22 | { | 22 | { |
| 23 | -- | 23 | -- |
| 24 | 2.17.1 | 24 | 2.17.1 |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0009-Add-new-bit-field-instructions.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0009-Add-new-bit-field-instructions.patch index 0188629d..16e086fb 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0009-Add-new-bit-field-instructions.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0009-Add-new-bit-field-instructions.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From cea8d524fca305c2878374433d9745b938e4c78f Mon Sep 17 00:00:00 2001 | 1 | From c5c42765e7436fa20cc2069fa0426995cf940e5a Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Mon, 18 Jul 2016 12:24:28 +0530 | 3 | Date: Mon, 18 Jul 2016 12:24:28 +0530 |
| 4 | Subject: [PATCH 09/52] Add new bit-field instructions | 4 | Subject: [PATCH 09/38] Add new bit-field instructions |
| 5 | 5 | ||
| 6 | This patches adds new bsefi and bsifi instructions. | 6 | This patches adds new bsefi and bsifi instructions. |
| 7 | BSEFI- The instruction shall extract a bit field from a | 7 | BSEFI- The instruction shall extract a bit field from a |
| @@ -23,7 +23,7 @@ Conflicts: | |||
| 23 | 4 files changed, 104 insertions(+), 5 deletions(-) | 23 | 4 files changed, 104 insertions(+), 5 deletions(-) |
| 24 | 24 | ||
| 25 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 25 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 26 | index 74a63abeb0..765abfb388 100644 | 26 | index 87efc2b7a46..aa58a18f05c 100644 |
| 27 | --- a/gas/config/tc-microblaze.c | 27 | --- a/gas/config/tc-microblaze.c |
| 28 | +++ b/gas/config/tc-microblaze.c | 28 | +++ b/gas/config/tc-microblaze.c |
| 29 | @@ -917,7 +917,7 @@ md_assemble (char * str) | 29 | @@ -917,7 +917,7 @@ md_assemble (char * str) |
| @@ -35,7 +35,7 @@ index 74a63abeb0..765abfb388 100644 | |||
| 35 | expressionS exp; | 35 | expressionS exp; |
| 36 | char name[20]; | 36 | char name[20]; |
| 37 | 37 | ||
| 38 | @@ -1172,7 +1172,76 @@ md_assemble (char * str) | 38 | @@ -1178,7 +1178,76 @@ md_assemble (char * str) |
| 39 | inst |= (reg2 << RA_LOW) & RA_MASK; | 39 | inst |= (reg2 << RA_LOW) & RA_MASK; |
| 40 | inst |= (immed << IMM_LOW) & IMM5_MASK; | 40 | inst |= (immed << IMM_LOW) & IMM5_MASK; |
| 41 | break; | 41 | break; |
| @@ -113,7 +113,7 @@ index 74a63abeb0..765abfb388 100644 | |||
| 113 | if (strcmp (op_end, "")) | 113 | if (strcmp (op_end, "")) |
| 114 | op_end = parse_reg (op_end + 1, ®1); /* Get r1. */ | 114 | op_end = parse_reg (op_end + 1, ®1); /* Get r1. */ |
| 115 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | 115 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c |
| 116 | index be1534c257..315c6e9350 100644 | 116 | index 1696f559a0b..1fe8da2e51b 100644 |
| 117 | --- a/opcodes/microblaze-dis.c | 117 | --- a/opcodes/microblaze-dis.c |
| 118 | +++ b/opcodes/microblaze-dis.c | 118 | +++ b/opcodes/microblaze-dis.c |
| 119 | @@ -91,7 +91,19 @@ get_field_imm5_mbar (struct string_buf *buf, long instr) | 119 | @@ -91,7 +91,19 @@ get_field_imm5_mbar (struct string_buf *buf, long instr) |
| @@ -151,7 +151,7 @@ index be1534c257..315c6e9350 100644 | |||
| 151 | print_func (stream, "\t%s", get_field_rd (&buf, inst)); | 151 | print_func (stream, "\t%s", get_field_rd (&buf, inst)); |
| 152 | break; | 152 | break; |
| 153 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 153 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 154 | index c7a506b845..f61f4ef66d 100644 | 154 | index bf53e492b9a..6fcded04b49 100644 |
| 155 | --- a/opcodes/microblaze-opc.h | 155 | --- a/opcodes/microblaze-opc.h |
| 156 | +++ b/opcodes/microblaze-opc.h | 156 | +++ b/opcodes/microblaze-opc.h |
| 157 | @@ -59,6 +59,9 @@ | 157 | @@ -59,6 +59,9 @@ |
| @@ -181,9 +181,9 @@ index c7a506b845..f61f4ef66d 100644 | |||
| 181 | -#define MAX_OPCODES 299 | 181 | -#define MAX_OPCODES 299 |
| 182 | +#define MAX_OPCODES 301 | 182 | +#define MAX_OPCODES 301 |
| 183 | 183 | ||
| 184 | struct op_code_struct | 184 | const struct op_code_struct |
| 185 | { | 185 | { |
| 186 | @@ -159,6 +164,8 @@ struct op_code_struct | 186 | @@ -159,6 +164,8 @@ const struct op_code_struct |
| 187 | {"bslli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000400, OPCODE_MASK_H3, bslli, barrel_shift_inst }, | 187 | {"bslli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000400, OPCODE_MASK_H3, bslli, barrel_shift_inst }, |
| 188 | {"bsrai", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000200, OPCODE_MASK_H3, bsrai, barrel_shift_inst }, | 188 | {"bsrai", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000200, OPCODE_MASK_H3, bsrai, barrel_shift_inst }, |
| 189 | {"bsrli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000000, OPCODE_MASK_H3, bsrli, barrel_shift_inst }, | 189 | {"bsrli", INST_TYPE_RD_R1_IMM5, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x64000000, OPCODE_MASK_H3, bsrli, barrel_shift_inst }, |
| @@ -202,7 +202,7 @@ index c7a506b845..f61f4ef66d 100644 | |||
| 202 | #endif /* MICROBLAZE_OPC */ | 202 | #endif /* MICROBLAZE_OPC */ |
| 203 | 203 | ||
| 204 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | 204 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h |
| 205 | index b05e319862..fa921c90c9 100644 | 205 | index 250fd6a250a..78a2ac44960 100644 |
| 206 | --- a/opcodes/microblaze-opcm.h | 206 | --- a/opcodes/microblaze-opcm.h |
| 207 | +++ b/opcodes/microblaze-opcm.h | 207 | +++ b/opcodes/microblaze-opcm.h |
| 208 | @@ -29,7 +29,7 @@ enum microblaze_instr | 208 | @@ -29,7 +29,7 @@ enum microblaze_instr |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0010-fixing-the-imm-bug.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0010-fixing-the-imm-bug.patch index 892205cd..1c939a84 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0010-fixing-the-imm-bug.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0010-fixing-the-imm-bug.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From d6ccef90be40de63ee6da4943a601edaf7b1a136 Mon Sep 17 00:00:00 2001 | 1 | From ca1e831754eba0e38c1b7ceefd6a3d25c7d36e59 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Mon, 10 Jul 2017 16:07:28 +0530 | 3 | Date: Mon, 10 Jul 2017 16:07:28 +0530 |
| 4 | Subject: [PATCH 10/52] fixing the imm bug. with relax option imm -1 is also | 4 | Subject: [PATCH 10/38] fixing the imm bug. with relax option imm -1 is also |
| 5 | getting removed this is corrected now. | 5 | getting removed this is corrected now. |
| 6 | 6 | ||
| 7 | --- | 7 | --- |
| @@ -9,10 +9,10 @@ Subject: [PATCH 10/52] fixing the imm bug. with relax option imm -1 is also | |||
| 9 | 1 file changed, 1 insertion(+), 2 deletions(-) | 9 | 1 file changed, 1 insertion(+), 2 deletions(-) |
| 10 | 10 | ||
| 11 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 11 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
| 12 | index 9c4f809eaa..c22130fd8c 100644 | 12 | index e0729c6a194..e378542b902 100644 |
| 13 | --- a/bfd/elf32-microblaze.c | 13 | --- a/bfd/elf32-microblaze.c |
| 14 | +++ b/bfd/elf32-microblaze.c | 14 | +++ b/bfd/elf32-microblaze.c |
| 15 | @@ -1865,8 +1865,7 @@ microblaze_elf_relax_section (bfd *abfd, | 15 | @@ -1861,8 +1861,7 @@ microblaze_elf_relax_section (bfd *abfd, |
| 16 | else | 16 | else |
| 17 | symval += irel->r_addend; | 17 | symval += irel->r_addend; |
| 18 | 18 | ||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0011-Patch-Microblaze-fixed-bug-in-GCC-so-that-It-will-su.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0011-Patch-Microblaze-fixed-bug-in-GCC-so-that-It-will-su.patch index db23fe14..3118ea8c 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0011-Patch-Microblaze-fixed-bug-in-GCC-so-that-It-will-su.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0011-Patch-Microblaze-fixed-bug-in-GCC-so-that-It-will-su.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 3bb637b058c5f2622950e6984695e36f9cac067a Mon Sep 17 00:00:00 2001 | 1 | From b844e6bdbb6aa0dd63055e8c763f68f83ab15318 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Fri, 29 Sep 2017 18:00:23 +0530 | 3 | Date: Fri, 29 Sep 2017 18:00:23 +0530 |
| 4 | Subject: [PATCH 11/52] [Patch,Microblaze]: fixed bug in GCC so that It will | 4 | Subject: [PATCH 11/38] [Patch,Microblaze]: fixed bug in GCC so that It will |
| 5 | support .long 0U and .long 0u | 5 | support .long 0U and .long 0u |
| 6 | 6 | ||
| 7 | --- | 7 | --- |
| @@ -9,10 +9,10 @@ Subject: [PATCH 11/52] [Patch,Microblaze]: fixed bug in GCC so that It will | |||
| 9 | 1 file changed, 9 insertions(+) | 9 | 1 file changed, 9 insertions(+) |
| 10 | 10 | ||
| 11 | diff --git a/gas/expr.c b/gas/expr.c | 11 | diff --git a/gas/expr.c b/gas/expr.c |
| 12 | index 6f8ccb8230..0e34ca53d9 100644 | 12 | index 03caa91f4d1..469a52cfd56 100644 |
| 13 | --- a/gas/expr.c | 13 | --- a/gas/expr.c |
| 14 | +++ b/gas/expr.c | 14 | +++ b/gas/expr.c |
| 15 | @@ -803,6 +803,15 @@ operand (expressionS *expressionP, enum expr_mode mode) | 15 | @@ -832,6 +832,15 @@ operand (expressionS *expressionP, enum expr_mode mode) |
| 16 | break; | 16 | break; |
| 17 | } | 17 | } |
| 18 | } | 18 | } |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0012-fixing-the-constant-range-check-issue.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0012-fixing-the-constant-range-check-issue.patch index 4145b0da..45953906 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0012-fixing-the-constant-range-check-issue.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0012-fixing-the-constant-range-check-issue.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From e1cb5c37efd76b44a878574ee3baad4c7a882e3b Mon Sep 17 00:00:00 2001 | 1 | From 5d4d7383a152bfc87ac7fdf5fcaef7eaca500836 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Mon, 16 Oct 2017 15:44:23 +0530 | 3 | Date: Mon, 16 Oct 2017 15:44:23 +0530 |
| 4 | Subject: [PATCH 12/52] fixing the constant range check issue sample error: not | 4 | Subject: [PATCH 12/38] fixing the constant range check issue sample error: not |
| 5 | in range ffffffff80000000..7fffffff, not ffffffff70000000 | 5 | in range ffffffff80000000..7fffffff, not ffffffff70000000 |
| 6 | 6 | ||
| 7 | --- | 7 | --- |
| @@ -9,7 +9,7 @@ Subject: [PATCH 12/52] fixing the constant range check issue sample error: not | |||
| 9 | 1 file changed, 1 insertion(+), 1 deletion(-) | 9 | 1 file changed, 1 insertion(+), 1 deletion(-) |
| 10 | 10 | ||
| 11 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 11 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 12 | index 765abfb388..5810a74a5f 100644 | 12 | index aa58a18f05c..98d0c259246 100644 |
| 13 | --- a/gas/config/tc-microblaze.c | 13 | --- a/gas/config/tc-microblaze.c |
| 14 | +++ b/gas/config/tc-microblaze.c | 14 | +++ b/gas/config/tc-microblaze.c |
| 15 | @@ -757,7 +757,7 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) | 15 | @@ -757,7 +757,7 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0013-Patch-Microblaze-Compiler-will-give-error-messages-i.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0013-Patch-Microblaze-Compiler-will-give-error-messages-i.patch index a74f2b9e..22404408 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0013-Patch-Microblaze-Compiler-will-give-error-messages-i.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0013-Patch-Microblaze-Compiler-will-give-error-messages-i.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 1a3f130008b4ebcd9a6e45cdac7188bde88f2f28 Mon Sep 17 00:00:00 2001 | 1 | From 094a9534b55a51982857859553c582492bf91815 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Wed, 21 Feb 2018 12:32:02 +0530 | 3 | Date: Wed, 21 Feb 2018 12:32:02 +0530 |
| 4 | Subject: [PATCH 13/52] [Patch,Microblaze]: Compiler will give error messages | 4 | Subject: [PATCH 13/38] [Patch,Microblaze]: Compiler will give error messages |
| 5 | in more detail for mxl-gp-opt flag.. | 5 | in more detail for mxl-gp-opt flag.. |
| 6 | 6 | ||
| 7 | --- | 7 | --- |
| @@ -9,10 +9,10 @@ Subject: [PATCH 13/52] [Patch,Microblaze]: Compiler will give error messages | |||
| 9 | 1 file changed, 12 insertions(+) | 9 | 1 file changed, 12 insertions(+) |
| 10 | 10 | ||
| 11 | diff --git a/ld/ldmain.c b/ld/ldmain.c | 11 | diff --git a/ld/ldmain.c b/ld/ldmain.c |
| 12 | index 08be9030cb..613d748fef 100644 | 12 | index 42660eb9a3c..7849f060aad 100644 |
| 13 | --- a/ld/ldmain.c | 13 | --- a/ld/ldmain.c |
| 14 | +++ b/ld/ldmain.c | 14 | +++ b/ld/ldmain.c |
| 15 | @@ -1515,6 +1515,18 @@ reloc_overflow (struct bfd_link_info *info, | 15 | @@ -1562,6 +1562,18 @@ reloc_overflow (struct bfd_link_info *info, |
| 16 | break; | 16 | break; |
| 17 | case bfd_link_hash_defined: | 17 | case bfd_link_hash_defined: |
| 18 | case bfd_link_hash_defweak: | 18 | case bfd_link_hash_defweak: |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0014-intial-commit-of-MB-64-bit.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0014-Patch-MicroBlaze-initial-support-for-MicroBlaze-64-b.patch index f0037e1f..0ba67003 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0014-intial-commit-of-MB-64-bit.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0014-Patch-MicroBlaze-initial-support-for-MicroBlaze-64-b.patch | |||
| @@ -1,27 +1,26 @@ | |||
| 1 | From d25d934f076297615cb0287488449fb32b9c46e8 Mon Sep 17 00:00:00 2001 | 1 | From b53570b1b4eb3e57b21e44515c202dc710b438ce Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Sun, 30 Sep 2018 16:28:28 +0530 | 3 | Date: Mon, 1 Nov 2021 19:06:53 +0530 |
| 4 | Subject: [PATCH 14/52] intial commit of MB 64-bit | 4 | Subject: [PATCH 14/38] [Patch,MicroBlaze] : initial support for MicroBlaze 64 |
| 5 | bit [-m64] | ||
| 5 | 6 | ||
| 6 | Conflicts: | ||
| 7 | bfd/configure | ||
| 8 | bfd/configure.ac | ||
| 9 | bfd/cpu-microblaze.c | ||
| 10 | ld/Makefile.am | ||
| 11 | ld/Makefile.in | ||
| 12 | opcodes/microblaze-dis.c | ||
| 13 | --- | 7 | --- |
| 14 | bfd/Makefile.am | 2 + | 8 | bfd/Makefile.am | 2 + |
| 15 | bfd/Makefile.in | 3 + | 9 | bfd/Makefile.in | 3 + |
| 10 | bfd/bfd-in2.h | 10 + | ||
| 16 | bfd/config.bfd | 4 + | 11 | bfd/config.bfd | 4 + |
| 17 | bfd/configure | 2 + | 12 | bfd/configure | 2 + |
| 18 | bfd/configure.ac | 2 + | 13 | bfd/configure.ac | 2 + |
| 19 | bfd/cpu-microblaze.c | 53 +- | 14 | bfd/cpu-microblaze.c | 53 +- |
| 20 | bfd/elf64-microblaze.c | 3610 ++++++++++++++++++++++++++++ | 15 | bfd/elf32-microblaze.c | 65 +- |
| 16 | bfd/elf64-microblaze.c | 3577 ++++++++++++++++++++++++++++ | ||
| 17 | bfd/libbfd.h | 2 + | ||
| 18 | bfd/reloc.c | 12 + | ||
| 21 | bfd/targets.c | 6 + | 19 | bfd/targets.c | 6 + |
| 22 | gas/config/tc-microblaze.c | 274 ++- | 20 | gas/config/tc-microblaze.c | 419 +++- |
| 23 | gas/config/tc-microblaze.h | 4 +- | 21 | gas/config/tc-microblaze.h | 4 +- |
| 24 | include/elf/common.h | 1 + | 22 | include/elf/common.h | 1 + |
| 23 | include/elf/microblaze.h | 2 + | ||
| 25 | ld/Makefile.am | 4 + | 24 | ld/Makefile.am | 4 + |
| 26 | ld/Makefile.in | 6 + | 25 | ld/Makefile.in | 6 + |
| 27 | ld/configure.tgt | 3 + | 26 | ld/configure.tgt | 3 + |
| @@ -29,17 +28,17 @@ Conflicts: | |||
| 29 | ld/emulparams/elf64microblazeel.sh | 23 + | 28 | ld/emulparams/elf64microblazeel.sh | 23 + |
| 30 | opcodes/microblaze-dis.c | 35 +- | 29 | opcodes/microblaze-dis.c | 35 +- |
| 31 | opcodes/microblaze-opc.h | 162 +- | 30 | opcodes/microblaze-opc.h | 162 +- |
| 32 | opcodes/microblaze-opcm.h | 20 +- | 31 | opcodes/microblaze-opcm.h | 24 +- |
| 33 | 19 files changed, 4197 insertions(+), 40 deletions(-) | 32 | 24 files changed, 4375 insertions(+), 69 deletions(-) |
| 34 | create mode 100644 bfd/elf64-microblaze.c | 33 | create mode 100644 bfd/elf64-microblaze.c |
| 35 | create mode 100644 ld/emulparams/elf64microblaze.sh | 34 | create mode 100644 ld/emulparams/elf64microblaze.sh |
| 36 | create mode 100644 ld/emulparams/elf64microblazeel.sh | 35 | create mode 100644 ld/emulparams/elf64microblazeel.sh |
| 37 | 36 | ||
| 38 | diff --git a/bfd/Makefile.am b/bfd/Makefile.am | 37 | diff --git a/bfd/Makefile.am b/bfd/Makefile.am |
| 39 | index c88c448000..d86f1c5697 100644 | 38 | index ed2f701805d..0dc77afa8ad 100644 |
| 40 | --- a/bfd/Makefile.am | 39 | --- a/bfd/Makefile.am |
| 41 | +++ b/bfd/Makefile.am | 40 | +++ b/bfd/Makefile.am |
| 42 | @@ -562,6 +562,7 @@ BFD64_BACKENDS = \ | 41 | @@ -558,6 +558,7 @@ BFD64_BACKENDS = \ |
| 43 | elf64-riscv.lo \ | 42 | elf64-riscv.lo \ |
| 44 | elfxx-riscv.lo \ | 43 | elfxx-riscv.lo \ |
| 45 | elf64-s390.lo \ | 44 | elf64-s390.lo \ |
| @@ -47,7 +46,7 @@ index c88c448000..d86f1c5697 100644 | |||
| 47 | elf64-sparc.lo \ | 46 | elf64-sparc.lo \ |
| 48 | elf64-tilegx.lo \ | 47 | elf64-tilegx.lo \ |
| 49 | elf64-x86-64.lo \ | 48 | elf64-x86-64.lo \ |
| 50 | @@ -596,6 +597,7 @@ BFD64_BACKENDS_CFILES = \ | 49 | @@ -592,6 +593,7 @@ BFD64_BACKENDS_CFILES = \ |
| 51 | elf64-nfp.c \ | 50 | elf64-nfp.c \ |
| 52 | elf64-ppc.c \ | 51 | elf64-ppc.c \ |
| 53 | elf64-s390.c \ | 52 | elf64-s390.c \ |
| @@ -56,10 +55,10 @@ index c88c448000..d86f1c5697 100644 | |||
| 56 | elf64-tilegx.c \ | 55 | elf64-tilegx.c \ |
| 57 | elf64-x86-64.c \ | 56 | elf64-x86-64.c \ |
| 58 | diff --git a/bfd/Makefile.in b/bfd/Makefile.in | 57 | diff --git a/bfd/Makefile.in b/bfd/Makefile.in |
| 59 | index d0d14c6ab3..a54abeca48 100644 | 58 | index 12807d99760..01ac4805eb8 100644 |
| 60 | --- a/bfd/Makefile.in | 59 | --- a/bfd/Makefile.in |
| 61 | +++ b/bfd/Makefile.in | 60 | +++ b/bfd/Makefile.in |
| 62 | @@ -988,6 +988,7 @@ BFD64_BACKENDS = \ | 61 | @@ -985,6 +985,7 @@ BFD64_BACKENDS = \ |
| 63 | elf64-riscv.lo \ | 62 | elf64-riscv.lo \ |
| 64 | elfxx-riscv.lo \ | 63 | elfxx-riscv.lo \ |
| 65 | elf64-s390.lo \ | 64 | elf64-s390.lo \ |
| @@ -67,7 +66,7 @@ index d0d14c6ab3..a54abeca48 100644 | |||
| 67 | elf64-sparc.lo \ | 66 | elf64-sparc.lo \ |
| 68 | elf64-tilegx.lo \ | 67 | elf64-tilegx.lo \ |
| 69 | elf64-x86-64.lo \ | 68 | elf64-x86-64.lo \ |
| 70 | @@ -1022,6 +1023,7 @@ BFD64_BACKENDS_CFILES = \ | 69 | @@ -1019,6 +1020,7 @@ BFD64_BACKENDS_CFILES = \ |
| 71 | elf64-nfp.c \ | 70 | elf64-nfp.c \ |
| 72 | elf64-ppc.c \ | 71 | elf64-ppc.c \ |
| 73 | elf64-s390.c \ | 72 | elf64-s390.c \ |
| @@ -75,7 +74,7 @@ index d0d14c6ab3..a54abeca48 100644 | |||
| 75 | elf64-sparc.c \ | 74 | elf64-sparc.c \ |
| 76 | elf64-tilegx.c \ | 75 | elf64-tilegx.c \ |
| 77 | elf64-x86-64.c \ | 76 | elf64-x86-64.c \ |
| 78 | @@ -1501,6 +1503,7 @@ distclean-compile: | 77 | @@ -1498,6 +1500,7 @@ distclean-compile: |
| 79 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@ | 78 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ppc.Plo@am__quote@ |
| 80 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@ | 79 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-riscv.Plo@am__quote@ |
| 81 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@ | 80 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-s390.Plo@am__quote@ |
| @@ -83,11 +82,37 @@ index d0d14c6ab3..a54abeca48 100644 | |||
| 83 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-sparc.Plo@am__quote@ | 82 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-sparc.Plo@am__quote@ |
| 84 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-tilegx.Plo@am__quote@ | 83 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-tilegx.Plo@am__quote@ |
| 85 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-x86-64.Plo@am__quote@ | 84 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-x86-64.Plo@am__quote@ |
| 85 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | ||
| 86 | index 943bc2e914c..2a1d7563643 100644 | ||
| 87 | --- a/bfd/bfd-in2.h | ||
| 88 | +++ b/bfd/bfd-in2.h | ||
| 89 | @@ -5433,11 +5433,21 @@ value in two words (with an imm instruction). No relocation is | ||
| 90 | done here - only used for relaxing */ | ||
| 91 | BFD_RELOC_MICROBLAZE_64_NONE, | ||
| 92 | |||
| 93 | +/* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 94 | + * +value in two words (with an imml instruction). No relocation is | ||
| 95 | + * +done here - only used for relaxing */ | ||
| 96 | + BFD_RELOC_MICROBLAZE_64, | ||
| 97 | + | ||
| 98 | /* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 99 | value in two words (with an imm instruction). The relocation is | ||
| 100 | PC-relative GOT offset */ | ||
| 101 | BFD_RELOC_MICROBLAZE_64_GOTPC, | ||
| 102 | |||
| 103 | +/* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 104 | +value in two words (with an imml instruction). The relocation is | ||
| 105 | +PC-relative GOT offset */ | ||
| 106 | + BFD_RELOC_MICROBLAZE_64_GPC, | ||
| 107 | + | ||
| 108 | /* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 109 | value in two words (with an imm instruction). The relocation is | ||
| 110 | GOT offset */ | ||
| 86 | diff --git a/bfd/config.bfd b/bfd/config.bfd | 111 | diff --git a/bfd/config.bfd b/bfd/config.bfd |
| 87 | index 14523caf0c..437c03bb9d 100644 | 112 | index 30087e3b8f8..108b77ac9c1 100644 |
| 88 | --- a/bfd/config.bfd | 113 | --- a/bfd/config.bfd |
| 89 | +++ b/bfd/config.bfd | 114 | +++ b/bfd/config.bfd |
| 90 | @@ -825,11 +825,15 @@ case "${targ}" in | 115 | @@ -822,11 +822,15 @@ case "${targ}" in |
| 91 | microblazeel*-*) | 116 | microblazeel*-*) |
| 92 | targ_defvec=microblaze_elf32_le_vec | 117 | targ_defvec=microblaze_elf32_le_vec |
| 93 | targ_selvecs=microblaze_elf32_vec | 118 | targ_selvecs=microblaze_elf32_vec |
| @@ -104,10 +129,10 @@ index 14523caf0c..437c03bb9d 100644 | |||
| 104 | 129 | ||
| 105 | #ifdef BFD64 | 130 | #ifdef BFD64 |
| 106 | diff --git a/bfd/configure b/bfd/configure | 131 | diff --git a/bfd/configure b/bfd/configure |
| 107 | index 0340ed541b..ff5ae4706c 100755 | 132 | index 41586f00f93..ffcd8ad4be0 100755 |
| 108 | --- a/bfd/configure | 133 | --- a/bfd/configure |
| 109 | +++ b/bfd/configure | 134 | +++ b/bfd/configure |
| 110 | @@ -14903,6 +14903,8 @@ do | 135 | @@ -13445,6 +13445,8 @@ do |
| 111 | s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; | 136 | s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; |
| 112 | score_elf32_be_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; | 137 | score_elf32_be_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; |
| 113 | score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; | 138 | score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; |
| @@ -117,10 +142,10 @@ index 0340ed541b..ff5ae4706c 100755 | |||
| 117 | sh_coff_le_vec) tb="$tb coff-sh.lo $coff" ;; | 142 | sh_coff_le_vec) tb="$tb coff-sh.lo $coff" ;; |
| 118 | sh_coff_small_vec) tb="$tb coff-sh.lo $coff" ;; | 143 | sh_coff_small_vec) tb="$tb coff-sh.lo $coff" ;; |
| 119 | diff --git a/bfd/configure.ac b/bfd/configure.ac | 144 | diff --git a/bfd/configure.ac b/bfd/configure.ac |
| 120 | index 8e86f8399c..408092d3be 100644 | 145 | index fec067b2135..9a7df353285 100644 |
| 121 | --- a/bfd/configure.ac | 146 | --- a/bfd/configure.ac |
| 122 | +++ b/bfd/configure.ac | 147 | +++ b/bfd/configure.ac |
| 123 | @@ -639,6 +639,8 @@ do | 148 | @@ -625,6 +625,8 @@ do |
| 124 | s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; | 149 | s390_elf64_vec) tb="$tb elf64-s390.lo elf64.lo $elf"; target_size=64 ;; |
| 125 | score_elf32_be_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; | 150 | score_elf32_be_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; |
| 126 | score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; | 151 | score_elf32_le_vec) tb="$tb elf32-score.lo elf32-score7.lo elf32.lo elf64.lo $elf"; want64=true; target_size=64 ;; |
| @@ -130,7 +155,7 @@ index 8e86f8399c..408092d3be 100644 | |||
| 130 | sh_coff_le_vec) tb="$tb coff-sh.lo $coff" ;; | 155 | sh_coff_le_vec) tb="$tb coff-sh.lo $coff" ;; |
| 131 | sh_coff_small_vec) tb="$tb coff-sh.lo $coff" ;; | 156 | sh_coff_small_vec) tb="$tb coff-sh.lo $coff" ;; |
| 132 | diff --git a/bfd/cpu-microblaze.c b/bfd/cpu-microblaze.c | 157 | diff --git a/bfd/cpu-microblaze.c b/bfd/cpu-microblaze.c |
| 133 | index 05a3f767e2..194920b20b 100644 | 158 | index d461d01e08f..ec94cc13595 100644 |
| 134 | --- a/bfd/cpu-microblaze.c | 159 | --- a/bfd/cpu-microblaze.c |
| 135 | +++ b/bfd/cpu-microblaze.c | 160 | +++ b/bfd/cpu-microblaze.c |
| 136 | @@ -23,7 +23,24 @@ | 161 | @@ -23,7 +23,24 @@ |
| @@ -150,7 +175,7 @@ index 05a3f767e2..194920b20b 100644 | |||
| 150 | + "microblaze", /* Architecture name. */ | 175 | + "microblaze", /* Architecture name. */ |
| 151 | + "MicroBlaze", /* Printable name. */ | 176 | + "MicroBlaze", /* Printable name. */ |
| 152 | + 3, /* Section align power. */ | 177 | + 3, /* Section align power. */ |
| 153 | + FALSE, /* Is this the default architecture ? */ | 178 | + false, /* Is this the default architecture ? */ |
| 154 | + bfd_default_compatible, /* Architecture comparison function. */ | 179 | + bfd_default_compatible, /* Architecture comparison function. */ |
| 155 | + bfd_default_scan, /* String to architecture conversion. */ | 180 | + bfd_default_scan, /* String to architecture conversion. */ |
| 156 | + bfd_arch_default_fill, /* Default fill. */ | 181 | + bfd_arch_default_fill, /* Default fill. */ |
| @@ -174,7 +199,7 @@ index 05a3f767e2..194920b20b 100644 | |||
| 174 | + "microblaze", /* Architecture name. */ | 199 | + "microblaze", /* Architecture name. */ |
| 175 | + "MicroBlaze", /* Printable name. */ | 200 | + "MicroBlaze", /* Printable name. */ |
| 176 | + 3, /* Section align power. */ | 201 | + 3, /* Section align power. */ |
| 177 | + TRUE, /* Is this the default architecture ? */ | 202 | + true, /* Is this the default architecture ? */ |
| 178 | + bfd_default_compatible, /* Architecture comparison function. */ | 203 | + bfd_default_compatible, /* Architecture comparison function. */ |
| 179 | + bfd_default_scan, /* String to architecture conversion. */ | 204 | + bfd_default_scan, /* String to architecture conversion. */ |
| 180 | + bfd_arch_default_fill, /* Default fill. */ | 205 | + bfd_arch_default_fill, /* Default fill. */ |
| @@ -189,7 +214,7 @@ index 05a3f767e2..194920b20b 100644 | |||
| 189 | + "microblaze", /* Architecture name. */ | 214 | + "microblaze", /* Architecture name. */ |
| 190 | + "MicroBlaze", /* Printable name. */ | 215 | + "MicroBlaze", /* Printable name. */ |
| 191 | + 3, /* Section align power. */ | 216 | + 3, /* Section align power. */ |
| 192 | + FALSE, /* Is this the default architecture ? */ | 217 | + false, /* Is this the default architecture ? */ |
| 193 | + bfd_default_compatible, /* Architecture comparison function. */ | 218 | + bfd_default_compatible, /* Architecture comparison function. */ |
| 194 | + bfd_default_scan, /* String to architecture conversion. */ | 219 | + bfd_default_scan, /* String to architecture conversion. */ |
| 195 | + bfd_arch_default_fill, /* Default fill. */ | 220 | + bfd_arch_default_fill, /* Default fill. */ |
| @@ -198,15 +223,135 @@ index 05a3f767e2..194920b20b 100644 | |||
| 198 | +} | 223 | +} |
| 199 | +#endif | 224 | +#endif |
| 200 | }; | 225 | }; |
| 226 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | ||
| 227 | index e378542b902..2f2e1ef7f41 100644 | ||
| 228 | --- a/bfd/elf32-microblaze.c | ||
| 229 | +++ b/bfd/elf32-microblaze.c | ||
| 230 | @@ -114,6 +114,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 231 | 0x0000ffff, /* Dest Mask. */ | ||
| 232 | true), /* PC relative offset? */ | ||
| 233 | |||
| 234 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ | ||
| 235 | + 0, /* Rightshift. */ | ||
| 236 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 237 | + 16, /* Bitsize. */ | ||
| 238 | + true, /* PC_relative. */ | ||
| 239 | + 0, /* Bitpos. */ | ||
| 240 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 241 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
| 242 | + "R_MICROBLAZE_IMML_64", /* Name. */ | ||
| 243 | + false, /* Partial Inplace. */ | ||
| 244 | + 0, /* Source Mask. */ | ||
| 245 | + 0x0000ffff, /* Dest Mask. */ | ||
| 246 | + false), /* PC relative offset? */ | ||
| 247 | + | ||
| 248 | /* A 64 bit relocation. Table entry not really used. */ | ||
| 249 | HOWTO (R_MICROBLAZE_64, /* Type. */ | ||
| 250 | 0, /* Rightshift. */ | ||
| 251 | @@ -179,15 +193,15 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 252 | 0, /* Rightshift. */ | ||
| 253 | 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 254 | 32, /* Bitsize. */ | ||
| 255 | - TRUE, /* PC_relative. */ | ||
| 256 | + false, /* PC_relative. */ | ||
| 257 | 0, /* Bitpos. */ | ||
| 258 | complain_overflow_bitfield, /* Complain on overflow. */ | ||
| 259 | NULL, /* Special Function. */ | ||
| 260 | "R_MICROBLAZE_32_NONE",/* Name. */ | ||
| 261 | - FALSE, /* Partial Inplace. */ | ||
| 262 | + false, /* Partial Inplace. */ | ||
| 263 | 0, /* Source Mask. */ | ||
| 264 | 0, /* Dest Mask. */ | ||
| 265 | - FALSE), /* PC relative offset? */ | ||
| 266 | + false), /* PC relative offset? */ | ||
| 267 | |||
| 268 | HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ | ||
| 269 | 0, /* Rightshift. */ | ||
| 270 | @@ -278,6 +292,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 271 | 0x0000ffff, /* Dest Mask. */ | ||
| 272 | true), /* PC relative offset? */ | ||
| 273 | |||
| 274 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | ||
| 275 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ | ||
| 276 | + 0, /* Rightshift. */ | ||
| 277 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 278 | + 16, /* Bitsize. */ | ||
| 279 | + true, /* PC_relative. */ | ||
| 280 | + 0, /* Bitpos. */ | ||
| 281 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 282 | + bfd_elf_generic_reloc, /* Special Function. */ | ||
| 283 | + "R_MICROBLAZE_GPC_64", /* Name. */ | ||
| 284 | + false, /* Partial Inplace. */ | ||
| 285 | + 0, /* Source Mask. */ | ||
| 286 | + 0x0000ffff, /* Dest Mask. */ | ||
| 287 | + true), /* PC relative offset? */ | ||
| 288 | + | ||
| 289 | /* A 64 bit GOT relocation. Table-entry not really used. */ | ||
| 290 | HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | ||
| 291 | 0, /* Rightshift. */ | ||
| 292 | @@ -617,9 +646,15 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 293 | case BFD_RELOC_VTABLE_ENTRY: | ||
| 294 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; | ||
| 295 | break; | ||
| 296 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 297 | + microblaze_reloc = R_MICROBLAZE_IMML_64; | ||
| 298 | + break; | ||
| 299 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 300 | microblaze_reloc = R_MICROBLAZE_GOTPC_64; | ||
| 301 | break; | ||
| 302 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 303 | + microblaze_reloc = R_MICROBLAZE_GPC_64; | ||
| 304 | + break; | ||
| 305 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 306 | microblaze_reloc = R_MICROBLAZE_GOT_64; | ||
| 307 | break; | ||
| 308 | @@ -1459,7 +1494,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 309 | if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) | ||
| 310 | { | ||
| 311 | relocation += addend; | ||
| 312 | - if (r_type == R_MICROBLAZE_32) | ||
| 313 | + if (r_type == R_MICROBLAZE_32)// || r_type == R_MICROBLAZE_IMML_64) | ||
| 314 | bfd_put_32 (input_bfd, relocation, contents + offset); | ||
| 315 | else | ||
| 316 | { | ||
| 317 | @@ -1925,6 +1960,28 @@ microblaze_elf_relax_section (bfd *abfd, | ||
| 318 | irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); | ||
| 319 | } | ||
| 320 | break; | ||
| 321 | + case R_MICROBLAZE_IMML_64: | ||
| 322 | + { | ||
| 323 | + /* This was a PC-relative instruction that was | ||
| 324 | + completely resolved. */ | ||
| 325 | + int sfix, efix; | ||
| 326 | + unsigned int val; | ||
| 327 | + bfd_vma target_address; | ||
| 328 | + target_address = irel->r_addend + irel->r_offset; | ||
| 329 | + sfix = calc_fixup (irel->r_offset, 0, sec); | ||
| 330 | + efix = calc_fixup (target_address, 0, sec); | ||
| 331 | + | ||
| 332 | + /* Validate the in-band val. */ | ||
| 333 | + val = bfd_get_32 (abfd, contents + irel->r_offset); | ||
| 334 | + if (val != irel->r_addend && ELF64_R_TYPE (irel->r_info) == R_MICROBLAZE_32_NONE) { | ||
| 335 | + fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); | ||
| 336 | + } | ||
| 337 | + irel->r_addend -= (efix - sfix); | ||
| 338 | + /* Should use HOWTO. */ | ||
| 339 | + microblaze_bfd_write_imm_value_64 (abfd, contents + irel->r_offset, | ||
| 340 | + irel->r_addend); | ||
| 341 | + } | ||
| 342 | + break; | ||
| 343 | case R_MICROBLAZE_NONE: | ||
| 344 | case R_MICROBLAZE_32_NONE: | ||
| 345 | { | ||
| 201 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 346 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 202 | new file mode 100644 | 347 | new file mode 100644 |
| 203 | index 0000000000..a357388115 | 348 | index 00000000000..46c4aba46f1 |
| 204 | --- /dev/null | 349 | --- /dev/null |
| 205 | +++ b/bfd/elf64-microblaze.c | 350 | +++ b/bfd/elf64-microblaze.c |
| 206 | @@ -0,0 +1,3610 @@ | 351 | @@ -0,0 +1,3577 @@ |
| 207 | +/* Xilinx MicroBlaze-specific support for 32-bit ELF | 352 | +/* Xilinx MicroBlaze-specific support for 32-bit ELF |
| 208 | + | 353 | + |
| 209 | + Copyright (C) 2009-2016 Free Software Foundation, Inc. | 354 | + Copyright (C) 2009-2021 Free Software Foundation, Inc. |
| 210 | + | 355 | + |
| 211 | + This file is part of BFD, the Binary File Descriptor library. | 356 | + This file is part of BFD, the Binary File Descriptor library. |
| 212 | + | 357 | + |
| @@ -226,8 +371,6 @@ index 0000000000..a357388115 | |||
| 226 | + Boston, MA 02110-1301, USA. */ | 371 | + Boston, MA 02110-1301, USA. */ |
| 227 | + | 372 | + |
| 228 | + | 373 | + |
| 229 | +int dbg1 = 0; | ||
| 230 | + | ||
| 231 | +#include "sysdep.h" | 374 | +#include "sysdep.h" |
| 232 | +#include "bfd.h" | 375 | +#include "bfd.h" |
| 233 | +#include "bfdlink.h" | 376 | +#include "bfdlink.h" |
| @@ -252,387 +395,448 @@ index 0000000000..a357388115 | |||
| 252 | + 0, /* Rightshift. */ | 395 | + 0, /* Rightshift. */ |
| 253 | + 3, /* Size (0 = byte, 1 = short, 2 = long). */ | 396 | + 3, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 254 | + 0, /* Bitsize. */ | 397 | + 0, /* Bitsize. */ |
| 255 | + FALSE, /* PC_relative. */ | 398 | + false, /* PC_relative. */ |
| 256 | + 0, /* Bitpos. */ | 399 | + 0, /* Bitpos. */ |
| 257 | + complain_overflow_dont, /* Complain on overflow. */ | 400 | + complain_overflow_dont, /* Complain on overflow. */ |
| 258 | + NULL, /* Special Function. */ | 401 | + NULL, /* Special Function. */ |
| 259 | + "R_MICROBLAZE_NONE", /* Name. */ | 402 | + "R_MICROBLAZE_NONE", /* Name. */ |
| 260 | + FALSE, /* Partial Inplace. */ | 403 | + false, /* Partial Inplace. */ |
| 261 | + 0, /* Source Mask. */ | 404 | + 0, /* Source Mask. */ |
| 262 | + 0, /* Dest Mask. */ | 405 | + 0, /* Dest Mask. */ |
| 263 | + FALSE), /* PC relative offset? */ | 406 | + false), /* PC relative offset? */ |
| 264 | + | 407 | + |
| 265 | + /* A standard 32 bit relocation. */ | 408 | + /* A standard 32 bit relocation. */ |
| 266 | + HOWTO (R_MICROBLAZE_32, /* Type. */ | 409 | + HOWTO (R_MICROBLAZE_32, /* Type. */ |
| 267 | + 0, /* Rightshift. */ | 410 | + 0, /* Rightshift. */ |
| 268 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 411 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 269 | + 32, /* Bitsize. */ | 412 | + 32, /* Bitsize. */ |
| 270 | + FALSE, /* PC_relative. */ | 413 | + false, /* PC_relative. */ |
| 271 | + 0, /* Bitpos. */ | 414 | + 0, /* Bitpos. */ |
| 272 | + complain_overflow_bitfield, /* Complain on overflow. */ | 415 | + complain_overflow_bitfield, /* Complain on overflow. */ |
| 273 | + bfd_elf_generic_reloc,/* Special Function. */ | 416 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 274 | + "R_MICROBLAZE_32", /* Name. */ | 417 | + "R_MICROBLAZE_32", /* Name. */ |
| 275 | + FALSE, /* Partial Inplace. */ | 418 | + false, /* Partial Inplace. */ |
| 276 | + 0, /* Source Mask. */ | 419 | + 0, /* Source Mask. */ |
| 277 | + 0xffffffff, /* Dest Mask. */ | 420 | + 0xffffffff, /* Dest Mask. */ |
| 278 | + FALSE), /* PC relative offset? */ | 421 | + false), /* PC relative offset? */ |
| 279 | + | 422 | + |
| 280 | + /* A standard PCREL 32 bit relocation. */ | 423 | + /* A standard PCREL 32 bit relocation. */ |
| 281 | + HOWTO (R_MICROBLAZE_32_PCREL,/* Type. */ | 424 | + HOWTO (R_MICROBLAZE_32_PCREL,/* Type. */ |
| 282 | + 0, /* Rightshift. */ | 425 | + 0, /* Rightshift. */ |
| 283 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 426 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 284 | + 32, /* Bitsize. */ | 427 | + 32, /* Bitsize. */ |
| 285 | + TRUE, /* PC_relative. */ | 428 | + true, /* PC_relative. */ |
| 286 | + 0, /* Bitpos. */ | 429 | + 0, /* Bitpos. */ |
| 287 | + complain_overflow_bitfield, /* Complain on overflow. */ | 430 | + complain_overflow_bitfield, /* Complain on overflow. */ |
| 288 | + bfd_elf_generic_reloc,/* Special Function. */ | 431 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 289 | + "R_MICROBLAZE_32_PCREL", /* Name. */ | 432 | + "R_MICROBLAZE_32_PCREL", /* Name. */ |
| 290 | + TRUE, /* Partial Inplace. */ | 433 | + true, /* Partial Inplace. */ |
| 291 | + 0, /* Source Mask. */ | 434 | + 0, /* Source Mask. */ |
| 292 | + 0xffffffff, /* Dest Mask. */ | 435 | + 0xffffffff, /* Dest Mask. */ |
| 293 | + TRUE), /* PC relative offset? */ | 436 | + true), /* PC relative offset? */ |
| 294 | + | 437 | + |
| 295 | + /* A 64 bit PCREL relocation. Table-entry not really used. */ | 438 | + /* A 64 bit PCREL relocation. Table-entry not really used. */ |
| 296 | + HOWTO (R_MICROBLAZE_64_PCREL,/* Type. */ | 439 | + HOWTO (R_MICROBLAZE_64_PCREL,/* Type. */ |
| 297 | + 0, /* Rightshift. */ | 440 | + 0, /* Rightshift. */ |
| 298 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ | 441 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 299 | + 64, /* Bitsize. */ | 442 | + 64, /* Bitsize. */ |
| 300 | + TRUE, /* PC_relative. */ | 443 | + true, /* PC_relative. */ |
| 301 | + 0, /* Bitpos. */ | 444 | + 0, /* Bitpos. */ |
| 302 | + complain_overflow_dont, /* Complain on overflow. */ | 445 | + complain_overflow_dont, /* Complain on overflow. */ |
| 303 | + bfd_elf_generic_reloc,/* Special Function. */ | 446 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 304 | + "R_MICROBLAZE_64_PCREL", /* Name. */ | 447 | + "R_MICROBLAZE_64_PCREL", /* Name. */ |
| 305 | + FALSE, /* Partial Inplace. */ | 448 | + false, /* Partial Inplace. */ |
| 306 | + 0, /* Source Mask. */ | 449 | + 0, /* Source Mask. */ |
| 307 | + 0x0000ffff, /* Dest Mask. */ | 450 | + 0x0000ffff, /* Dest Mask. */ |
| 308 | + TRUE), /* PC relative offset? */ | 451 | + true), /* PC relative offset? */ |
| 309 | + | 452 | + |
| 310 | + /* The low half of a PCREL 32 bit relocation. */ | 453 | + /* The low half of a PCREL 32 bit relocation. */ |
| 311 | + HOWTO (R_MICROBLAZE_32_PCREL_LO, /* Type. */ | 454 | + HOWTO (R_MICROBLAZE_32_PCREL_LO, /* Type. */ |
| 312 | + 0, /* Rightshift. */ | 455 | + 0, /* Rightshift. */ |
| 313 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 456 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 314 | + 16, /* Bitsize. */ | 457 | + 16, /* Bitsize. */ |
| 315 | + TRUE, /* PC_relative. */ | 458 | + true, /* PC_relative. */ |
| 316 | + 0, /* Bitpos. */ | 459 | + 0, /* Bitpos. */ |
| 317 | + complain_overflow_signed, /* Complain on overflow. */ | 460 | + complain_overflow_signed, /* Complain on overflow. */ |
| 318 | + bfd_elf_generic_reloc, /* Special Function. */ | 461 | + bfd_elf_generic_reloc, /* Special Function. */ |
| 319 | + "R_MICROBLAZE_32_PCREL_LO", /* Name. */ | 462 | + "R_MICROBLAZE_32_PCREL_LO", /* Name. */ |
| 320 | + FALSE, /* Partial Inplace. */ | 463 | + false, /* Partial Inplace. */ |
| 321 | + 0, /* Source Mask. */ | 464 | + 0, /* Source Mask. */ |
| 322 | + 0x0000ffff, /* Dest Mask. */ | 465 | + 0x0000ffff, /* Dest Mask. */ |
| 323 | + TRUE), /* PC relative offset? */ | 466 | + true), /* PC relative offset? */ |
| 467 | + | ||
| 468 | + /* A 64 bit relocation. Table entry not really used. */ | ||
| 469 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ | ||
| 470 | + 0, /* Rightshift. */ | ||
| 471 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 472 | + 64, /* Bitsize. */ | ||
| 473 | + true, /* PC_relative. */ | ||
| 474 | + 0, /* Bitpos. */ | ||
| 475 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 476 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
| 477 | + "R_MICROBLAZE_IMML_64", /* Name. */ | ||
| 478 | + false, /* Partial Inplace. */ | ||
| 479 | + 0, /* Source Mask. */ | ||
| 480 | + 0x0000ffff, /* Dest Mask. */ | ||
| 481 | + true), /* PC relative offset? */ | ||
| 324 | + | 482 | + |
| 325 | + /* A 64 bit relocation. Table entry not really used. */ | 483 | + /* A 64 bit relocation. Table entry not really used. */ |
| 326 | + HOWTO (R_MICROBLAZE_64, /* Type. */ | 484 | + HOWTO (R_MICROBLAZE_64, /* Type. */ |
| 327 | + 0, /* Rightshift. */ | 485 | + 0, /* Rightshift. */ |
| 328 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 486 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 329 | + 16, /* Bitsize. */ | 487 | + 16, /* Bitsize. */ |
| 330 | + FALSE, /* PC_relative. */ | 488 | + false, /* PC_relative. */ |
| 331 | + 0, /* Bitpos. */ | 489 | + 0, /* Bitpos. */ |
| 332 | + complain_overflow_dont, /* Complain on overflow. */ | 490 | + complain_overflow_dont, /* Complain on overflow. */ |
| 333 | + bfd_elf_generic_reloc,/* Special Function. */ | 491 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 334 | + "R_MICROBLAZE_64", /* Name. */ | 492 | + "R_MICROBLAZE_64", /* Name. */ |
| 335 | + FALSE, /* Partial Inplace. */ | 493 | + false, /* Partial Inplace. */ |
| 336 | + 0, /* Source Mask. */ | 494 | + 0, /* Source Mask. */ |
| 337 | + 0x0000ffff, /* Dest Mask. */ | 495 | + 0x0000ffff, /* Dest Mask. */ |
| 338 | + FALSE), /* PC relative offset? */ | 496 | + false), /* PC relative offset? */ |
| 339 | + | 497 | + |
| 340 | + /* The low half of a 32 bit relocation. */ | 498 | + /* The low half of a 32 bit relocation. */ |
| 341 | + HOWTO (R_MICROBLAZE_32_LO, /* Type. */ | 499 | + HOWTO (R_MICROBLAZE_32_LO, /* Type. */ |
| 342 | + 0, /* Rightshift. */ | 500 | + 0, /* Rightshift. */ |
| 343 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 501 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 344 | + 16, /* Bitsize. */ | 502 | + 16, /* Bitsize. */ |
| 345 | + FALSE, /* PC_relative. */ | 503 | + false, /* PC_relative. */ |
| 346 | + 0, /* Bitpos. */ | 504 | + 0, /* Bitpos. */ |
| 347 | + complain_overflow_signed, /* Complain on overflow. */ | 505 | + complain_overflow_signed, /* Complain on overflow. */ |
| 348 | + bfd_elf_generic_reloc,/* Special Function. */ | 506 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 349 | + "R_MICROBLAZE_32_LO", /* Name. */ | 507 | + "R_MICROBLAZE_32_LO", /* Name. */ |
| 350 | + FALSE, /* Partial Inplace. */ | 508 | + false, /* Partial Inplace. */ |
| 351 | + 0, /* Source Mask. */ | 509 | + 0, /* Source Mask. */ |
| 352 | + 0x0000ffff, /* Dest Mask. */ | 510 | + 0x0000ffff, /* Dest Mask. */ |
| 353 | + FALSE), /* PC relative offset? */ | 511 | + false), /* PC relative offset? */ |
| 354 | + | 512 | + |
| 355 | + /* Read-only small data section relocation. */ | 513 | + /* Read-only small data section relocation. */ |
| 356 | + HOWTO (R_MICROBLAZE_SRO32, /* Type. */ | 514 | + HOWTO (R_MICROBLAZE_SRO32, /* Type. */ |
| 357 | + 0, /* Rightshift. */ | 515 | + 0, /* Rightshift. */ |
| 358 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 516 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 359 | + 16, /* Bitsize. */ | 517 | + 16, /* Bitsize. */ |
| 360 | + FALSE, /* PC_relative. */ | 518 | + false, /* PC_relative. */ |
| 361 | + 0, /* Bitpos. */ | 519 | + 0, /* Bitpos. */ |
| 362 | + complain_overflow_bitfield, /* Complain on overflow. */ | 520 | + complain_overflow_bitfield, /* Complain on overflow. */ |
| 363 | + bfd_elf_generic_reloc,/* Special Function. */ | 521 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 364 | + "R_MICROBLAZE_SRO32", /* Name. */ | 522 | + "R_MICROBLAZE_SRO32", /* Name. */ |
| 365 | + FALSE, /* Partial Inplace. */ | 523 | + false, /* Partial Inplace. */ |
| 366 | + 0, /* Source Mask. */ | 524 | + 0, /* Source Mask. */ |
| 367 | + 0x0000ffff, /* Dest Mask. */ | 525 | + 0x0000ffff, /* Dest Mask. */ |
| 368 | + FALSE), /* PC relative offset? */ | 526 | + false), /* PC relative offset? */ |
| 369 | + | 527 | + |
| 370 | + /* Read-write small data area relocation. */ | 528 | + /* Read-write small data area relocation. */ |
| 371 | + HOWTO (R_MICROBLAZE_SRW32, /* Type. */ | 529 | + HOWTO (R_MICROBLAZE_SRW32, /* Type. */ |
| 372 | + 0, /* Rightshift. */ | 530 | + 0, /* Rightshift. */ |
| 373 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 531 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 374 | + 16, /* Bitsize. */ | 532 | + 16, /* Bitsize. */ |
| 375 | + FALSE, /* PC_relative. */ | 533 | + false, /* PC_relative. */ |
| 376 | + 0, /* Bitpos. */ | 534 | + 0, /* Bitpos. */ |
| 377 | + complain_overflow_bitfield, /* Complain on overflow. */ | 535 | + complain_overflow_bitfield, /* Complain on overflow. */ |
| 378 | + bfd_elf_generic_reloc,/* Special Function. */ | 536 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 379 | + "R_MICROBLAZE_SRW32", /* Name. */ | 537 | + "R_MICROBLAZE_SRW32", /* Name. */ |
| 380 | + FALSE, /* Partial Inplace. */ | 538 | + false, /* Partial Inplace. */ |
| 381 | + 0, /* Source Mask. */ | 539 | + 0, /* Source Mask. */ |
| 382 | + 0x0000ffff, /* Dest Mask. */ | 540 | + 0x0000ffff, /* Dest Mask. */ |
| 383 | + FALSE), /* PC relative offset? */ | 541 | + false), /* PC relative offset? */ |
| 384 | + | 542 | + |
| 385 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ | 543 | + HOWTO (R_MICROBLAZE_32_NONE, /* Type. */ |
| 386 | + 0, /* Rightshift. */ | 544 | + 0, /* Rightshift. */ |
| 387 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 545 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 388 | + 32, /* Bitsize. */ | 546 | + 32, /* Bitsize. */ |
| 389 | + TRUE, /* PC_relative. */ | 547 | + true, /* PC_relative. */ |
| 390 | + 0, /* Bitpos. */ | 548 | + 0, /* Bitpos. */ |
| 391 | + complain_overflow_bitfield, /* Complain on overflow. */ | 549 | + complain_overflow_bitfield, /* Complain on overflow. */ |
| 392 | + NULL, /* Special Function. */ | 550 | + NULL, /* Special Function. */ |
| 393 | + "R_MICROBLAZE_32_NONE",/* Name. */ | 551 | + "R_MICROBLAZE_32_NONE",/* Name. */ |
| 394 | + FALSE, /* Partial Inplace. */ | 552 | + false, /* Partial Inplace. */ |
| 395 | + 0, /* Source Mask. */ | 553 | + 0, /* Source Mask. */ |
| 396 | + 0, /* Dest Mask. */ | 554 | + 0, /* Dest Mask. */ |
| 397 | + FALSE), /* PC relative offset? */ | 555 | + false), /* PC relative offset? */ |
| 398 | + | 556 | + |
| 399 | + /* This reloc does nothing. Used for relaxation. */ | 557 | + /* This reloc does nothing. Used for relaxation. */ |
| 400 | + HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ | 558 | + HOWTO (R_MICROBLAZE_64_NONE, /* Type. */ |
| 401 | + 0, /* Rightshift. */ | 559 | + 0, /* Rightshift. */ |
| 402 | + 3, /* Size (0 = byte, 1 = short, 2 = long). */ | 560 | + 3, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 403 | + 0, /* Bitsize. */ | 561 | + 0, /* Bitsize. */ |
| 404 | + TRUE, /* PC_relative. */ | 562 | + true, /* PC_relative. */ |
| 405 | + 0, /* Bitpos. */ | 563 | + 0, /* Bitpos. */ |
| 406 | + complain_overflow_dont, /* Complain on overflow. */ | 564 | + complain_overflow_dont, /* Complain on overflow. */ |
| 407 | + NULL, /* Special Function. */ | 565 | + NULL, /* Special Function. */ |
| 408 | + "R_MICROBLAZE_64_NONE",/* Name. */ | 566 | + "R_MICROBLAZE_64_NONE",/* Name. */ |
| 409 | + FALSE, /* Partial Inplace. */ | 567 | + false, /* Partial Inplace. */ |
| 410 | + 0, /* Source Mask. */ | 568 | + 0, /* Source Mask. */ |
| 411 | + 0, /* Dest Mask. */ | 569 | + 0, /* Dest Mask. */ |
| 412 | + FALSE), /* PC relative offset? */ | 570 | + false), /* PC relative offset? */ |
| 413 | + | 571 | + |
| 414 | + /* Symbol Op Symbol relocation. */ | 572 | + /* Symbol Op Symbol relocation. */ |
| 415 | + HOWTO (R_MICROBLAZE_32_SYM_OP_SYM, /* Type. */ | 573 | + HOWTO (R_MICROBLAZE_32_SYM_OP_SYM, /* Type. */ |
| 416 | + 0, /* Rightshift. */ | 574 | + 0, /* Rightshift. */ |
| 417 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 575 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 418 | + 32, /* Bitsize. */ | 576 | + 32, /* Bitsize. */ |
| 419 | + FALSE, /* PC_relative. */ | 577 | + false, /* PC_relative. */ |
| 420 | + 0, /* Bitpos. */ | 578 | + 0, /* Bitpos. */ |
| 421 | + complain_overflow_bitfield, /* Complain on overflow. */ | 579 | + complain_overflow_bitfield, /* Complain on overflow. */ |
| 422 | + bfd_elf_generic_reloc,/* Special Function. */ | 580 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 423 | + "R_MICROBLAZE_32_SYM_OP_SYM", /* Name. */ | 581 | + "R_MICROBLAZE_32_SYM_OP_SYM", /* Name. */ |
| 424 | + FALSE, /* Partial Inplace. */ | 582 | + false, /* Partial Inplace. */ |
| 425 | + 0, /* Source Mask. */ | 583 | + 0, /* Source Mask. */ |
| 426 | + 0xffffffff, /* Dest Mask. */ | 584 | + 0xffffffff, /* Dest Mask. */ |
| 427 | + FALSE), /* PC relative offset? */ | 585 | + false), /* PC relative offset? */ |
| 428 | + | 586 | + |
| 429 | + /* GNU extension to record C++ vtable hierarchy. */ | 587 | + /* GNU extension to record C++ vtable hierarchy. */ |
| 430 | + HOWTO (R_MICROBLAZE_GNU_VTINHERIT, /* Type. */ | 588 | + HOWTO (R_MICROBLAZE_GNU_VTINHERIT, /* Type. */ |
| 431 | + 0, /* Rightshift. */ | 589 | + 0, /* Rightshift. */ |
| 432 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 590 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 433 | + 0, /* Bitsize. */ | 591 | + 0, /* Bitsize. */ |
| 434 | + FALSE, /* PC_relative. */ | 592 | + false, /* PC_relative. */ |
| 435 | + 0, /* Bitpos. */ | 593 | + 0, /* Bitpos. */ |
| 436 | + complain_overflow_dont,/* Complain on overflow. */ | 594 | + complain_overflow_dont,/* Complain on overflow. */ |
| 437 | + NULL, /* Special Function. */ | 595 | + NULL, /* Special Function. */ |
| 438 | + "R_MICROBLAZE_GNU_VTINHERIT", /* Name. */ | 596 | + "R_MICROBLAZE_GNU_VTINHERIT", /* Name. */ |
| 439 | + FALSE, /* Partial Inplace. */ | 597 | + false, /* Partial Inplace. */ |
| 440 | + 0, /* Source Mask. */ | 598 | + 0, /* Source Mask. */ |
| 441 | + 0, /* Dest Mask. */ | 599 | + 0, |
| 442 | + FALSE), /* PC relative offset? */ | 600 | + /* Dest Mask. */ |
| 601 | + false), /* PC relative offset? */ | ||
| 443 | + | 602 | + |
| 444 | + /* GNU extension to record C++ vtable member usage. */ | 603 | + /* GNU extension to record C++ vtable member usage. */ |
| 445 | + HOWTO (R_MICROBLAZE_GNU_VTENTRY, /* Type. */ | 604 | + HOWTO (R_MICROBLAZE_GNU_VTENTRY, /* Type. */ |
| 446 | + 0, /* Rightshift. */ | 605 | + 0, /* Rightshift. */ |
| 447 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 606 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 448 | + 0, /* Bitsize. */ | 607 | + 0, /* Bitsize. */ |
| 449 | + FALSE, /* PC_relative. */ | 608 | + false, /* PC_relative. */ |
| 450 | + 0, /* Bitpos. */ | 609 | + 0, /* Bitpos. */ |
| 451 | + complain_overflow_dont,/* Complain on overflow. */ | 610 | + complain_overflow_dont,/* Complain on overflow. */ |
| 452 | + _bfd_elf_rel_vtable_reloc_fn, /* Special Function. */ | 611 | + _bfd_elf_rel_vtable_reloc_fn, /* Special Function. */ |
| 453 | + "R_MICROBLAZE_GNU_VTENTRY", /* Name. */ | 612 | + "R_MICROBLAZE_GNU_VTENTRY", /* Name. */ |
| 454 | + FALSE, /* Partial Inplace. */ | 613 | + false, /* Partial Inplace. */ |
| 455 | + 0, /* Source Mask. */ | 614 | + 0, /* Source Mask. */ |
| 456 | + 0, /* Dest Mask. */ | 615 | + 0, /* Dest Mask. */ |
| 457 | + FALSE), /* PC relative offset? */ | 616 | + false), /* PC relative offset? */ |
| 458 | + | 617 | + |
| 459 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | 618 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ |
| 460 | + HOWTO (R_MICROBLAZE_GOTPC_64, /* Type. */ | 619 | + HOWTO (R_MICROBLAZE_GOTPC_64, /* Type. */ |
| 461 | + 0, /* Rightshift. */ | 620 | + 0, /* Rightshift. */ |
| 462 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 621 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 463 | + 16, /* Bitsize. */ | 622 | + 16, /* Bitsize. */ |
| 464 | + TRUE, /* PC_relative. */ | 623 | + true, /* PC_relative. */ |
| 465 | + 0, /* Bitpos. */ | 624 | + 0, /* Bitpos. */ |
| 466 | + complain_overflow_dont, /* Complain on overflow. */ | 625 | + complain_overflow_dont, /* Complain on overflow. */ |
| 467 | + bfd_elf_generic_reloc, /* Special Function. */ | 626 | + bfd_elf_generic_reloc, /* Special Function. */ |
| 468 | + "R_MICROBLAZE_GOTPC_64", /* Name. */ | 627 | + "R_MICROBLAZE_GOTPC_64", /* Name. */ |
| 469 | + FALSE, /* Partial Inplace. */ | 628 | + false, /* Partial Inplace. */ |
| 470 | + 0, /* Source Mask. */ | 629 | + 0, /* Source Mask. */ |
| 471 | + 0x0000ffff, /* Dest Mask. */ | 630 | + 0x0000ffff, /* Dest Mask. */ |
| 472 | + TRUE), /* PC relative offset? */ | 631 | + true), /* PC relative offset? */ |
| 632 | + | ||
| 633 | + /* A 64 bit TEXTPCREL relocation. Table-entry not really used. */ | ||
| 634 | + HOWTO (R_MICROBLAZE_TEXTPCREL_64, /* Type. */ | ||
| 635 | + 0, /* Rightshift. */ | ||
| 636 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 637 | + 16, /* Bitsize. */ | ||
| 638 | + true, /* PC_relative. */ | ||
| 639 | + 0, /* Bitpos. */ | ||
| 640 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 641 | + bfd_elf_generic_reloc, /* Special Function. */ | ||
| 642 | + "R_MICROBLAZE_TEXTPCREL_64", /* Name. */ | ||
| 643 | + false, /* Partial Inplace. */ | ||
| 644 | + 0, /* Source Mask. */ | ||
| 645 | + 0x0000ffff, /* Dest Mask. */ | ||
| 646 | + true), /* PC relative offset? */ | ||
| 473 | + | 647 | + |
| 474 | + /* A 64 bit GOT relocation. Table-entry not really used. */ | 648 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ |
| 475 | + HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | 649 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ |
| 476 | + 0, /* Rightshift. */ | 650 | + 0, /* Rightshift. */ |
| 477 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 651 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 478 | + 16, /* Bitsize. */ | 652 | + 16, /* Bitsize. */ |
| 479 | + FALSE, /* PC_relative. */ | 653 | + true, /* PC_relative. */ |
| 480 | + 0, /* Bitpos. */ | 654 | + 0, /* Bitpos. */ |
| 481 | + complain_overflow_dont, /* Complain on overflow. */ | 655 | + complain_overflow_dont, /* Complain on overflow. */ |
| 482 | + bfd_elf_generic_reloc,/* Special Function. */ | 656 | + bfd_elf_generic_reloc, /* Special Function. */ |
| 483 | + "R_MICROBLAZE_GOT_64",/* Name. */ | 657 | + "R_MICROBLAZE_GPC_64", /* Name. */ |
| 484 | + FALSE, /* Partial Inplace. */ | 658 | + false, /* Partial Inplace. */ |
| 485 | + 0, /* Source Mask. */ | 659 | + 0, /* Source Mask. */ |
| 486 | + 0x0000ffff, /* Dest Mask. */ | 660 | + 0x0000ffff, /* Dest Mask. */ |
| 487 | + FALSE), /* PC relative offset? */ | 661 | + true), /* PC relative offset? */ |
| 662 | + | ||
| 663 | + /* A 64 bit GOT relocation. Table-entry not really used. */ | ||
| 664 | + HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | ||
| 665 | + 0, /* Rightshift. */ | ||
| 666 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 667 | + 16, /* Bitsize. */ | ||
| 668 | + false, /* PC_relative. */ | ||
| 669 | + 0, /* Bitpos. */ | ||
| 670 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 671 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
| 672 | + "R_MICROBLAZE_GOT_64",/* Name. */ | ||
| 673 | + false, /* Partial Inplace. */ | ||
| 674 | + 0, /* Source Mask. */ | ||
| 675 | + 0x0000ffff, /* Dest Mask. */ | ||
| 676 | + false), /* PC relative offset? */ | ||
| 677 | + | ||
| 678 | + /* A 64 bit TEXTREL relocation. Table-entry not really used. */ | ||
| 679 | + HOWTO (R_MICROBLAZE_TEXTREL_64, /* Type. */ | ||
| 680 | + 0, /* Rightshift. */ | ||
| 681 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 682 | + 16, /* Bitsize. */ | ||
| 683 | + false, /* PC_relative. */ | ||
| 684 | + 0, /* Bitpos. */ | ||
| 685 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 686 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
| 687 | + "R_MICROBLAZE_TEXTREL_64",/* Name. */ | ||
| 688 | + false, /* Partial Inplace. */ | ||
| 689 | + 0, /* Source Mask. */ | ||
| 690 | + 0x0000ffff, /* Dest Mask. */ | ||
| 691 | + false), /* PC relative offset? */ | ||
| 488 | + | 692 | + |
| 489 | + /* A 64 bit PLT relocation. Table-entry not really used. */ | 693 | + /* A 64 bit PLT relocation. Table-entry not really used. */ |
| 490 | + HOWTO (R_MICROBLAZE_PLT_64, /* Type. */ | 694 | + HOWTO (R_MICROBLAZE_PLT_64, /* Type. */ |
| 491 | + 0, /* Rightshift. */ | 695 | + 0, /* Rightshift. */ |
| 492 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 696 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 493 | + 16, /* Bitsize. */ | 697 | + 16, /* Bitsize. */ |
| 494 | + TRUE, /* PC_relative. */ | 698 | + true, /* PC_relative. */ |
| 495 | + 0, /* Bitpos. */ | 699 | + 0, /* Bitpos. */ |
| 496 | + complain_overflow_dont, /* Complain on overflow. */ | 700 | + complain_overflow_dont, /* Complain on overflow. */ |
| 497 | + bfd_elf_generic_reloc,/* Special Function. */ | 701 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 498 | + "R_MICROBLAZE_PLT_64",/* Name. */ | 702 | + "R_MICROBLAZE_PLT_64",/* Name. */ |
| 499 | + FALSE, /* Partial Inplace. */ | 703 | + false, /* Partial Inplace. */ |
| 500 | + 0, /* Source Mask. */ | 704 | + 0, /* Source Mask. */ |
| 501 | + 0x0000ffff, /* Dest Mask. */ | 705 | + 0x0000ffff, /* Dest Mask. */ |
| 502 | + TRUE), /* PC relative offset? */ | 706 | + true), /* PC relative offset? */ |
| 503 | + | 707 | + |
| 504 | + /* Table-entry not really used. */ | 708 | + /* Table-entry not really used. */ |
| 505 | + HOWTO (R_MICROBLAZE_REL, /* Type. */ | 709 | + HOWTO (R_MICROBLAZE_REL, /* Type. */ |
| 506 | + 0, /* Rightshift. */ | 710 | + 0, /* Rightshift. */ |
| 507 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 711 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 508 | + 16, /* Bitsize. */ | 712 | + 16, /* Bitsize. */ |
| 509 | + TRUE, /* PC_relative. */ | 713 | + true, /* PC_relative. */ |
| 510 | + 0, /* Bitpos. */ | 714 | + 0, /* Bitpos. */ |
| 511 | + complain_overflow_dont, /* Complain on overflow. */ | 715 | + complain_overflow_dont, /* Complain on overflow. */ |
| 512 | + bfd_elf_generic_reloc,/* Special Function. */ | 716 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 513 | + "R_MICROBLAZE_REL", /* Name. */ | 717 | + "R_MICROBLAZE_REL", /* Name. */ |
| 514 | + FALSE, /* Partial Inplace. */ | 718 | + false, /* Partial Inplace. */ |
| 515 | + 0, /* Source Mask. */ | 719 | + 0, /* Source Mask. */ |
| 516 | + 0x0000ffff, /* Dest Mask. */ | 720 | + 0x0000ffff, /* Dest Mask. */ |
| 517 | + TRUE), /* PC relative offset? */ | 721 | + true), /* PC relative offset? */ |
| 518 | + | 722 | + |
| 519 | + /* Table-entry not really used. */ | 723 | + /* Table-entry not really used. */ |
| 520 | + HOWTO (R_MICROBLAZE_JUMP_SLOT,/* Type. */ | 724 | + HOWTO (R_MICROBLAZE_JUMP_SLOT,/* Type. */ |
| 521 | + 0, /* Rightshift. */ | 725 | + 0, /* Rightshift. */ |
| 522 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 726 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 523 | + 16, /* Bitsize. */ | 727 | + 16, /* Bitsize. */ |
| 524 | + TRUE, /* PC_relative. */ | 728 | + true, /* PC_relative. */ |
| 525 | + 0, /* Bitpos. */ | 729 | + 0, /* Bitpos. */ |
| 526 | + complain_overflow_dont, /* Complain on overflow. */ | 730 | + complain_overflow_dont, /* Complain on overflow. */ |
| 527 | + bfd_elf_generic_reloc,/* Special Function. */ | 731 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 528 | + "R_MICROBLAZE_JUMP_SLOT", /* Name. */ | 732 | + "R_MICROBLAZE_JUMP_SLOT", /* Name. */ |
| 529 | + FALSE, /* Partial Inplace. */ | 733 | + false, /* Partial Inplace. */ |
| 530 | + 0, /* Source Mask. */ | 734 | + 0, /* Source Mask. */ |
| 531 | + 0x0000ffff, /* Dest Mask. */ | 735 | + 0x0000ffff, /* Dest Mask. */ |
| 532 | + TRUE), /* PC relative offset? */ | 736 | + true), /* PC relative offset? */ |
| 533 | + | 737 | + |
| 534 | + /* Table-entry not really used. */ | 738 | + /* Table-entry not really used. */ |
| 535 | + HOWTO (R_MICROBLAZE_GLOB_DAT,/* Type. */ | 739 | + HOWTO (R_MICROBLAZE_GLOB_DAT,/* Type. */ |
| 536 | + 0, /* Rightshift. */ | 740 | + 0, /* Rightshift. */ |
| 537 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 741 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 538 | + 16, /* Bitsize. */ | 742 | + 16, /* Bitsize. */ |
| 539 | + TRUE, /* PC_relative. */ | 743 | + true, /* PC_relative. */ |
| 540 | + 0, /* Bitpos. */ | 744 | + 0, /* Bitpos. */ |
| 541 | + complain_overflow_dont, /* Complain on overflow. */ | 745 | + complain_overflow_dont, /* Complain on overflow. */ |
| 542 | + bfd_elf_generic_reloc,/* Special Function. */ | 746 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 543 | + "R_MICROBLAZE_GLOB_DAT", /* Name. */ | 747 | + "R_MICROBLAZE_GLOB_DAT", /* Name. */ |
| 544 | + FALSE, /* Partial Inplace. */ | 748 | + false, /* Partial Inplace. */ |
| 545 | + 0, /* Source Mask. */ | 749 | + 0, /* Source Mask. */ |
| 546 | + 0x0000ffff, /* Dest Mask. */ | 750 | + 0x0000ffff, /* Dest Mask. */ |
| 547 | + TRUE), /* PC relative offset? */ | 751 | + true), /* PC relative offset? */ |
| 548 | + | 752 | + |
| 549 | + /* A 64 bit GOT relative relocation. Table-entry not really used. */ | 753 | + /* A 64 bit GOT relative relocation. Table-entry not really used. */ |
| 550 | + HOWTO (R_MICROBLAZE_GOTOFF_64, /* Type. */ | 754 | + HOWTO (R_MICROBLAZE_GOTOFF_64, /* Type. */ |
| 551 | + 0, /* Rightshift. */ | 755 | + 0, /* Rightshift. */ |
| 552 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 756 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 553 | + 16, /* Bitsize. */ | 757 | + 16, /* Bitsize. */ |
| 554 | + FALSE, /* PC_relative. */ | 758 | + false, /* PC_relative. */ |
| 555 | + 0, /* Bitpos. */ | 759 | + 0, /* Bitpos. */ |
| 556 | + complain_overflow_dont, /* Complain on overflow. */ | 760 | + complain_overflow_dont, /* Complain on overflow. */ |
| 557 | + bfd_elf_generic_reloc,/* Special Function. */ | 761 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 558 | + "R_MICROBLAZE_GOTOFF_64", /* Name. */ | 762 | + "R_MICROBLAZE_GOTOFF_64", /* Name. */ |
| 559 | + FALSE, /* Partial Inplace. */ | 763 | + false, /* Partial Inplace. */ |
| 560 | + 0, /* Source Mask. */ | 764 | + 0, /* Source Mask. */ |
| 561 | + 0x0000ffff, /* Dest Mask. */ | 765 | + 0x0000ffff, /* Dest Mask. */ |
| 562 | + FALSE), /* PC relative offset? */ | 766 | + false), /* PC relative offset? */ |
| 563 | + | 767 | + |
| 564 | + /* A 32 bit GOT relative relocation. Table-entry not really used. */ | 768 | + /* A 32 bit GOT relative relocation. Table-entry not really used. */ |
| 565 | + HOWTO (R_MICROBLAZE_GOTOFF_32, /* Type. */ | 769 | + HOWTO (R_MICROBLAZE_GOTOFF_32, /* Type. */ |
| 566 | + 0, /* Rightshift. */ | 770 | + 0, /* Rightshift. */ |
| 567 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 771 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 568 | + 16, /* Bitsize. */ | 772 | + 16, /* Bitsize. */ |
| 569 | + FALSE, /* PC_relative. */ | 773 | + false, /* PC_relative. */ |
| 570 | + 0, /* Bitpos. */ | 774 | + 0, /* Bitpos. */ |
| 571 | + complain_overflow_dont, /* Complain on overflow. */ | 775 | + complain_overflow_dont, /* Complain on overflow. */ |
| 572 | + bfd_elf_generic_reloc, /* Special Function. */ | 776 | + bfd_elf_generic_reloc, /* Special Function. */ |
| 573 | + "R_MICROBLAZE_GOTOFF_32", /* Name. */ | 777 | + "R_MICROBLAZE_GOTOFF_32", /* Name. */ |
| 574 | + FALSE, /* Partial Inplace. */ | 778 | + false, /* Partial Inplace. */ |
| 575 | + 0, /* Source Mask. */ | 779 | + 0, /* Source Mask. */ |
| 576 | + 0x0000ffff, /* Dest Mask. */ | 780 | + 0x0000ffff, /* Dest Mask. */ |
| 577 | + FALSE), /* PC relative offset? */ | 781 | + false), /* PC relative offset? */ |
| 578 | + | 782 | + |
| 579 | + /* COPY relocation. Table-entry not really used. */ | 783 | + /* COPY relocation. Table-entry not really used. */ |
| 580 | + HOWTO (R_MICROBLAZE_COPY, /* Type. */ | 784 | + HOWTO (R_MICROBLAZE_COPY, /* Type. */ |
| 581 | + 0, /* Rightshift. */ | 785 | + 0, /* Rightshift. */ |
| 582 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | 786 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 583 | + 16, /* Bitsize. */ | 787 | + 16, /* Bitsize. */ |
| 584 | + FALSE, /* PC_relative. */ | 788 | + false, /* PC_relative. */ |
| 585 | + 0, /* Bitpos. */ | 789 | + 0, /* Bitpos. */ |
| 586 | + complain_overflow_dont, /* Complain on overflow. */ | 790 | + complain_overflow_dont, /* Complain on overflow. */ |
| 587 | + bfd_elf_generic_reloc,/* Special Function. */ | 791 | + bfd_elf_generic_reloc,/* Special Function. */ |
| 588 | + "R_MICROBLAZE_COPY", /* Name. */ | 792 | + "R_MICROBLAZE_COPY", /* Name. */ |
| 589 | + FALSE, /* Partial Inplace. */ | 793 | + false, /* Partial Inplace. */ |
| 590 | + 0, /* Source Mask. */ | 794 | + 0, /* Source Mask. */ |
| 591 | + 0x0000ffff, /* Dest Mask. */ | 795 | + 0x0000ffff, /* Dest Mask. */ |
| 592 | + FALSE), /* PC relative offset? */ | 796 | + false), /* PC relative offset? */ |
| 593 | + | 797 | + |
| 594 | + /* Marker relocs for TLS. */ | 798 | + /* Marker relocs for TLS. */ |
| 595 | + HOWTO (R_MICROBLAZE_TLS, | 799 | + HOWTO (R_MICROBLAZE_TLS, |
| 596 | + 0, /* rightshift */ | 800 | + 0, /* rightshift */ |
| 597 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 801 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 598 | + 32, /* bitsize */ | 802 | + 32, /* bitsize */ |
| 599 | + FALSE, /* pc_relative */ | 803 | + false, /* pc_relative */ |
| 600 | + 0, /* bitpos */ | 804 | + 0, /* bitpos */ |
| 601 | + complain_overflow_dont, /* complain_on_overflow */ | 805 | + complain_overflow_dont, /* complain_on_overflow */ |
| 602 | + bfd_elf_generic_reloc, /* special_function */ | 806 | + bfd_elf_generic_reloc, /* special_function */ |
| 603 | + "R_MICROBLAZE_TLS", /* name */ | 807 | + "R_MICROBLAZE_TLS", /* name */ |
| 604 | + FALSE, /* partial_inplace */ | 808 | + false, /* partial_inplace */ |
| 605 | + 0, /* src_mask */ | 809 | + 0, /* src_mask */ |
| 606 | + 0x0000ffff, /* dst_mask */ | 810 | + 0x0000ffff, /* dst_mask */ |
| 607 | + FALSE), /* pcrel_offset */ | 811 | + false), /* pcrel_offset */ |
| 608 | + | 812 | + |
| 609 | + HOWTO (R_MICROBLAZE_TLSGD, | 813 | + HOWTO (R_MICROBLAZE_TLSGD, |
| 610 | + 0, /* rightshift */ | 814 | + 0, /* rightshift */ |
| 611 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 815 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 612 | + 32, /* bitsize */ | 816 | + 32, /* bitsize */ |
| 613 | + FALSE, /* pc_relative */ | 817 | + false, /* pc_relative */ |
| 614 | + 0, /* bitpos */ | 818 | + 0, /* bitpos */ |
| 615 | + complain_overflow_dont, /* complain_on_overflow */ | 819 | + complain_overflow_dont, /* complain_on_overflow */ |
| 616 | + bfd_elf_generic_reloc, /* special_function */ | 820 | + bfd_elf_generic_reloc, /* special_function */ |
| 617 | + "R_MICROBLAZE_TLSGD", /* name */ | 821 | + "R_MICROBLAZE_TLSGD", /* name */ |
| 618 | + FALSE, /* partial_inplace */ | 822 | + false, /* partial_inplace */ |
| 619 | + 0, /* src_mask */ | 823 | + 0, /* src_mask */ |
| 620 | + 0x0000ffff, /* dst_mask */ | 824 | + 0x0000ffff, /* dst_mask */ |
| 621 | + FALSE), /* pcrel_offset */ | 825 | + false), /* pcrel_offset */ |
| 622 | + | 826 | + |
| 623 | + HOWTO (R_MICROBLAZE_TLSLD, | 827 | + HOWTO (R_MICROBLAZE_TLSLD, |
| 624 | + 0, /* rightshift */ | 828 | + 0, /* rightshift */ |
| 625 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 829 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 626 | + 32, /* bitsize */ | 830 | + 32, /* bitsize */ |
| 627 | + FALSE, /* pc_relative */ | 831 | + false, /* pc_relative */ |
| 628 | + 0, /* bitpos */ | 832 | + 0, /* bitpos */ |
| 629 | + complain_overflow_dont, /* complain_on_overflow */ | 833 | + complain_overflow_dont, /* complain_on_overflow */ |
| 630 | + bfd_elf_generic_reloc, /* special_function */ | 834 | + bfd_elf_generic_reloc, /* special_function */ |
| 631 | + "R_MICROBLAZE_TLSLD", /* name */ | 835 | + "R_MICROBLAZE_TLSLD", /* name */ |
| 632 | + FALSE, /* partial_inplace */ | 836 | + false, /* partial_inplace */ |
| 633 | + 0, /* src_mask */ | 837 | + 0, /* src_mask */ |
| 634 | + 0x0000ffff, /* dst_mask */ | 838 | + 0x0000ffff, /* dst_mask */ |
| 635 | + FALSE), /* pcrel_offset */ | 839 | + false), /* pcrel_offset */ |
| 636 | + | 840 | + |
| 637 | + /* Computes the load module index of the load module that contains the | 841 | + /* Computes the load module index of the load module that contains the |
| 638 | + definition of its TLS sym. */ | 842 | + definition of its TLS sym. */ |
| @@ -640,15 +844,15 @@ index 0000000000..a357388115 | |||
| 640 | + 0, /* rightshift */ | 844 | + 0, /* rightshift */ |
| 641 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 845 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 642 | + 32, /* bitsize */ | 846 | + 32, /* bitsize */ |
| 643 | + FALSE, /* pc_relative */ | 847 | + false, /* pc_relative */ |
| 644 | + 0, /* bitpos */ | 848 | + 0, /* bitpos */ |
| 645 | + complain_overflow_dont, /* complain_on_overflow */ | 849 | + complain_overflow_dont, /* complain_on_overflow */ |
| 646 | + bfd_elf_generic_reloc, /* special_function */ | 850 | + bfd_elf_generic_reloc, /* special_function */ |
| 647 | + "R_MICROBLAZE_TLSDTPMOD32", /* name */ | 851 | + "R_MICROBLAZE_TLSDTPMOD32", /* name */ |
| 648 | + FALSE, /* partial_inplace */ | 852 | + false, /* partial_inplace */ |
| 649 | + 0, /* src_mask */ | 853 | + 0, /* src_mask */ |
| 650 | + 0x0000ffff, /* dst_mask */ | 854 | + 0x0000ffff, /* dst_mask */ |
| 651 | + FALSE), /* pcrel_offset */ | 855 | + false), /* pcrel_offset */ |
| 652 | + | 856 | + |
| 653 | + /* Computes a dtv-relative displacement, the difference between the value | 857 | + /* Computes a dtv-relative displacement, the difference between the value |
| 654 | + of sym+add and the base address of the thread-local storage block that | 858 | + of sym+add and the base address of the thread-local storage block that |
| @@ -657,15 +861,15 @@ index 0000000000..a357388115 | |||
| 657 | + 0, /* rightshift */ | 861 | + 0, /* rightshift */ |
| 658 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 862 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 659 | + 32, /* bitsize */ | 863 | + 32, /* bitsize */ |
| 660 | + FALSE, /* pc_relative */ | 864 | + false, /* pc_relative */ |
| 661 | + 0, /* bitpos */ | 865 | + 0, /* bitpos */ |
| 662 | + complain_overflow_dont, /* complain_on_overflow */ | 866 | + complain_overflow_dont, /* complain_on_overflow */ |
| 663 | + bfd_elf_generic_reloc, /* special_function */ | 867 | + bfd_elf_generic_reloc, /* special_function */ |
| 664 | + "R_MICROBLAZE_TLSDTPREL32", /* name */ | 868 | + "R_MICROBLAZE_TLSDTPREL32", /* name */ |
| 665 | + FALSE, /* partial_inplace */ | 869 | + false, /* partial_inplace */ |
| 666 | + 0, /* src_mask */ | 870 | + 0, /* src_mask */ |
| 667 | + 0x0000ffff, /* dst_mask */ | 871 | + 0x0000ffff, /* dst_mask */ |
| 668 | + FALSE), /* pcrel_offset */ | 872 | + false), /* pcrel_offset */ |
| 669 | + | 873 | + |
| 670 | + /* Computes a dtv-relative displacement, the difference between the value | 874 | + /* Computes a dtv-relative displacement, the difference between the value |
| 671 | + of sym+add and the base address of the thread-local storage block that | 875 | + of sym+add and the base address of the thread-local storage block that |
| @@ -674,15 +878,15 @@ index 0000000000..a357388115 | |||
| 674 | + 0, /* rightshift */ | 878 | + 0, /* rightshift */ |
| 675 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 879 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 676 | + 32, /* bitsize */ | 880 | + 32, /* bitsize */ |
| 677 | + FALSE, /* pc_relative */ | 881 | + false, /* pc_relative */ |
| 678 | + 0, /* bitpos */ | 882 | + 0, /* bitpos */ |
| 679 | + complain_overflow_dont, /* complain_on_overflow */ | 883 | + complain_overflow_dont, /* complain_on_overflow */ |
| 680 | + bfd_elf_generic_reloc, /* special_function */ | 884 | + bfd_elf_generic_reloc, /* special_function */ |
| 681 | + "R_MICROBLAZE_TLSDTPREL64", /* name */ | 885 | + "R_MICROBLAZE_TLSDTPREL64", /* name */ |
| 682 | + FALSE, /* partial_inplace */ | 886 | + false, /* partial_inplace */ |
| 683 | + 0, /* src_mask */ | 887 | + 0, /* src_mask */ |
| 684 | + 0x0000ffff, /* dst_mask */ | 888 | + 0x0000ffff, /* dst_mask */ |
| 685 | + FALSE), /* pcrel_offset */ | 889 | + false), /* pcrel_offset */ |
| 686 | + | 890 | + |
| 687 | + /* Computes a tp-relative displacement, the difference between the value of | 891 | + /* Computes a tp-relative displacement, the difference between the value of |
| 688 | + sym+add and the value of the thread pointer (r13). */ | 892 | + sym+add and the value of the thread pointer (r13). */ |
| @@ -690,15 +894,15 @@ index 0000000000..a357388115 | |||
| 690 | + 0, /* rightshift */ | 894 | + 0, /* rightshift */ |
| 691 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 895 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 692 | + 32, /* bitsize */ | 896 | + 32, /* bitsize */ |
| 693 | + FALSE, /* pc_relative */ | 897 | + false, /* pc_relative */ |
| 694 | + 0, /* bitpos */ | 898 | + 0, /* bitpos */ |
| 695 | + complain_overflow_dont, /* complain_on_overflow */ | 899 | + complain_overflow_dont, /* complain_on_overflow */ |
| 696 | + bfd_elf_generic_reloc, /* special_function */ | 900 | + bfd_elf_generic_reloc, /* special_function */ |
| 697 | + "R_MICROBLAZE_TLSGOTTPREL32", /* name */ | 901 | + "R_MICROBLAZE_TLSGOTTPREL32", /* name */ |
| 698 | + FALSE, /* partial_inplace */ | 902 | + false, /* partial_inplace */ |
| 699 | + 0, /* src_mask */ | 903 | + 0, /* src_mask */ |
| 700 | + 0x0000ffff, /* dst_mask */ | 904 | + 0x0000ffff, /* dst_mask */ |
| 701 | + FALSE), /* pcrel_offset */ | 905 | + false), /* pcrel_offset */ |
| 702 | + | 906 | + |
| 703 | + /* Computes a tp-relative displacement, the difference between the value of | 907 | + /* Computes a tp-relative displacement, the difference between the value of |
| 704 | + sym+add and the value of the thread pointer (r13). */ | 908 | + sym+add and the value of the thread pointer (r13). */ |
| @@ -706,15 +910,15 @@ index 0000000000..a357388115 | |||
| 706 | + 0, /* rightshift */ | 910 | + 0, /* rightshift */ |
| 707 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ | 911 | + 2, /* size (0 = byte, 1 = short, 2 = long) */ |
| 708 | + 32, /* bitsize */ | 912 | + 32, /* bitsize */ |
| 709 | + FALSE, /* pc_relative */ | 913 | + false, /* pc_relative */ |
| 710 | + 0, /* bitpos */ | 914 | + 0, /* bitpos */ |
| 711 | + complain_overflow_dont, /* complain_on_overflow */ | 915 | + complain_overflow_dont, /* complain_on_overflow */ |
| 712 | + bfd_elf_generic_reloc, /* special_function */ | 916 | + bfd_elf_generic_reloc, /* special_function */ |
| 713 | + "R_MICROBLAZE_TLSTPREL32", /* name */ | 917 | + "R_MICROBLAZE_TLSTPREL32", /* name */ |
| 714 | + FALSE, /* partial_inplace */ | 918 | + false, /* partial_inplace */ |
| 715 | + 0, /* src_mask */ | 919 | + 0, /* src_mask */ |
| 716 | + 0x0000ffff, /* dst_mask */ | 920 | + 0x0000ffff, /* dst_mask */ |
| 717 | + FALSE), /* pcrel_offset */ | 921 | + false), /* pcrel_offset */ |
| 718 | + | 922 | + |
| 719 | +}; | 923 | +}; |
| 720 | + | 924 | + |
| @@ -795,12 +999,24 @@ index 0000000000..a357388115 | |||
| 795 | + case BFD_RELOC_VTABLE_ENTRY: | 999 | + case BFD_RELOC_VTABLE_ENTRY: |
| 796 | + microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; | 1000 | + microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; |
| 797 | + break; | 1001 | + break; |
| 1002 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 1003 | + microblaze_reloc = R_MICROBLAZE_IMML_64; | ||
| 1004 | + break; | ||
| 798 | + case BFD_RELOC_MICROBLAZE_64_GOTPC: | 1005 | + case BFD_RELOC_MICROBLAZE_64_GOTPC: |
| 799 | + microblaze_reloc = R_MICROBLAZE_GOTPC_64; | 1006 | + microblaze_reloc = R_MICROBLAZE_GOTPC_64; |
| 800 | + break; | 1007 | + break; |
| 1008 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 1009 | + microblaze_reloc = R_MICROBLAZE_GPC_64; | ||
| 1010 | + break; | ||
| 801 | + case BFD_RELOC_MICROBLAZE_64_GOT: | 1011 | + case BFD_RELOC_MICROBLAZE_64_GOT: |
| 802 | + microblaze_reloc = R_MICROBLAZE_GOT_64; | 1012 | + microblaze_reloc = R_MICROBLAZE_GOT_64; |
| 803 | + break; | 1013 | + break; |
| 1014 | + case BFD_RELOC_MICROBLAZE_64_TEXTPCREL: | ||
| 1015 | + microblaze_reloc = R_MICROBLAZE_TEXTPCREL_64; | ||
| 1016 | + break; | ||
| 1017 | + case BFD_RELOC_MICROBLAZE_64_TEXTREL: | ||
| 1018 | + microblaze_reloc = R_MICROBLAZE_TEXTREL_64; | ||
| 1019 | + break; | ||
| 804 | + case BFD_RELOC_MICROBLAZE_64_PLT: | 1020 | + case BFD_RELOC_MICROBLAZE_64_PLT: |
| 805 | + microblaze_reloc = R_MICROBLAZE_PLT_64; | 1021 | + microblaze_reloc = R_MICROBLAZE_PLT_64; |
| 806 | + break; | 1022 | + break; |
| @@ -861,7 +1077,7 @@ index 0000000000..a357388115 | |||
| 861 | + | 1077 | + |
| 862 | +/* Set the howto pointer for a RCE ELF reloc. */ | 1078 | +/* Set the howto pointer for a RCE ELF reloc. */ |
| 863 | + | 1079 | + |
| 864 | +static bfd_boolean | 1080 | +static bool |
| 865 | +microblaze_elf_info_to_howto (bfd * abfd, | 1081 | +microblaze_elf_info_to_howto (bfd * abfd, |
| 866 | + arelent * cache_ptr, | 1082 | + arelent * cache_ptr, |
| 867 | + Elf_Internal_Rela * dst) | 1083 | + Elf_Internal_Rela * dst) |
| @@ -879,58 +1095,35 @@ index 0000000000..a357388115 | |||
| 879 | + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), | 1095 | + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), |
| 880 | + abfd, r_type); | 1096 | + abfd, r_type); |
| 881 | + bfd_set_error (bfd_error_bad_value); | 1097 | + bfd_set_error (bfd_error_bad_value); |
| 882 | + return FALSE; | 1098 | + return false; |
| 883 | + } | 1099 | + } |
| 884 | + | 1100 | + |
| 885 | + cache_ptr->howto = microblaze_elf_howto_table [r_type]; | 1101 | + cache_ptr->howto = microblaze_elf_howto_table [r_type]; |
| 886 | + return TRUE; | 1102 | + return true; |
| 887 | +} | 1103 | +} |
| 888 | + | 1104 | + |
| 889 | +/* Microblaze ELF local labels start with 'L.' or '$L', not '.L'. */ | 1105 | +/* Microblaze ELF local labels start with 'L.' or '$L', not '.L'. */ |
| 890 | + | 1106 | + |
| 891 | +static bfd_boolean | 1107 | +static bool |
| 892 | +microblaze_elf_is_local_label_name (bfd *abfd, const char *name) | 1108 | +microblaze_elf_is_local_label_name (bfd *abfd, const char *name) |
| 893 | +{ | 1109 | +{ |
| 894 | + if (name[0] == 'L' && name[1] == '.') | 1110 | + if (name[0] == 'L' && name[1] == '.') |
| 895 | + return TRUE; | 1111 | + return true; |
| 896 | + | 1112 | + |
| 897 | + if (name[0] == '$' && name[1] == 'L') | 1113 | + if (name[0] == '$' && name[1] == 'L') |
| 898 | + return TRUE; | 1114 | + return true; |
| 899 | + | 1115 | + |
| 900 | + /* With gcc, the labels go back to starting with '.', so we accept | 1116 | + /* With gcc, the labels go back to starting with '.', so we accept |
| 901 | + the generic ELF local label syntax as well. */ | 1117 | + the generic ELF local label syntax as well. */ |
| 902 | + return _bfd_elf_is_local_label_name (abfd, name); | 1118 | + return _bfd_elf_is_local_label_name (abfd, name); |
| 903 | +} | 1119 | +} |
| 904 | + | 1120 | + |
| 905 | +/* The microblaze linker (like many others) needs to keep track of | ||
| 906 | + the number of relocs that it decides to copy as dynamic relocs in | ||
| 907 | + check_relocs for each symbol. This is so that it can later discard | ||
| 908 | + them if they are found to be unnecessary. We store the information | ||
| 909 | + in a field extending the regular ELF linker hash table. */ | ||
| 910 | + | ||
| 911 | +struct elf64_mb_dyn_relocs | ||
| 912 | +{ | ||
| 913 | + struct elf64_mb_dyn_relocs *next; | ||
| 914 | + | ||
| 915 | + /* The input section of the reloc. */ | ||
| 916 | + asection *sec; | ||
| 917 | + | ||
| 918 | + /* Total number of relocs copied for the input section. */ | ||
| 919 | + bfd_size_type count; | ||
| 920 | + | ||
| 921 | + /* Number of pc-relative relocs copied for the input section. */ | ||
| 922 | + bfd_size_type pc_count; | ||
| 923 | +}; | ||
| 924 | + | ||
| 925 | +/* ELF linker hash entry. */ | 1121 | +/* ELF linker hash entry. */ |
| 926 | + | 1122 | + |
| 927 | +struct elf64_mb_link_hash_entry | 1123 | +struct elf64_mb_link_hash_entry |
| 928 | +{ | 1124 | +{ |
| 929 | + struct elf_link_hash_entry elf; | 1125 | + struct elf_link_hash_entry elf; |
| 930 | + | 1126 | + |
| 931 | + /* Track dynamic relocs copied for this symbol. */ | ||
| 932 | + struct elf64_mb_dyn_relocs *dyn_relocs; | ||
| 933 | + | ||
| 934 | + /* TLS Reference Types for the symbol; Updated by check_relocs */ | 1127 | + /* TLS Reference Types for the symbol; Updated by check_relocs */ |
| 935 | +#define TLS_GD 1 /* GD reloc. */ | 1128 | +#define TLS_GD 1 /* GD reloc. */ |
| 936 | +#define TLS_LD 2 /* LD reloc. */ | 1129 | +#define TLS_LD 2 /* LD reloc. */ |
| @@ -954,18 +1147,6 @@ index 0000000000..a357388115 | |||
| 954 | +{ | 1147 | +{ |
| 955 | + struct elf_link_hash_table elf; | 1148 | + struct elf_link_hash_table elf; |
| 956 | + | 1149 | + |
| 957 | + /* Short-cuts to get to dynamic linker sections. */ | ||
| 958 | + asection *sgot; | ||
| 959 | + asection *sgotplt; | ||
| 960 | + asection *srelgot; | ||
| 961 | + asection *splt; | ||
| 962 | + asection *srelplt; | ||
| 963 | + asection *sdynbss; | ||
| 964 | + asection *srelbss; | ||
| 965 | + | ||
| 966 | + /* Small local sym to section mapping cache. */ | ||
| 967 | + struct sym_cache sym_sec; | ||
| 968 | + | ||
| 969 | + /* TLS Local Dynamic GOT Entry */ | 1150 | + /* TLS Local Dynamic GOT Entry */ |
| 970 | + union { | 1151 | + union { |
| 971 | + bfd_signed_vma refcount; | 1152 | + bfd_signed_vma refcount; |
| @@ -978,9 +1159,10 @@ index 0000000000..a357388115 | |||
| 978 | + | 1159 | + |
| 979 | +/* Get the ELF linker hash table from a link_info structure. */ | 1160 | +/* Get the ELF linker hash table from a link_info structure. */ |
| 980 | + | 1161 | + |
| 981 | +#define elf64_mb_hash_table(p) \ | 1162 | +#define elf64_mb_hash_table(p) \ |
| 982 | + (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \ | 1163 | + ((is_elf_hash_table ((p)->hash) \ |
| 983 | + == MICROBLAZE_ELF_DATA ? ((struct elf64_mb_link_hash_table *) ((p)->hash)) : NULL) | 1164 | + && elf_hash_table_id (elf_hash_table (p)) == MICROBLAZE_ELF_DATA) \ |
| 1165 | + ? (struct elf64_mb_link_hash_table *) (p)->hash : NULL) | ||
| 984 | + | 1166 | + |
| 985 | +/* Create an entry in a microblaze ELF linker hash table. */ | 1167 | +/* Create an entry in a microblaze ELF linker hash table. */ |
| 986 | + | 1168 | + |
| @@ -1042,14 +1224,14 @@ index 0000000000..a357388115 | |||
| 1042 | +{ | 1224 | +{ |
| 1043 | + struct bfd_link_hash_entry *h; | 1225 | + struct bfd_link_hash_entry *h; |
| 1044 | + | 1226 | + |
| 1045 | + h = bfd_link_hash_lookup (info->hash, RO_SDA_ANCHOR_NAME, FALSE, FALSE, TRUE); | 1227 | + h = bfd_link_hash_lookup (info->hash, RO_SDA_ANCHOR_NAME, false, false, true); |
| 1046 | + if (h != (struct bfd_link_hash_entry *) NULL | 1228 | + if (h != (struct bfd_link_hash_entry *) NULL |
| 1047 | + && h->type == bfd_link_hash_defined) | 1229 | + && h->type == bfd_link_hash_defined) |
| 1048 | + ro_small_data_pointer = (h->u.def.value | 1230 | + ro_small_data_pointer = (h->u.def.value |
| 1049 | + + h->u.def.section->output_section->vma | 1231 | + + h->u.def.section->output_section->vma |
| 1050 | + + h->u.def.section->output_offset); | 1232 | + + h->u.def.section->output_offset); |
| 1051 | + | 1233 | + |
| 1052 | + h = bfd_link_hash_lookup (info->hash, RW_SDA_ANCHOR_NAME, FALSE, FALSE, TRUE); | 1234 | + h = bfd_link_hash_lookup (info->hash, RW_SDA_ANCHOR_NAME, false, false, true); |
| 1053 | + if (h != (struct bfd_link_hash_entry *) NULL | 1235 | + if (h != (struct bfd_link_hash_entry *) NULL |
| 1054 | + && h->type == bfd_link_hash_defined) | 1236 | + && h->type == bfd_link_hash_defined) |
| 1055 | + rw_small_data_pointer = (h->u.def.value | 1237 | + rw_small_data_pointer = (h->u.def.value |
| @@ -1125,7 +1307,7 @@ index 0000000000..a357388115 | |||
| 1125 | + section, which means that the addend must be adjusted | 1307 | + section, which means that the addend must be adjusted |
| 1126 | + accordingly. */ | 1308 | + accordingly. */ |
| 1127 | + | 1309 | + |
| 1128 | +static bfd_boolean | 1310 | +static int |
| 1129 | +microblaze_elf_relocate_section (bfd *output_bfd, | 1311 | +microblaze_elf_relocate_section (bfd *output_bfd, |
| 1130 | + struct bfd_link_info *info, | 1312 | + struct bfd_link_info *info, |
| 1131 | + bfd *input_bfd, | 1313 | + bfd *input_bfd, |
| @@ -1141,7 +1323,7 @@ index 0000000000..a357388115 | |||
| 1141 | + Elf_Internal_Rela *rel, *relend; | 1323 | + Elf_Internal_Rela *rel, *relend; |
| 1142 | + int endian = (bfd_little_endian (output_bfd)) ? 0 : 2; | 1324 | + int endian = (bfd_little_endian (output_bfd)) ? 0 : 2; |
| 1143 | + /* Assume success. */ | 1325 | + /* Assume success. */ |
| 1144 | + bfd_boolean ret = TRUE; | 1326 | + bool ret = true; |
| 1145 | + asection *sreloc; | 1327 | + asection *sreloc; |
| 1146 | + bfd_vma *local_got_offsets; | 1328 | + bfd_vma *local_got_offsets; |
| 1147 | + unsigned int tls_type; | 1329 | + unsigned int tls_type; |
| @@ -1151,7 +1333,7 @@ index 0000000000..a357388115 | |||
| 1151 | + | 1333 | + |
| 1152 | + htab = elf64_mb_hash_table (info); | 1334 | + htab = elf64_mb_hash_table (info); |
| 1153 | + if (htab == NULL) | 1335 | + if (htab == NULL) |
| 1154 | + return FALSE; | 1336 | + return false; |
| 1155 | + | 1337 | + |
| 1156 | + local_got_offsets = elf_local_got_offsets (input_bfd); | 1338 | + local_got_offsets = elf_local_got_offsets (input_bfd); |
| 1157 | + | 1339 | + |
| @@ -1172,7 +1354,7 @@ index 0000000000..a357388115 | |||
| 1172 | + const char *sym_name; | 1354 | + const char *sym_name; |
| 1173 | + bfd_reloc_status_type r = bfd_reloc_ok; | 1355 | + bfd_reloc_status_type r = bfd_reloc_ok; |
| 1174 | + const char *errmsg = NULL; | 1356 | + const char *errmsg = NULL; |
| 1175 | + bfd_boolean unresolved_reloc = FALSE; | 1357 | + bool unresolved_reloc = false; |
| 1176 | + | 1358 | + |
| 1177 | + h = NULL; | 1359 | + h = NULL; |
| 1178 | + r_type = ELF64_R_TYPE (rel->r_info); | 1360 | + r_type = ELF64_R_TYPE (rel->r_info); |
| @@ -1180,10 +1362,11 @@ index 0000000000..a357388115 | |||
| 1180 | + | 1362 | + |
| 1181 | + if (r_type < 0 || r_type >= (int) R_MICROBLAZE_max) | 1363 | + if (r_type < 0 || r_type >= (int) R_MICROBLAZE_max) |
| 1182 | + { | 1364 | + { |
| 1183 | + (*_bfd_error_handler) (_("%s: unknown relocation type %d"), | 1365 | + /* xgettext:c-format */ |
| 1184 | + bfd_get_filename (input_bfd), (int) r_type); | 1366 | + _bfd_error_handler (_("%pB: unsupported relocation type %#x"), |
| 1367 | + input_bfd, (int) r_type); | ||
| 1185 | + bfd_set_error (bfd_error_bad_value); | 1368 | + bfd_set_error (bfd_error_bad_value); |
| 1186 | + ret = FALSE; | 1369 | + ret = false; |
| 1187 | + continue; | 1370 | + continue; |
| 1188 | + } | 1371 | + } |
| 1189 | + | 1372 | + |
| @@ -1233,12 +1416,12 @@ index 0000000000..a357388115 | |||
| 1233 | + else | 1416 | + else |
| 1234 | + { | 1417 | + { |
| 1235 | + bfd_vma relocation; | 1418 | + bfd_vma relocation; |
| 1236 | + bfd_boolean resolved_to_zero; | 1419 | + bool resolved_to_zero; |
| 1237 | + | 1420 | + |
| 1238 | + /* This is a final link. */ | 1421 | + /* This is a final link. */ |
| 1239 | + sym = NULL; | 1422 | + sym = NULL; |
| 1240 | + sec = NULL; | 1423 | + sec = NULL; |
| 1241 | + unresolved_reloc = FALSE; | 1424 | + unresolved_reloc = false; |
| 1242 | + | 1425 | + |
| 1243 | + if (r_symndx < symtab_hdr->sh_info) | 1426 | + if (r_symndx < symtab_hdr->sh_info) |
| 1244 | + { | 1427 | + { |
| @@ -1256,8 +1439,8 @@ index 0000000000..a357388115 | |||
| 1256 | + else | 1439 | + else |
| 1257 | + { | 1440 | + { |
| 1258 | + /* External symbol. */ | 1441 | + /* External symbol. */ |
| 1259 | + bfd_boolean warned ATTRIBUTE_UNUSED; | 1442 | + bool warned ATTRIBUTE_UNUSED; |
| 1260 | + bfd_boolean ignored ATTRIBUTE_UNUSED; | 1443 | + bool ignored ATTRIBUTE_UNUSED; |
| 1261 | + | 1444 | + |
| 1262 | + RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, | 1445 | + RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel, |
| 1263 | + r_symndx, symtab_hdr, sym_hashes, | 1446 | + r_symndx, symtab_hdr, sym_hashes, |
| @@ -1294,7 +1477,7 @@ index 0000000000..a357388115 | |||
| 1294 | + microblaze_elf_final_sdp (info); | 1477 | + microblaze_elf_final_sdp (info); |
| 1295 | + if (ro_small_data_pointer == 0) | 1478 | + if (ro_small_data_pointer == 0) |
| 1296 | + { | 1479 | + { |
| 1297 | + ret = FALSE; | 1480 | + ret = false; |
| 1298 | + r = bfd_reloc_undefined; | 1481 | + r = bfd_reloc_undefined; |
| 1299 | + goto check_reloc; | 1482 | + goto check_reloc; |
| 1300 | + } | 1483 | + } |
| @@ -1319,7 +1502,7 @@ index 0000000000..a357388115 | |||
| 1319 | + microblaze_elf_howto_table[(int) r_type]->name, | 1502 | + microblaze_elf_howto_table[(int) r_type]->name, |
| 1320 | + sec); | 1503 | + sec); |
| 1321 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ | 1504 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ |
| 1322 | + ret = FALSE; | 1505 | + ret = false; |
| 1323 | + continue; | 1506 | + continue; |
| 1324 | + } | 1507 | + } |
| 1325 | + } | 1508 | + } |
| @@ -1342,7 +1525,7 @@ index 0000000000..a357388115 | |||
| 1342 | + microblaze_elf_final_sdp (info); | 1525 | + microblaze_elf_final_sdp (info); |
| 1343 | + if (rw_small_data_pointer == 0) | 1526 | + if (rw_small_data_pointer == 0) |
| 1344 | + { | 1527 | + { |
| 1345 | + ret = FALSE; | 1528 | + ret = false; |
| 1346 | + r = bfd_reloc_undefined; | 1529 | + r = bfd_reloc_undefined; |
| 1347 | + goto check_reloc; | 1530 | + goto check_reloc; |
| 1348 | + } | 1531 | + } |
| @@ -1367,7 +1550,7 @@ index 0000000000..a357388115 | |||
| 1367 | + microblaze_elf_howto_table[(int) r_type]->name, | 1550 | + microblaze_elf_howto_table[(int) r_type]->name, |
| 1368 | + sec); | 1551 | + sec); |
| 1369 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ | 1552 | + /*bfd_set_error (bfd_error_bad_value); ??? why? */ |
| 1370 | + ret = FALSE; | 1553 | + ret = false; |
| 1371 | + continue; | 1554 | + continue; |
| 1372 | + } | 1555 | + } |
| 1373 | + } | 1556 | + } |
| @@ -1378,8 +1561,20 @@ index 0000000000..a357388115 | |||
| 1378 | + break; /* Do nothing. */ | 1561 | + break; /* Do nothing. */ |
| 1379 | + | 1562 | + |
| 1380 | + case (int) R_MICROBLAZE_GOTPC_64: | 1563 | + case (int) R_MICROBLAZE_GOTPC_64: |
| 1381 | + relocation = htab->sgotplt->output_section->vma | 1564 | + relocation = (htab->elf.sgotplt->output_section->vma |
| 1382 | + + htab->sgotplt->output_offset; | 1565 | + + htab->elf.sgotplt->output_offset); |
| 1566 | + relocation -= (input_section->output_section->vma | ||
| 1567 | + + input_section->output_offset | ||
| 1568 | + + offset + INST_WORD_SIZE); | ||
| 1569 | + relocation += addend; | ||
| 1570 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 1571 | + contents + offset + endian); | ||
| 1572 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 1573 | + contents + offset + endian + INST_WORD_SIZE); | ||
| 1574 | + break; | ||
| 1575 | + | ||
| 1576 | + case (int) R_MICROBLAZE_TEXTPCREL_64: | ||
| 1577 | + relocation = input_section->output_section->vma; | ||
| 1383 | + relocation -= (input_section->output_section->vma | 1578 | + relocation -= (input_section->output_section->vma |
| 1384 | + + input_section->output_offset | 1579 | + + input_section->output_offset |
| 1385 | + + offset + INST_WORD_SIZE); | 1580 | + + offset + INST_WORD_SIZE); |
| @@ -1393,13 +1588,13 @@ index 0000000000..a357388115 | |||
| 1393 | + case (int) R_MICROBLAZE_PLT_64: | 1588 | + case (int) R_MICROBLAZE_PLT_64: |
| 1394 | + { | 1589 | + { |
| 1395 | + bfd_vma immediate; | 1590 | + bfd_vma immediate; |
| 1396 | + if (htab->splt != NULL && h != NULL | 1591 | + if (htab->elf.splt != NULL && h != NULL |
| 1397 | + && h->plt.offset != (bfd_vma) -1) | 1592 | + && h->plt.offset != (bfd_vma) -1) |
| 1398 | + { | 1593 | + { |
| 1399 | + relocation = (htab->splt->output_section->vma | 1594 | + relocation = (htab->elf.splt->output_section->vma |
| 1400 | + + htab->splt->output_offset | 1595 | + + htab->elf.splt->output_offset |
| 1401 | + + h->plt.offset); | 1596 | + + h->plt.offset); |
| 1402 | + unresolved_reloc = FALSE; | 1597 | + unresolved_reloc = false; |
| 1403 | + immediate = relocation - (input_section->output_section->vma | 1598 | + immediate = relocation - (input_section->output_section->vma |
| 1404 | + + input_section->output_offset | 1599 | + + input_section->output_offset |
| 1405 | + + offset + INST_WORD_SIZE); | 1600 | + + offset + INST_WORD_SIZE); |
| @@ -1435,8 +1630,8 @@ index 0000000000..a357388115 | |||
| 1435 | + unsigned long indx; | 1630 | + unsigned long indx; |
| 1436 | + bfd_vma static_value; | 1631 | + bfd_vma static_value; |
| 1437 | + | 1632 | + |
| 1438 | + bfd_boolean need_relocs = FALSE; | 1633 | + bool need_relocs = false; |
| 1439 | + if (htab->sgot == NULL) | 1634 | + if (htab->elf.sgot == NULL) |
| 1440 | + abort (); | 1635 | + abort (); |
| 1441 | + | 1636 | + |
| 1442 | + indx = 0; | 1637 | + indx = 0; |
| @@ -1452,8 +1647,9 @@ index 0000000000..a357388115 | |||
| 1452 | + offp = &htab->tlsld_got.offset; | 1647 | + offp = &htab->tlsld_got.offset; |
| 1453 | + else if (h != NULL) | 1648 | + else if (h != NULL) |
| 1454 | + { | 1649 | + { |
| 1455 | + if (htab->sgotplt != NULL && h->got.offset != (bfd_vma) -1) | 1650 | + if (htab->elf.sgotplt != NULL |
| 1456 | + offp = &h->got.offset; | 1651 | + && h->got.offset != (bfd_vma) -1) |
| 1652 | + offp = &h->got.offset; | ||
| 1457 | + else | 1653 | + else |
| 1458 | + abort (); | 1654 | + abort (); |
| 1459 | + } | 1655 | + } |
| @@ -1476,7 +1672,7 @@ index 0000000000..a357388115 | |||
| 1476 | + /* Symbol index to use for relocs */ | 1672 | + /* Symbol index to use for relocs */ |
| 1477 | + if (h != NULL) | 1673 | + if (h != NULL) |
| 1478 | + { | 1674 | + { |
| 1479 | + bfd_boolean dyn = | 1675 | + bool dyn = |
| 1480 | + elf_hash_table (info)->dynamic_sections_created; | 1676 | + elf_hash_table (info)->dynamic_sections_created; |
| 1481 | + | 1677 | + |
| 1482 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, | 1678 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, |
| @@ -1493,7 +1689,7 @@ index 0000000000..a357388115 | |||
| 1493 | + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT | 1689 | + || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT |
| 1494 | + && !resolved_to_zero) | 1690 | + && !resolved_to_zero) |
| 1495 | + || h->root.type != bfd_link_hash_undefweak)) | 1691 | + || h->root.type != bfd_link_hash_undefweak)) |
| 1496 | + need_relocs = TRUE; | 1692 | + need_relocs = true; |
| 1497 | + | 1693 | + |
| 1498 | + /* 2. Compute/Emit Static value of r-expression */ | 1694 | + /* 2. Compute/Emit Static value of r-expression */ |
| 1499 | + static_value = relocation + addend; | 1695 | + static_value = relocation + addend; |
| @@ -1503,53 +1699,51 @@ index 0000000000..a357388115 | |||
| 1503 | + { | 1699 | + { |
| 1504 | + bfd_vma got_offset; | 1700 | + bfd_vma got_offset; |
| 1505 | + | 1701 | + |
| 1506 | + got_offset = (htab->sgot->output_section->vma | 1702 | + got_offset = (htab->elf.sgot->output_section->vma |
| 1507 | + + htab->sgot->output_offset | 1703 | + + htab->elf.sgot->output_offset |
| 1508 | + + off); | 1704 | + + off); |
| 1509 | + | 1705 | + |
| 1510 | + /* Process module-id */ | 1706 | + /* Process module-id */ |
| 1511 | + if (IS_TLS_LD(tls_type)) | 1707 | + if (IS_TLS_LD(tls_type)) |
| 1512 | + { | 1708 | + { |
| 1513 | + if (! bfd_link_pic (info)) | 1709 | + if (! bfd_link_pic (info)) |
| 1514 | + { | 1710 | + bfd_put_32 (output_bfd, 1, |
| 1515 | + bfd_put_32 (output_bfd, 1, htab->sgot->contents + off); | 1711 | + htab->elf.sgot->contents + off); |
| 1516 | + } | ||
| 1517 | + else | 1712 | + else |
| 1518 | + { | 1713 | + microblaze_elf_output_dynamic_relocation |
| 1519 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 1714 | + (output_bfd, |
| 1520 | + htab->srelgot, htab->srelgot->reloc_count++, | 1715 | + htab->elf.srelgot, |
| 1521 | + /* symindex= */ 0, R_MICROBLAZE_TLSDTPMOD32, | 1716 | + htab->elf.srelgot->reloc_count++, |
| 1522 | + got_offset, 0); | 1717 | + /* symindex= */ 0, R_MICROBLAZE_TLSDTPMOD32, |
| 1523 | + } | 1718 | + got_offset, 0); |
| 1524 | + } | 1719 | + } |
| 1525 | + else if (IS_TLS_GD(tls_type)) | 1720 | + else if (IS_TLS_GD(tls_type)) |
| 1526 | + { | 1721 | + { |
| 1527 | + if (! need_relocs) | 1722 | + if (! need_relocs) |
| 1528 | + { | 1723 | + bfd_put_32 (output_bfd, 1, |
| 1529 | + bfd_put_32 (output_bfd, 1, htab->sgot->contents + off); | 1724 | + htab->elf.sgot->contents + off); |
| 1530 | + } | 1725 | + else |
| 1531 | + else | 1726 | + microblaze_elf_output_dynamic_relocation |
| 1532 | + { | 1727 | + (output_bfd, |
| 1533 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 1728 | + htab->elf.srelgot, |
| 1534 | + htab->srelgot, | 1729 | + htab->elf.srelgot->reloc_count++, |
| 1535 | + htab->srelgot->reloc_count++, | 1730 | + /* symindex= */ indx, R_MICROBLAZE_TLSDTPMOD32, |
| 1536 | + /* symindex= */ indx, R_MICROBLAZE_TLSDTPMOD32, | 1731 | + got_offset, indx ? 0 : static_value); |
| 1537 | + got_offset, indx ? 0 : static_value); | ||
| 1538 | + } | ||
| 1539 | + } | 1732 | + } |
| 1540 | + | 1733 | + |
| 1541 | + /* Process Offset */ | 1734 | + /* Process Offset */ |
| 1542 | + if (htab->srelgot == NULL) | 1735 | + if (htab->elf.srelgot == NULL) |
| 1543 | + abort (); | 1736 | + abort (); |
| 1544 | + | 1737 | + |
| 1545 | + got_offset = (htab->sgot->output_section->vma | 1738 | + got_offset = (htab->elf.sgot->output_section->vma |
| 1546 | + + htab->sgot->output_offset | 1739 | + + htab->elf.sgot->output_offset |
| 1547 | + + off2); | 1740 | + + off2); |
| 1548 | + if (IS_TLS_LD(tls_type)) | 1741 | + if (IS_TLS_LD(tls_type)) |
| 1549 | + { | 1742 | + { |
| 1550 | + /* For LD, offset should be 0 */ | 1743 | + /* For LD, offset should be 0 */ |
| 1551 | + *offp |= 1; | 1744 | + *offp |= 1; |
| 1552 | + bfd_put_32 (output_bfd, 0, htab->sgot->contents + off2); | 1745 | + bfd_put_32 (output_bfd, 0, |
| 1746 | + htab->elf.sgot->contents + off2); | ||
| 1553 | + } | 1747 | + } |
| 1554 | + else if (IS_TLS_GD(tls_type)) | 1748 | + else if (IS_TLS_GD(tls_type)) |
| 1555 | + { | 1749 | + { |
| @@ -1601,7 +1795,7 @@ index 0000000000..a357388115 | |||
| 1601 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 1795 | + bfd_put_16 (input_bfd, relocation & 0xffff, |
| 1602 | + contents + offset + endian + INST_WORD_SIZE); | 1796 | + contents + offset + endian + INST_WORD_SIZE); |
| 1603 | + | 1797 | + |
| 1604 | + unresolved_reloc = FALSE; | 1798 | + unresolved_reloc = false; |
| 1605 | + break; | 1799 | + break; |
| 1606 | + } | 1800 | + } |
| 1607 | + | 1801 | + |
| @@ -1617,7 +1811,8 @@ index 0000000000..a357388115 | |||
| 1617 | + lo = immediate & 0x0000ffff; | 1811 | + lo = immediate & 0x0000ffff; |
| 1618 | + high = (immediate >> 16) & 0x0000ffff; | 1812 | + high = (immediate >> 16) & 0x0000ffff; |
| 1619 | + bfd_put_16 (input_bfd, high, contents + offset + endian); | 1813 | + bfd_put_16 (input_bfd, high, contents + offset + endian); |
| 1620 | + bfd_put_16 (input_bfd, lo, contents + offset + INST_WORD_SIZE + endian); | 1814 | + bfd_put_16 (input_bfd, lo, |
| 1815 | + contents + offset + INST_WORD_SIZE + endian); | ||
| 1621 | + break; | 1816 | + break; |
| 1622 | + } | 1817 | + } |
| 1623 | + | 1818 | + |
| @@ -1639,6 +1834,8 @@ index 0000000000..a357388115 | |||
| 1639 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 1834 | + bfd_put_16 (input_bfd, relocation & 0xffff, |
| 1640 | + contents + offset + endian + INST_WORD_SIZE); | 1835 | + contents + offset + endian + INST_WORD_SIZE); |
| 1641 | + break; | 1836 | + break; |
| 1837 | + case (int) R_MICROBLAZE_TEXTREL_64: | ||
| 1838 | + case (int) R_MICROBLAZE_TEXTREL_32_LO: | ||
| 1642 | + case (int) R_MICROBLAZE_64_PCREL : | 1839 | + case (int) R_MICROBLAZE_64_PCREL : |
| 1643 | + case (int) R_MICROBLAZE_64: | 1840 | + case (int) R_MICROBLAZE_64: |
| 1644 | + case (int) R_MICROBLAZE_32: | 1841 | + case (int) R_MICROBLAZE_32: |
| @@ -1649,7 +1846,7 @@ index 0000000000..a357388115 | |||
| 1649 | + if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) | 1846 | + if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) |
| 1650 | + { | 1847 | + { |
| 1651 | + relocation += addend; | 1848 | + relocation += addend; |
| 1652 | + if (r_type == R_MICROBLAZE_32) | 1849 | + if (r_type == R_MICROBLAZE_32)// || r_type == R_MICROBLAZE_IMML_64) |
| 1653 | + bfd_put_32 (input_bfd, relocation, contents + offset); | 1850 | + bfd_put_32 (input_bfd, relocation, contents + offset); |
| 1654 | + else | 1851 | + else |
| 1655 | + { | 1852 | + { |
| @@ -1657,11 +1854,22 @@ index 0000000000..a357388115 | |||
| 1657 | + relocation -= (input_section->output_section->vma | 1854 | + relocation -= (input_section->output_section->vma |
| 1658 | + + input_section->output_offset | 1855 | + + input_section->output_offset |
| 1659 | + + offset + INST_WORD_SIZE); | 1856 | + + offset + INST_WORD_SIZE); |
| 1660 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 1857 | + else if (r_type == R_MICROBLAZE_TEXTREL_64 |
| 1661 | + contents + offset + endian); | 1858 | + || r_type == R_MICROBLAZE_TEXTREL_32_LO) |
| 1662 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 1859 | + relocation -= input_section->output_section->vma; |
| 1663 | + contents + offset + endian + INST_WORD_SIZE); | 1860 | + |
| 1861 | + if (r_type == R_MICROBLAZE_TEXTREL_32_LO) | ||
| 1862 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 1863 | + contents + offset + endian); | ||
| 1864 | + | ||
| 1865 | + else | ||
| 1866 | + { | ||
| 1867 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 1868 | + contents + offset + endian); | ||
| 1869 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 1870 | + contents + offset + endian + INST_WORD_SIZE); | ||
| 1664 | + } | 1871 | + } |
| 1872 | + } | ||
| 1665 | + break; | 1873 | + break; |
| 1666 | + } | 1874 | + } |
| 1667 | + | 1875 | + |
| @@ -1686,7 +1894,7 @@ index 0000000000..a357388115 | |||
| 1686 | + { | 1894 | + { |
| 1687 | + Elf_Internal_Rela outrel; | 1895 | + Elf_Internal_Rela outrel; |
| 1688 | + bfd_byte *loc; | 1896 | + bfd_byte *loc; |
| 1689 | + bfd_boolean skip; | 1897 | + bool skip; |
| 1690 | + | 1898 | + |
| 1691 | + /* When generating a shared object, these relocations | 1899 | + /* When generating a shared object, these relocations |
| 1692 | + are copied into the output file to be resolved at run | 1900 | + are copied into the output file to be resolved at run |
| @@ -1694,15 +1902,15 @@ index 0000000000..a357388115 | |||
| 1694 | + | 1902 | + |
| 1695 | + BFD_ASSERT (sreloc != NULL); | 1903 | + BFD_ASSERT (sreloc != NULL); |
| 1696 | + | 1904 | + |
| 1697 | + skip = FALSE; | 1905 | + skip = false; |
| 1698 | + | 1906 | + |
| 1699 | + outrel.r_offset = | 1907 | + outrel.r_offset = |
| 1700 | + _bfd_elf_section_offset (output_bfd, info, input_section, | 1908 | + _bfd_elf_section_offset (output_bfd, info, input_section, |
| 1701 | + rel->r_offset); | 1909 | + rel->r_offset); |
| 1702 | + if (outrel.r_offset == (bfd_vma) -1) | 1910 | + if (outrel.r_offset == (bfd_vma) -1) |
| 1703 | + skip = TRUE; | 1911 | + skip = true; |
| 1704 | + else if (outrel.r_offset == (bfd_vma) -2) | 1912 | + else if (outrel.r_offset == (bfd_vma) -2) |
| 1705 | + skip = TRUE; | 1913 | + skip = true; |
| 1706 | + outrel.r_offset += (input_section->output_section->vma | 1914 | + outrel.r_offset += (input_section->output_section->vma |
| 1707 | + + input_section->output_offset); | 1915 | + + input_section->output_offset); |
| 1708 | + | 1916 | + |
| @@ -1728,11 +1936,11 @@ index 0000000000..a357388115 | |||
| 1728 | + else | 1936 | + else |
| 1729 | + { | 1937 | + { |
| 1730 | + BFD_FAIL (); | 1938 | + BFD_FAIL (); |
| 1731 | + (*_bfd_error_handler) | 1939 | + _bfd_error_handler |
| 1732 | + (_("%B: probably compiled without -fPIC?"), | 1940 | + (_("%pB: probably compiled without -fPIC?"), |
| 1733 | + input_bfd); | 1941 | + input_bfd); |
| 1734 | + bfd_set_error (bfd_error_bad_value); | 1942 | + bfd_set_error (bfd_error_bad_value); |
| 1735 | + return FALSE; | 1943 | + return false; |
| 1736 | + } | 1944 | + } |
| 1737 | + } | 1945 | + } |
| 1738 | + | 1946 | + |
| @@ -1752,11 +1960,24 @@ index 0000000000..a357388115 | |||
| 1752 | + relocation -= (input_section->output_section->vma | 1960 | + relocation -= (input_section->output_section->vma |
| 1753 | + + input_section->output_offset | 1961 | + + input_section->output_offset |
| 1754 | + + offset + INST_WORD_SIZE); | 1962 | + + offset + INST_WORD_SIZE); |
| 1755 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 1963 | + else if (r_type == R_MICROBLAZE_TEXTREL_64 |
| 1756 | + contents + offset + endian); | 1964 | + || r_type == R_MICROBLAZE_TEXTREL_32_LO) |
| 1757 | + bfd_put_16 (input_bfd, relocation & 0xffff, | 1965 | + relocation -= input_section->output_section->vma; |
| 1758 | + contents + offset + endian + INST_WORD_SIZE); | 1966 | + |
| 1759 | + } | 1967 | + if (r_type == R_MICROBLAZE_TEXTREL_32_LO) |
| 1968 | + { | ||
| 1969 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 1970 | + contents + offset + endian); | ||
| 1971 | + } | ||
| 1972 | + else | ||
| 1973 | + { | ||
| 1974 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 1975 | + contents + offset + endian); | ||
| 1976 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 1977 | + contents + offset + endian | ||
| 1978 | + + INST_WORD_SIZE); | ||
| 1979 | + } | ||
| 1980 | + } | ||
| 1760 | + break; | 1981 | + break; |
| 1761 | + } | 1982 | + } |
| 1762 | + } | 1983 | + } |
| @@ -1799,7 +2020,7 @@ index 0000000000..a357388115 | |||
| 1799 | + | 2020 | + |
| 1800 | + case bfd_reloc_undefined: | 2021 | + case bfd_reloc_undefined: |
| 1801 | + (*info->callbacks->undefined_symbol) | 2022 | + (*info->callbacks->undefined_symbol) |
| 1802 | + (info, name, input_bfd, input_section, offset, TRUE); | 2023 | + (info, name, input_bfd, input_section, offset, true); |
| 1803 | + break; | 2024 | + break; |
| 1804 | + | 2025 | + |
| 1805 | + case bfd_reloc_outofrange: | 2026 | + case bfd_reloc_outofrange: |
| @@ -1827,21 +2048,6 @@ index 0000000000..a357388115 | |||
| 1827 | + | 2048 | + |
| 1828 | + return ret; | 2049 | + return ret; |
| 1829 | +} | 2050 | +} |
| 1830 | + | ||
| 1831 | +/* Merge backend specific data from an object file to the output | ||
| 1832 | + object file when linking. | ||
| 1833 | + | ||
| 1834 | + Note: We only use this hook to catch endian mismatches. */ | ||
| 1835 | +static bfd_boolean | ||
| 1836 | +microblaze_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) | ||
| 1837 | +{ | ||
| 1838 | + /* Check if we have the same endianess. */ | ||
| 1839 | + if (! _bfd_generic_verify_endian_match (ibfd, obfd)) | ||
| 1840 | + return FALSE; | ||
| 1841 | + | ||
| 1842 | + return TRUE; | ||
| 1843 | +} | ||
| 1844 | + | ||
| 1845 | + | 2051 | + |
| 1846 | +/* Calculate fixup value for reference. */ | 2052 | +/* Calculate fixup value for reference. */ |
| 1847 | + | 2053 | + |
| @@ -1896,11 +2102,11 @@ index 0000000000..a357388115 | |||
| 1896 | + bfd_put_32 (abfd, instr_lo, bfd_addr + INST_WORD_SIZE); | 2102 | + bfd_put_32 (abfd, instr_lo, bfd_addr + INST_WORD_SIZE); |
| 1897 | +} | 2103 | +} |
| 1898 | + | 2104 | + |
| 1899 | +static bfd_boolean | 2105 | +static bool |
| 1900 | +microblaze_elf_relax_section (bfd *abfd, | 2106 | +microblaze_elf_relax_section (bfd *abfd, |
| 1901 | + asection *sec, | 2107 | + asection *sec, |
| 1902 | + struct bfd_link_info *link_info, | 2108 | + struct bfd_link_info *link_info, |
| 1903 | + bfd_boolean *again) | 2109 | + bool *again) |
| 1904 | +{ | 2110 | +{ |
| 1905 | + Elf_Internal_Shdr *symtab_hdr; | 2111 | + Elf_Internal_Shdr *symtab_hdr; |
| 1906 | + Elf_Internal_Rela *internal_relocs; | 2112 | + Elf_Internal_Rela *internal_relocs; |
| @@ -1921,14 +2127,14 @@ index 0000000000..a357388115 | |||
| 1921 | + | 2127 | + |
| 1922 | + /* We only do this once per section. We may be able to delete some code | 2128 | + /* We only do this once per section. We may be able to delete some code |
| 1923 | + by running multiple passes, but it is not worth it. */ | 2129 | + by running multiple passes, but it is not worth it. */ |
| 1924 | + *again = FALSE; | 2130 | + *again = false; |
| 1925 | + | 2131 | + |
| 1926 | + /* Only do this for a text section. */ | 2132 | + /* Only do this for a text section. */ |
| 1927 | + if (bfd_link_relocatable (link_info) | 2133 | + if (bfd_link_relocatable (link_info) |
| 1928 | + || (sec->flags & SEC_RELOC) == 0 | 2134 | + || (sec->flags & SEC_RELOC) == 0 |
| 1929 | + || (sec->reloc_count == 0) | 2135 | + || (sec->reloc_count == 0) |
| 1930 | + || (sec->flags & SEC_CODE) == 0) | 2136 | + || (sec->flags & SEC_CODE) == 0) |
| 1931 | + return TRUE; | 2137 | + return true; |
| 1932 | + | 2138 | + |
| 1933 | + BFD_ASSERT ((sec->size > 0) || (sec->rawsize > 0)); | 2139 | + BFD_ASSERT ((sec->size > 0) || (sec->rawsize > 0)); |
| 1934 | + | 2140 | + |
| @@ -1964,7 +2170,8 @@ index 0000000000..a357388115 | |||
| 1964 | + { | 2170 | + { |
| 1965 | + bfd_vma symval; | 2171 | + bfd_vma symval; |
| 1966 | + if ((ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64_PCREL) | 2172 | + if ((ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64_PCREL) |
| 1967 | + && (ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64 )) | 2173 | + && (ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_64 ) |
| 2174 | +&& (ELF64_R_TYPE (irel->r_info) != (int) R_MICROBLAZE_TEXTREL_64)) | ||
| 1968 | + continue; /* Can't delete this reloc. */ | 2175 | + continue; /* Can't delete this reloc. */ |
| 1969 | + | 2176 | + |
| 1970 | + /* Get the section contents. */ | 2177 | + /* Get the section contents. */ |
| @@ -2034,6 +2241,10 @@ index 0000000000..a357388115 | |||
| 2034 | + + sec->output_section->vma | 2241 | + + sec->output_section->vma |
| 2035 | + + sec->output_offset); | 2242 | + + sec->output_offset); |
| 2036 | + } | 2243 | + } |
| 2244 | + else if (ELF64_R_TYPE (irel->r_info) == (int) R_MICROBLAZE_TEXTREL_64) | ||
| 2245 | + { | ||
| 2246 | + symval = symval + irel->r_addend - (sec->output_section->vma); | ||
| 2247 | + } | ||
| 2037 | + else | 2248 | + else |
| 2038 | + symval += irel->r_addend; | 2249 | + symval += irel->r_addend; |
| 2039 | + | 2250 | + |
| @@ -2055,9 +2266,13 @@ index 0000000000..a357388115 | |||
| 2055 | + irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), | 2266 | + irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), |
| 2056 | + (int) R_MICROBLAZE_32_LO); | 2267 | + (int) R_MICROBLAZE_32_LO); |
| 2057 | + break; | 2268 | + break; |
| 2269 | + case R_MICROBLAZE_TEXTREL_64: | ||
| 2270 | + irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), | ||
| 2271 | + (int) R_MICROBLAZE_TEXTREL_32_LO); | ||
| 2272 | + break; | ||
| 2058 | + default: | 2273 | + default: |
| 2059 | + /* Cannot happen. */ | 2274 | + /* Cannot happen. */ |
| 2060 | + BFD_ASSERT (FALSE); | 2275 | + BFD_ASSERT (false); |
| 2061 | + } | 2276 | + } |
| 2062 | + } | 2277 | + } |
| 2063 | + } /* Loop through all relocations. */ | 2278 | + } /* Loop through all relocations. */ |
| @@ -2095,6 +2310,28 @@ index 0000000000..a357388115 | |||
| 2095 | + irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); | 2310 | + irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); |
| 2096 | + } | 2311 | + } |
| 2097 | + break; | 2312 | + break; |
| 2313 | + case R_MICROBLAZE_IMML_64: | ||
| 2314 | + { | ||
| 2315 | + /* This was a PC-relative instruction that was | ||
| 2316 | + completely resolved. */ | ||
| 2317 | + int sfix, efix; | ||
| 2318 | + unsigned int val; | ||
| 2319 | + bfd_vma target_address; | ||
| 2320 | + target_address = irel->r_addend + irel->r_offset; | ||
| 2321 | + sfix = calc_fixup (irel->r_offset, 0, sec); | ||
| 2322 | + efix = calc_fixup (target_address, 0, sec); | ||
| 2323 | + | ||
| 2324 | + /* Validate the in-band val. */ | ||
| 2325 | + val = bfd_get_32 (abfd, contents + irel->r_offset); | ||
| 2326 | + if (val != irel->r_addend && ELF64_R_TYPE (irel->r_info) == R_MICROBLAZE_32_NONE) { | ||
| 2327 | + fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); | ||
| 2328 | + } | ||
| 2329 | + irel->r_addend -= (efix - sfix); | ||
| 2330 | + /* Should use HOWTO. */ | ||
| 2331 | + microblaze_bfd_write_imm_value_64 (abfd, contents + irel->r_offset, | ||
| 2332 | + irel->r_addend); | ||
| 2333 | + } | ||
| 2334 | + break; | ||
| 2098 | + case R_MICROBLAZE_NONE: | 2335 | + case R_MICROBLAZE_NONE: |
| 2099 | + case R_MICROBLAZE_32_NONE: | 2336 | + case R_MICROBLAZE_32_NONE: |
| 2100 | + { | 2337 | + { |
| @@ -2149,9 +2386,9 @@ index 0000000000..a357388115 | |||
| 2149 | + continue; | 2386 | + continue; |
| 2150 | + | 2387 | + |
| 2151 | + /* We always cache the relocs. Perhaps, if info->keep_memory is | 2388 | + /* We always cache the relocs. Perhaps, if info->keep_memory is |
| 2152 | + FALSE, we should free them, if we are permitted to. */ | 2389 | + false, we should free them, if we are permitted to. */ |
| 2153 | + | 2390 | + |
| 2154 | + irelocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL, TRUE); | 2391 | + irelocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL, true); |
| 2155 | + if (irelocs == NULL) | 2392 | + if (irelocs == NULL) |
| 2156 | + goto error_return; | 2393 | + goto error_return; |
| 2157 | + | 2394 | + |
| @@ -2177,7 +2414,7 @@ index 0000000000..a357388115 | |||
| 2177 | + else | 2414 | + else |
| 2178 | + { | 2415 | + { |
| 2179 | + /* We always cache the section contents. | 2416 | + /* We always cache the section contents. |
| 2180 | + Perhaps, if info->keep_memory is FALSE, we | 2417 | + Perhaps, if info->keep_memory is false, we |
| 2181 | + should free them, if we are permitted to. */ | 2418 | + should free them, if we are permitted to. */ |
| 2182 | + | 2419 | + |
| 2183 | + if (o->rawsize == 0) | 2420 | + if (o->rawsize == 0) |
| @@ -2216,7 +2453,7 @@ index 0000000000..a357388115 | |||
| 2216 | + else | 2453 | + else |
| 2217 | + { | 2454 | + { |
| 2218 | + /* We always cache the section contents. | 2455 | + /* We always cache the section contents. |
| 2219 | + Perhaps, if info->keep_memory is FALSE, we | 2456 | + Perhaps, if info->keep_memory is false, we |
| 2220 | + should free them, if we are permitted to. */ | 2457 | + should free them, if we are permitted to. */ |
| 2221 | + if (o->rawsize == 0) | 2458 | + if (o->rawsize == 0) |
| 2222 | + o->rawsize = o->size; | 2459 | + o->rawsize = o->size; |
| @@ -2245,7 +2482,7 @@ index 0000000000..a357388115 | |||
| 2245 | + else | 2482 | + else |
| 2246 | + { | 2483 | + { |
| 2247 | + /* We always cache the section contents. | 2484 | + /* We always cache the section contents. |
| 2248 | + Perhaps, if info->keep_memory is FALSE, we | 2485 | + Perhaps, if info->keep_memory is false, we |
| 2249 | + should free them, if we are permitted to. */ | 2486 | + should free them, if we are permitted to. */ |
| 2250 | + | 2487 | + |
| 2251 | + if (o->rawsize == 0) | 2488 | + if (o->rawsize == 0) |
| @@ -2267,7 +2504,8 @@ index 0000000000..a357388115 | |||
| 2267 | + } | 2504 | + } |
| 2268 | + } | 2505 | + } |
| 2269 | + else if ((ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_PCREL_LO) | 2506 | + else if ((ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_PCREL_LO) |
| 2270 | + || (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_LO)) | 2507 | + || (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_32_LO) |
| 2508 | + || (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_TEXTREL_32_LO)) | ||
| 2271 | + { | 2509 | + { |
| 2272 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2510 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
| 2273 | + | 2511 | + |
| @@ -2285,7 +2523,7 @@ index 0000000000..a357388115 | |||
| 2285 | + else | 2523 | + else |
| 2286 | + { | 2524 | + { |
| 2287 | + /* We always cache the section contents. | 2525 | + /* We always cache the section contents. |
| 2288 | + Perhaps, if info->keep_memory is FALSE, we | 2526 | + Perhaps, if info->keep_memory is false, we |
| 2289 | + should free them, if we are permitted to. */ | 2527 | + should free them, if we are permitted to. */ |
| 2290 | + if (o->rawsize == 0) | 2528 | + if (o->rawsize == 0) |
| 2291 | + o->rawsize = o->size; | 2529 | + o->rawsize = o->size; |
| @@ -2311,7 +2549,8 @@ index 0000000000..a357388115 | |||
| 2311 | + } | 2549 | + } |
| 2312 | + } | 2550 | + } |
| 2313 | + | 2551 | + |
| 2314 | + if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64) | 2552 | + if (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_64 |
| 2553 | + || (ELF64_R_TYPE (irelscan->r_info) == (int) R_MICROBLAZE_TEXTREL_64)) | ||
| 2315 | + { | 2554 | + { |
| 2316 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 2555 | + isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
| 2317 | + | 2556 | + |
| @@ -2328,7 +2567,7 @@ index 0000000000..a357388115 | |||
| 2328 | + else | 2567 | + else |
| 2329 | + { | 2568 | + { |
| 2330 | + /* We always cache the section contents. | 2569 | + /* We always cache the section contents. |
| 2331 | + Perhaps, if info->keep_memory is FALSE, we | 2570 | + Perhaps, if info->keep_memory is false, we |
| 2332 | + should free them, if we are permitted to. */ | 2571 | + should free them, if we are permitted to. */ |
| 2333 | + | 2572 | + |
| 2334 | + if (o->rawsize == 0) | 2573 | + if (o->rawsize == 0) |
| @@ -2373,7 +2612,7 @@ index 0000000000..a357388115 | |||
| 2373 | + else | 2612 | + else |
| 2374 | + { | 2613 | + { |
| 2375 | + /* We always cache the section contents. | 2614 | + /* We always cache the section contents. |
| 2376 | + Perhaps, if info->keep_memory is FALSE, we | 2615 | + Perhaps, if info->keep_memory is false, we |
| 2377 | + should free them, if we are permitted to. */ | 2616 | + should free them, if we are permitted to. */ |
| 2378 | + if (o->rawsize == 0) | 2617 | + if (o->rawsize == 0) |
| 2379 | + o->rawsize = o->size; | 2618 | + o->rawsize = o->size; |
| @@ -2457,11 +2696,8 @@ index 0000000000..a357388115 | |||
| 2457 | + symtab_hdr->contents = (bfd_byte *) isymbuf; | 2696 | + symtab_hdr->contents = (bfd_byte *) isymbuf; |
| 2458 | + } | 2697 | + } |
| 2459 | + | 2698 | + |
| 2460 | + if (free_relocs != NULL) | 2699 | + free (free_relocs); |
| 2461 | + { | 2700 | + free_relocs = NULL; |
| 2462 | + free (free_relocs); | ||
| 2463 | + free_relocs = NULL; | ||
| 2464 | + } | ||
| 2465 | + | 2701 | + |
| 2466 | + if (free_contents != NULL) | 2702 | + if (free_contents != NULL) |
| 2467 | + { | 2703 | + { |
| @@ -2475,26 +2711,21 @@ index 0000000000..a357388115 | |||
| 2475 | + | 2711 | + |
| 2476 | + if (sec->relax_count == 0) | 2712 | + if (sec->relax_count == 0) |
| 2477 | + { | 2713 | + { |
| 2478 | + *again = FALSE; | 2714 | + *again = false; |
| 2479 | + free (sec->relax); | 2715 | + free (sec->relax); |
| 2480 | + sec->relax = NULL; | 2716 | + sec->relax = NULL; |
| 2481 | + } | 2717 | + } |
| 2482 | + else | 2718 | + else |
| 2483 | + *again = TRUE; | 2719 | + *again = true; |
| 2484 | + return TRUE; | 2720 | + return true; |
| 2485 | + | 2721 | + |
| 2486 | + error_return: | 2722 | + error_return: |
| 2487 | + if (free_relocs != NULL) | 2723 | + free (free_relocs); |
| 2488 | + free (free_relocs); | 2724 | + free (free_contents); |
| 2489 | + if (free_contents != NULL) | 2725 | + free (sec->relax); |
| 2490 | + free (free_contents); | 2726 | + sec->relax = NULL; |
| 2491 | + if (sec->relax != NULL) | 2727 | + sec->relax_count = 0; |
| 2492 | + { | 2728 | + return false; |
| 2493 | + free (sec->relax); | ||
| 2494 | + sec->relax = NULL; | ||
| 2495 | + sec->relax_count = 0; | ||
| 2496 | + } | ||
| 2497 | + return FALSE; | ||
| 2498 | +} | 2729 | +} |
| 2499 | + | 2730 | + |
| 2500 | +/* Return the section that should be marked against GC for a given | 2731 | +/* Return the section that should be marked against GC for a given |
| @@ -2518,17 +2749,6 @@ index 0000000000..a357388115 | |||
| 2518 | + return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); | 2749 | + return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); |
| 2519 | +} | 2750 | +} |
| 2520 | + | 2751 | + |
| 2521 | +/* Update the got entry reference counts for the section being removed. */ | ||
| 2522 | + | ||
| 2523 | +static bfd_boolean | ||
| 2524 | +microblaze_elf_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 2525 | + struct bfd_link_info * info ATTRIBUTE_UNUSED, | ||
| 2526 | + asection * sec ATTRIBUTE_UNUSED, | ||
| 2527 | + const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED) | ||
| 2528 | +{ | ||
| 2529 | + return TRUE; | ||
| 2530 | +} | ||
| 2531 | + | ||
| 2532 | +/* PIC support. */ | 2752 | +/* PIC support. */ |
| 2533 | + | 2753 | + |
| 2534 | +#define PLT_ENTRY_SIZE 16 | 2754 | +#define PLT_ENTRY_SIZE 16 |
| @@ -2542,37 +2762,7 @@ index 0000000000..a357388115 | |||
| 2542 | +/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up | 2762 | +/* Create .got, .gotplt, and .rela.got sections in DYNOBJ, and set up |
| 2543 | + shortcuts to them in our hash table. */ | 2763 | + shortcuts to them in our hash table. */ |
| 2544 | + | 2764 | + |
| 2545 | +static bfd_boolean | 2765 | +static bool |
| 2546 | +create_got_section (bfd *dynobj, struct bfd_link_info *info) | ||
| 2547 | +{ | ||
| 2548 | + struct elf64_mb_link_hash_table *htab; | ||
| 2549 | + | ||
| 2550 | + if (! _bfd_elf_create_got_section (dynobj, info)) | ||
| 2551 | + return FALSE; | ||
| 2552 | + htab = elf64_mb_hash_table (info); | ||
| 2553 | + if (htab == NULL) | ||
| 2554 | + return FALSE; | ||
| 2555 | + | ||
| 2556 | + htab->sgot = bfd_get_linker_section (dynobj, ".got"); | ||
| 2557 | + htab->sgotplt = bfd_get_linker_section (dynobj, ".got.plt"); | ||
| 2558 | + if (!htab->sgot || !htab->sgotplt) | ||
| 2559 | + return FALSE; | ||
| 2560 | + | ||
| 2561 | + if ((htab->srelgot = bfd_get_linker_section (dynobj, ".rela.got")) == NULL) | ||
| 2562 | + htab->srelgot = bfd_make_section_anyway (dynobj, ".rela.got"); | ||
| 2563 | + if (htab->srelgot == NULL | ||
| 2564 | + || ! bfd_set_section_flags (htab->srelgot, SEC_ALLOC | ||
| 2565 | + | SEC_LOAD | ||
| 2566 | + | SEC_HAS_CONTENTS | ||
| 2567 | + | SEC_IN_MEMORY | ||
| 2568 | + | SEC_LINKER_CREATED | ||
| 2569 | + | SEC_READONLY) | ||
| 2570 | + || ! bfd_set_section_alignment (htab->srelgot, 2)) | ||
| 2571 | + return FALSE; | ||
| 2572 | + return TRUE; | ||
| 2573 | +} | ||
| 2574 | + | ||
| 2575 | +static bfd_boolean | ||
| 2576 | +update_local_sym_info (bfd *abfd, | 2766 | +update_local_sym_info (bfd *abfd, |
| 2577 | + Elf_Internal_Shdr *symtab_hdr, | 2767 | + Elf_Internal_Shdr *symtab_hdr, |
| 2578 | + unsigned long r_symndx, | 2768 | + unsigned long r_symndx, |
| @@ -2588,7 +2778,7 @@ index 0000000000..a357388115 | |||
| 2588 | + size *= (sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks)); | 2778 | + size *= (sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks)); |
| 2589 | + local_got_refcounts = bfd_zalloc (abfd, size); | 2779 | + local_got_refcounts = bfd_zalloc (abfd, size); |
| 2590 | + if (local_got_refcounts == NULL) | 2780 | + if (local_got_refcounts == NULL) |
| 2591 | + return FALSE; | 2781 | + return false; |
| 2592 | + elf_local_got_refcounts (abfd) = local_got_refcounts; | 2782 | + elf_local_got_refcounts (abfd) = local_got_refcounts; |
| 2593 | + } | 2783 | + } |
| 2594 | + | 2784 | + |
| @@ -2597,11 +2787,11 @@ index 0000000000..a357388115 | |||
| 2597 | + local_got_tls_masks[r_symndx] |= tls_type; | 2787 | + local_got_tls_masks[r_symndx] |= tls_type; |
| 2598 | + local_got_refcounts[r_symndx] += 1; | 2788 | + local_got_refcounts[r_symndx] += 1; |
| 2599 | + | 2789 | + |
| 2600 | + return TRUE; | 2790 | + return true; |
| 2601 | +} | 2791 | +} |
| 2602 | +/* Look through the relocs for a section during the first phase. */ | 2792 | +/* Look through the relocs for a section during the first phase. */ |
| 2603 | + | 2793 | + |
| 2604 | +static bfd_boolean | 2794 | +static bool |
| 2605 | +microblaze_elf_check_relocs (bfd * abfd, | 2795 | +microblaze_elf_check_relocs (bfd * abfd, |
| 2606 | + struct bfd_link_info * info, | 2796 | + struct bfd_link_info * info, |
| 2607 | + asection * sec, | 2797 | + asection * sec, |
| @@ -2616,11 +2806,11 @@ index 0000000000..a357388115 | |||
| 2616 | + asection *sreloc = NULL; | 2806 | + asection *sreloc = NULL; |
| 2617 | + | 2807 | + |
| 2618 | + if (bfd_link_relocatable (info)) | 2808 | + if (bfd_link_relocatable (info)) |
| 2619 | + return TRUE; | 2809 | + return true; |
| 2620 | + | 2810 | + |
| 2621 | + htab = elf64_mb_hash_table (info); | 2811 | + htab = elf64_mb_hash_table (info); |
| 2622 | + if (htab == NULL) | 2812 | + if (htab == NULL) |
| 2623 | + return FALSE; | 2813 | + return false; |
| 2624 | + | 2814 | + |
| 2625 | + symtab_hdr = & elf_tdata (abfd)->symtab_hdr; | 2815 | + symtab_hdr = & elf_tdata (abfd)->symtab_hdr; |
| 2626 | + sym_hashes = elf_sym_hashes (abfd); | 2816 | + sym_hashes = elf_sym_hashes (abfd); |
| @@ -2656,14 +2846,14 @@ index 0000000000..a357388115 | |||
| 2656 | + Reconstruct it for later use during GC. */ | 2846 | + Reconstruct it for later use during GC. */ |
| 2657 | + case R_MICROBLAZE_GNU_VTINHERIT: | 2847 | + case R_MICROBLAZE_GNU_VTINHERIT: |
| 2658 | + if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) | 2848 | + if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset)) |
| 2659 | + return FALSE; | 2849 | + return false; |
| 2660 | + break; | 2850 | + break; |
| 2661 | + | 2851 | + |
| 2662 | + /* This relocation describes which C++ vtable entries are actually | 2852 | + /* This relocation describes which C++ vtable entries are actually |
| 2663 | + used. Record for later use during GC. */ | 2853 | + used. Record for later use during GC. */ |
| 2664 | + case R_MICROBLAZE_GNU_VTENTRY: | 2854 | + case R_MICROBLAZE_GNU_VTENTRY: |
| 2665 | + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) | 2855 | + if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend)) |
| 2666 | + return FALSE; | 2856 | + return false; |
| 2667 | + break; | 2857 | + break; |
| 2668 | + | 2858 | + |
| 2669 | + /* This relocation requires .plt entry. */ | 2859 | + /* This relocation requires .plt entry. */ |
| @@ -2676,22 +2866,24 @@ index 0000000000..a357388115 | |||
| 2676 | + break; | 2866 | + break; |
| 2677 | + | 2867 | + |
| 2678 | + /* This relocation requires .got entry. */ | 2868 | + /* This relocation requires .got entry. */ |
| 2679 | + case R_MICROBLAZE_TLSGD: | 2869 | + case R_MICROBLAZE_TLSGD: |
| 2680 | + tls_type |= (TLS_TLS | TLS_GD); | 2870 | + tls_type |= (TLS_TLS | TLS_GD); |
| 2681 | + goto dogottls; | 2871 | + goto dogottls; |
| 2682 | + case R_MICROBLAZE_TLSLD: | 2872 | + case R_MICROBLAZE_TLSLD: |
| 2683 | + tls_type |= (TLS_TLS | TLS_LD); | 2873 | + tls_type |= (TLS_TLS | TLS_LD); |
| 2684 | + dogottls: | 2874 | + /* Fall through. */ |
| 2685 | + sec->has_tls_reloc = 1; | 2875 | + dogottls: |
| 2686 | + case R_MICROBLAZE_GOT_64: | 2876 | + sec->has_tls_reloc = 1; |
| 2687 | + if (htab->sgot == NULL) | 2877 | + /* Fall through. */ |
| 2688 | + { | 2878 | + case R_MICROBLAZE_GOT_64: |
| 2689 | + if (htab->elf.dynobj == NULL) | 2879 | + if (htab->elf.sgot == NULL) |
| 2690 | + htab->elf.dynobj = abfd; | 2880 | + { |
| 2691 | + if (!create_got_section (htab->elf.dynobj, info)) | 2881 | + if (htab->elf.dynobj == NULL) |
| 2692 | + return FALSE; | 2882 | + htab->elf.dynobj = abfd; |
| 2693 | + } | 2883 | + if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) |
| 2694 | + if (h != NULL) | 2884 | + return false; |
| 2885 | + } | ||
| 2886 | + if (h != NULL) | ||
| 2695 | + { | 2887 | + { |
| 2696 | + h->got.refcount += 1; | 2888 | + h->got.refcount += 1; |
| 2697 | + elf64_mb_hash_entry (h)->tls_mask |= tls_type; | 2889 | + elf64_mb_hash_entry (h)->tls_mask |= tls_type; |
| @@ -2699,7 +2891,18 @@ index 0000000000..a357388115 | |||
| 2699 | + else | 2891 | + else |
| 2700 | + { | 2892 | + { |
| 2701 | + if (! update_local_sym_info(abfd, symtab_hdr, r_symndx, tls_type) ) | 2893 | + if (! update_local_sym_info(abfd, symtab_hdr, r_symndx, tls_type) ) |
| 2702 | + return FALSE; | 2894 | + return false; |
| 2895 | + } | ||
| 2896 | + break; | ||
| 2897 | + | ||
| 2898 | + case R_MICROBLAZE_GOTOFF_64: | ||
| 2899 | + case R_MICROBLAZE_GOTOFF_32: | ||
| 2900 | + if (htab->elf.sgot == NULL) | ||
| 2901 | + { | ||
| 2902 | + if (htab->elf.dynobj == NULL) | ||
| 2903 | + htab->elf.dynobj = abfd; | ||
| 2904 | + if (!_bfd_elf_create_got_section (htab->elf.dynobj, info)) | ||
| 2905 | + return false; | ||
| 2703 | + } | 2906 | + } |
| 2704 | + break; | 2907 | + break; |
| 2705 | + | 2908 | + |
| @@ -2748,14 +2951,14 @@ index 0000000000..a357388115 | |||
| 2748 | + && (! info->symbolic | 2951 | + && (! info->symbolic |
| 2749 | + || h->root.type == bfd_link_hash_defweak | 2952 | + || h->root.type == bfd_link_hash_defweak |
| 2750 | + || !h->def_regular)))) | 2953 | + || !h->def_regular)))) |
| 2751 | + || (!bfd_link_pic (info) | 2954 | + || (!bfd_link_pic (info) |
| 2752 | + && (sec->flags & SEC_ALLOC) != 0 | 2955 | + && (sec->flags & SEC_ALLOC) != 0 |
| 2753 | + && h != NULL | 2956 | + && h != NULL |
| 2754 | + && (h->root.type == bfd_link_hash_defweak | 2957 | + && (h->root.type == bfd_link_hash_defweak |
| 2755 | + || !h->def_regular))) | 2958 | + || !h->def_regular))) |
| 2756 | + { | 2959 | + { |
| 2757 | + struct elf64_mb_dyn_relocs *p; | 2960 | + struct elf_dyn_relocs *p; |
| 2758 | + struct elf64_mb_dyn_relocs **head; | 2961 | + struct elf_dyn_relocs **head; |
| 2759 | + | 2962 | + |
| 2760 | + /* When creating a shared object, we must copy these | 2963 | + /* When creating a shared object, we must copy these |
| 2761 | + relocs into the output file. We create a reloc | 2964 | + relocs into the output file. We create a reloc |
| @@ -2772,7 +2975,7 @@ index 0000000000..a357388115 | |||
| 2772 | + sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj, | 2975 | + sreloc = _bfd_elf_make_dynamic_reloc_section (sec, dynobj, |
| 2773 | + 2, abfd, 1); | 2976 | + 2, abfd, 1); |
| 2774 | + if (sreloc == NULL) | 2977 | + if (sreloc == NULL) |
| 2775 | + return FALSE; | 2978 | + return false; |
| 2776 | + } | 2979 | + } |
| 2777 | + | 2980 | + |
| 2778 | + /* If this is a global symbol, we count the number of | 2981 | + /* If this is a global symbol, we count the number of |
| @@ -2789,27 +2992,27 @@ index 0000000000..a357388115 | |||
| 2789 | + Elf_Internal_Sym *isym; | 2992 | + Elf_Internal_Sym *isym; |
| 2790 | + void *vpp; | 2993 | + void *vpp; |
| 2791 | + | 2994 | + |
| 2792 | + isym = bfd_sym_from_r_symndx (&htab->sym_sec, | 2995 | + isym = bfd_sym_from_r_symndx (&htab->elf.sym_cache, |
| 2793 | + abfd, r_symndx); | 2996 | + abfd, r_symndx); |
| 2794 | + if (isym == NULL) | 2997 | + if (isym == NULL) |
| 2795 | + return FALSE; | 2998 | + return false; |
| 2796 | + | 2999 | + |
| 2797 | + s = bfd_section_from_elf_index (abfd, isym->st_shndx); | 3000 | + s = bfd_section_from_elf_index (abfd, isym->st_shndx); |
| 2798 | + if (s == NULL) | 3001 | + if (s == NULL) |
| 2799 | + return FALSE; | 3002 | + return false; |
| 2800 | + | 3003 | + |
| 2801 | + vpp = &elf_section_data (s)->local_dynrel; | 3004 | + vpp = &elf_section_data (s)->local_dynrel; |
| 2802 | + head = (struct elf64_mb_dyn_relocs **) vpp; | 3005 | + head = (struct elf_dyn_relocs **) vpp; |
| 2803 | + } | 3006 | + } |
| 2804 | + | 3007 | + |
| 2805 | + p = *head; | 3008 | + p = *head; |
| 2806 | + if (p == NULL || p->sec != sec) | 3009 | + if (p == NULL || p->sec != sec) |
| 2807 | + { | 3010 | + { |
| 2808 | + size_t amt = sizeof *p; | 3011 | + size_t amt = sizeof *p; |
| 2809 | + p = ((struct elf64_mb_dyn_relocs *) | 3012 | + p = ((struct elf_dyn_relocs *) |
| 2810 | + bfd_alloc (htab->elf.dynobj, amt)); | 3013 | + bfd_alloc (htab->elf.dynobj, amt)); |
| 2811 | + if (p == NULL) | 3014 | + if (p == NULL) |
| 2812 | + return FALSE; | 3015 | + return false; |
| 2813 | + p->next = *head; | 3016 | + p->next = *head; |
| 2814 | + *head = p; | 3017 | + *head = p; |
| 2815 | + p->sec = sec; | 3018 | + p->sec = sec; |
| @@ -2826,35 +3029,7 @@ index 0000000000..a357388115 | |||
| 2826 | + } | 3029 | + } |
| 2827 | + } | 3030 | + } |
| 2828 | + | 3031 | + |
| 2829 | + return TRUE; | 3032 | + return true; |
| 2830 | +} | ||
| 2831 | + | ||
| 2832 | +static bfd_boolean | ||
| 2833 | +microblaze_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) | ||
| 2834 | +{ | ||
| 2835 | + struct elf64_mb_link_hash_table *htab; | ||
| 2836 | + | ||
| 2837 | + htab = elf64_mb_hash_table (info); | ||
| 2838 | + if (htab == NULL) | ||
| 2839 | + return FALSE; | ||
| 2840 | + | ||
| 2841 | + if (!htab->sgot && !create_got_section (dynobj, info)) | ||
| 2842 | + return FALSE; | ||
| 2843 | + | ||
| 2844 | + if (!_bfd_elf_create_dynamic_sections (dynobj, info)) | ||
| 2845 | + return FALSE; | ||
| 2846 | + | ||
| 2847 | + htab->splt = bfd_get_linker_section (dynobj, ".plt"); | ||
| 2848 | + htab->srelplt = bfd_get_linker_section (dynobj, ".rela.plt"); | ||
| 2849 | + htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); | ||
| 2850 | + if (!bfd_link_pic (info)) | ||
| 2851 | + htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); | ||
| 2852 | + | ||
| 2853 | + if (!htab->splt || !htab->srelplt || !htab->sdynbss | ||
| 2854 | + || (!bfd_link_pic (info) && !htab->srelbss)) | ||
| 2855 | + abort (); | ||
| 2856 | + | ||
| 2857 | + return TRUE; | ||
| 2858 | +} | 3033 | +} |
| 2859 | + | 3034 | + |
| 2860 | +/* Copy the extra info we tack onto an elf_link_hash_entry. */ | 3035 | +/* Copy the extra info we tack onto an elf_link_hash_entry. */ |
| @@ -2869,46 +3044,12 @@ index 0000000000..a357388115 | |||
| 2869 | + edir = (struct elf64_mb_link_hash_entry *) dir; | 3044 | + edir = (struct elf64_mb_link_hash_entry *) dir; |
| 2870 | + eind = (struct elf64_mb_link_hash_entry *) ind; | 3045 | + eind = (struct elf64_mb_link_hash_entry *) ind; |
| 2871 | + | 3046 | + |
| 2872 | + if (eind->dyn_relocs != NULL) | ||
| 2873 | + { | ||
| 2874 | + if (edir->dyn_relocs != NULL) | ||
| 2875 | + { | ||
| 2876 | + struct elf64_mb_dyn_relocs **pp; | ||
| 2877 | + struct elf64_mb_dyn_relocs *p; | ||
| 2878 | + | ||
| 2879 | + if (ind->root.type == bfd_link_hash_indirect) | ||
| 2880 | + abort (); | ||
| 2881 | + | ||
| 2882 | + /* Add reloc counts against the weak sym to the strong sym | ||
| 2883 | + list. Merge any entries against the same section. */ | ||
| 2884 | + for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) | ||
| 2885 | + { | ||
| 2886 | + struct elf64_mb_dyn_relocs *q; | ||
| 2887 | + | ||
| 2888 | + for (q = edir->dyn_relocs; q != NULL; q = q->next) | ||
| 2889 | + if (q->sec == p->sec) | ||
| 2890 | + { | ||
| 2891 | + q->pc_count += p->pc_count; | ||
| 2892 | + q->count += p->count; | ||
| 2893 | + *pp = p->next; | ||
| 2894 | + break; | ||
| 2895 | + } | ||
| 2896 | + if (q == NULL) | ||
| 2897 | + pp = &p->next; | ||
| 2898 | + } | ||
| 2899 | + *pp = edir->dyn_relocs; | ||
| 2900 | + } | ||
| 2901 | + | ||
| 2902 | + edir->dyn_relocs = eind->dyn_relocs; | ||
| 2903 | + eind->dyn_relocs = NULL; | ||
| 2904 | + } | ||
| 2905 | + | ||
| 2906 | + edir->tls_mask |= eind->tls_mask; | 3047 | + edir->tls_mask |= eind->tls_mask; |
| 2907 | + | 3048 | + |
| 2908 | + _bfd_elf_link_hash_copy_indirect (info, dir, ind); | 3049 | + _bfd_elf_link_hash_copy_indirect (info, dir, ind); |
| 2909 | +} | 3050 | +} |
| 2910 | + | 3051 | + |
| 2911 | +static bfd_boolean | 3052 | +static bool |
| 2912 | +microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | 3053 | +microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, |
| 2913 | + struct elf_link_hash_entry *h) | 3054 | + struct elf_link_hash_entry *h) |
| 2914 | +{ | 3055 | +{ |
| @@ -2922,7 +3063,7 @@ index 0000000000..a357388115 | |||
| 2922 | + | 3063 | + |
| 2923 | + htab = elf64_mb_hash_table (info); | 3064 | + htab = elf64_mb_hash_table (info); |
| 2924 | + if (htab == NULL) | 3065 | + if (htab == NULL) |
| 2925 | + return FALSE; | 3066 | + return false; |
| 2926 | + | 3067 | + |
| 2927 | + /* If this is a function, put it in the procedure linkage table. We | 3068 | + /* If this is a function, put it in the procedure linkage table. We |
| 2928 | + will fill in the contents of the procedure linkage table later, | 3069 | + will fill in the contents of the procedure linkage table later, |
| @@ -2944,7 +3085,7 @@ index 0000000000..a357388115 | |||
| 2944 | + h->needs_plt = 0; | 3085 | + h->needs_plt = 0; |
| 2945 | + } | 3086 | + } |
| 2946 | + | 3087 | + |
| 2947 | + return TRUE; | 3088 | + return true; |
| 2948 | + } | 3089 | + } |
| 2949 | + else | 3090 | + else |
| 2950 | + /* It's possible that we incorrectly decided a .plt reloc was | 3091 | + /* It's possible that we incorrectly decided a .plt reloc was |
| @@ -2963,7 +3104,7 @@ index 0000000000..a357388115 | |||
| 2963 | + BFD_ASSERT (def->root.type == bfd_link_hash_defined); | 3104 | + BFD_ASSERT (def->root.type == bfd_link_hash_defined); |
| 2964 | + h->root.u.def.section = def->root.u.def.section; | 3105 | + h->root.u.def.section = def->root.u.def.section; |
| 2965 | + h->root.u.def.value = def->root.u.def.value; | 3106 | + h->root.u.def.value = def->root.u.def.value; |
| 2966 | + return TRUE; | 3107 | + return true; |
| 2967 | + } | 3108 | + } |
| 2968 | + | 3109 | + |
| 2969 | + /* This is a reference to a symbol defined by a dynamic object which | 3110 | + /* This is a reference to a symbol defined by a dynamic object which |
| @@ -2974,34 +3115,26 @@ index 0000000000..a357388115 | |||
| 2974 | + For such cases we need not do anything here; the relocations will | 3115 | + For such cases we need not do anything here; the relocations will |
| 2975 | + be handled correctly by relocate_section. */ | 3116 | + be handled correctly by relocate_section. */ |
| 2976 | + if (bfd_link_pic (info)) | 3117 | + if (bfd_link_pic (info)) |
| 2977 | + return TRUE; | 3118 | + return true; |
| 2978 | + | 3119 | + |
| 2979 | + /* If there are no references to this symbol that do not use the | 3120 | + /* If there are no references to this symbol that do not use the |
| 2980 | + GOT, we don't need to generate a copy reloc. */ | 3121 | + GOT, we don't need to generate a copy reloc. */ |
| 2981 | + if (!h->non_got_ref) | 3122 | + if (!h->non_got_ref) |
| 2982 | + return TRUE; | 3123 | + return true; |
| 2983 | + | 3124 | + |
| 2984 | + /* If -z nocopyreloc was given, we won't generate them either. */ | 3125 | + /* If -z nocopyreloc was given, we won't generate them either. */ |
| 2985 | + if (info->nocopyreloc) | 3126 | + if (info->nocopyreloc) |
| 2986 | + { | 3127 | + { |
| 2987 | + h->non_got_ref = 0; | 3128 | + h->non_got_ref = 0; |
| 2988 | + return TRUE; | 3129 | + return true; |
| 2989 | + } | ||
| 2990 | + | ||
| 2991 | + eh = (struct elf64_mb_link_hash_entry *) h; | ||
| 2992 | + for (p = eh->dyn_relocs; p != NULL; p = p->next) | ||
| 2993 | + { | ||
| 2994 | + s = p->sec->output_section; | ||
| 2995 | + if (s != NULL && (s->flags & SEC_READONLY) != 0) | ||
| 2996 | + break; | ||
| 2997 | + } | 3130 | + } |
| 2998 | + | 3131 | + |
| 2999 | + /* If we didn't find any dynamic relocs in read-only sections, then | 3132 | + /* If we don't find any dynamic relocs in read-only sections, then |
| 3000 | + we'll be keeping the dynamic relocs and avoiding the copy reloc. */ | 3133 | + we'll be keeping the dynamic relocs and avoiding the copy reloc. */ |
| 3001 | + if (!_bfd_elf_readonly_dynrelocs (h)) | 3134 | + if (!_bfd_elf_readonly_dynrelocs (h)) |
| 3002 | + { | 3135 | + { |
| 3003 | + h->non_got_ref = 0; | 3136 | + h->non_got_ref = 0; |
| 3004 | + return TRUE; | 3137 | + return true; |
| 3005 | + } | 3138 | + } |
| 3006 | + | 3139 | + |
| 3007 | + /* We must allocate the symbol in our .dynbss section, which will | 3140 | + /* We must allocate the symbol in our .dynbss section, which will |
| @@ -3044,7 +3177,7 @@ index 0000000000..a357388115 | |||
| 3044 | + if (power_of_two > s->alignment_power) | 3177 | + if (power_of_two > s->alignment_power) |
| 3045 | + { | 3178 | + { |
| 3046 | + if (!bfd_set_section_alignment (s, power_of_two)) | 3179 | + if (!bfd_set_section_alignment (s, power_of_two)) |
| 3047 | + return FALSE; | 3180 | + return false; |
| 3048 | + } | 3181 | + } |
| 3049 | + | 3182 | + |
| 3050 | + /* Define the symbol as being at this point in the section. */ | 3183 | + /* Define the symbol as being at this point in the section. */ |
| @@ -3053,27 +3186,27 @@ index 0000000000..a357388115 | |||
| 3053 | + | 3186 | + |
| 3054 | + /* Increment the section size to make room for the symbol. */ | 3187 | + /* Increment the section size to make room for the symbol. */ |
| 3055 | + s->size += h->size; | 3188 | + s->size += h->size; |
| 3056 | + return TRUE; | 3189 | + return true; |
| 3057 | +} | 3190 | +} |
| 3058 | + | 3191 | + |
| 3059 | +/* Allocate space in .plt, .got and associated reloc sections for | 3192 | +/* Allocate space in .plt, .got and associated reloc sections for |
| 3060 | + dynamic relocs. */ | 3193 | + dynamic relocs. */ |
| 3061 | + | 3194 | + |
| 3062 | +static bfd_boolean | 3195 | +static bool |
| 3063 | +allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | 3196 | +allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) |
| 3064 | +{ | 3197 | +{ |
| 3065 | + struct bfd_link_info *info; | 3198 | + struct bfd_link_info *info; |
| 3066 | + struct elf64_mb_link_hash_table *htab; | 3199 | + struct elf64_mb_link_hash_table *htab; |
| 3067 | + struct elf64_mb_link_hash_entry *eh; | 3200 | + struct elf64_mb_link_hash_entry *eh; |
| 3068 | + struct elf64_mb_dyn_relocs *p; | 3201 | + struct elf_dyn_relocs *p; |
| 3069 | + | 3202 | + |
| 3070 | + if (h->root.type == bfd_link_hash_indirect) | 3203 | + if (h->root.type == bfd_link_hash_indirect) |
| 3071 | + return TRUE; | 3204 | + return true; |
| 3072 | + | 3205 | + |
| 3073 | + info = (struct bfd_link_info *) dat; | 3206 | + info = (struct bfd_link_info *) dat; |
| 3074 | + htab = elf64_mb_hash_table (info); | 3207 | + htab = elf64_mb_hash_table (info); |
| 3075 | + if (htab == NULL) | 3208 | + if (htab == NULL) |
| 3076 | + return FALSE; | 3209 | + return false; |
| 3077 | + | 3210 | + |
| 3078 | + if (htab->elf.dynamic_sections_created | 3211 | + if (htab->elf.dynamic_sections_created |
| 3079 | + && h->plt.refcount > 0) | 3212 | + && h->plt.refcount > 0) |
| @@ -3084,12 +3217,12 @@ index 0000000000..a357388115 | |||
| 3084 | + && !h->forced_local) | 3217 | + && !h->forced_local) |
| 3085 | + { | 3218 | + { |
| 3086 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) | 3219 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
| 3087 | + return FALSE; | 3220 | + return false; |
| 3088 | + } | 3221 | + } |
| 3089 | + | 3222 | + |
| 3090 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) | 3223 | + if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h)) |
| 3091 | + { | 3224 | + { |
| 3092 | + asection *s = htab->splt; | 3225 | + asection *s = htab->elf.splt; |
| 3093 | + | 3226 | + |
| 3094 | + /* The first entry in .plt is reserved. */ | 3227 | + /* The first entry in .plt is reserved. */ |
| 3095 | + if (s->size == 0) | 3228 | + if (s->size == 0) |
| @@ -3143,7 +3276,7 @@ index 0000000000..a357388115 | |||
| 3143 | + && !h->forced_local) | 3276 | + && !h->forced_local) |
| 3144 | + { | 3277 | + { |
| 3145 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) | 3278 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
| 3146 | + return FALSE; | 3279 | + return false; |
| 3147 | + } | 3280 | + } |
| 3148 | + | 3281 | + |
| 3149 | + need = 0; | 3282 | + need = 0; |
| @@ -3184,7 +3317,7 @@ index 0000000000..a357388115 | |||
| 3184 | + h->got.offset = (bfd_vma) -1; | 3317 | + h->got.offset = (bfd_vma) -1; |
| 3185 | + | 3318 | + |
| 3186 | + if (h->dyn_relocs == NULL) | 3319 | + if (h->dyn_relocs == NULL) |
| 3187 | + return TRUE; | 3320 | + return true; |
| 3188 | + | 3321 | + |
| 3189 | + /* In the shared -Bsymbolic case, discard space allocated for | 3322 | + /* In the shared -Bsymbolic case, discard space allocated for |
| 3190 | + dynamic pc-relative relocs against symbols which turn out to be | 3323 | + dynamic pc-relative relocs against symbols which turn out to be |
| @@ -3198,7 +3331,7 @@ index 0000000000..a357388115 | |||
| 3198 | + && (h->forced_local | 3331 | + && (h->forced_local |
| 3199 | + || info->symbolic)) | 3332 | + || info->symbolic)) |
| 3200 | + { | 3333 | + { |
| 3201 | + struct elf64_mb_dyn_relocs **pp; | 3334 | + struct elf_dyn_relocs **pp; |
| 3202 | + | 3335 | + |
| 3203 | + for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) | 3336 | + for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) |
| 3204 | + { | 3337 | + { |
| @@ -3232,7 +3365,7 @@ index 0000000000..a357388115 | |||
| 3232 | + && !h->forced_local) | 3365 | + && !h->forced_local) |
| 3233 | + { | 3366 | + { |
| 3234 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) | 3367 | + if (! bfd_elf_link_record_dynamic_symbol (info, h)) |
| 3235 | + return FALSE; | 3368 | + return false; |
| 3236 | + } | 3369 | + } |
| 3237 | + | 3370 | + |
| 3238 | + /* If that succeeded, we know we'll be keeping all the | 3371 | + /* If that succeeded, we know we'll be keeping all the |
| @@ -3253,12 +3386,12 @@ index 0000000000..a357388115 | |||
| 3253 | + sreloc->size += p->count * sizeof (Elf64_External_Rela); | 3386 | + sreloc->size += p->count * sizeof (Elf64_External_Rela); |
| 3254 | + } | 3387 | + } |
| 3255 | + | 3388 | + |
| 3256 | + return TRUE; | 3389 | + return true; |
| 3257 | +} | 3390 | +} |
| 3258 | + | 3391 | + |
| 3259 | +/* Set the sizes of the dynamic sections. */ | 3392 | +/* Set the sizes of the dynamic sections. */ |
| 3260 | + | 3393 | + |
| 3261 | +static bfd_boolean | 3394 | +static bool |
| 3262 | +microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, | 3395 | +microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, |
| 3263 | + struct bfd_link_info *info) | 3396 | + struct bfd_link_info *info) |
| 3264 | +{ | 3397 | +{ |
| @@ -3269,7 +3402,7 @@ index 0000000000..a357388115 | |||
| 3269 | + | 3402 | + |
| 3270 | + htab = elf64_mb_hash_table (info); | 3403 | + htab = elf64_mb_hash_table (info); |
| 3271 | + if (htab == NULL) | 3404 | + if (htab == NULL) |
| 3272 | + return FALSE; | 3405 | + return false; |
| 3273 | + | 3406 | + |
| 3274 | + dynobj = htab->elf.dynobj; | 3407 | + dynobj = htab->elf.dynobj; |
| 3275 | + BFD_ASSERT (dynobj != NULL); | 3408 | + BFD_ASSERT (dynobj != NULL); |
| @@ -3290,9 +3423,9 @@ index 0000000000..a357388115 | |||
| 3290 | + | 3423 | + |
| 3291 | + for (s = ibfd->sections; s != NULL; s = s->next) | 3424 | + for (s = ibfd->sections; s != NULL; s = s->next) |
| 3292 | + { | 3425 | + { |
| 3293 | + struct elf64_mb_dyn_relocs *p; | 3426 | + struct elf_dyn_relocs *p; |
| 3294 | + | 3427 | + |
| 3295 | + for (p = ((struct elf64_mb_dyn_relocs *) | 3428 | + for (p = ((struct elf_dyn_relocs *) |
| 3296 | + elf_section_data (s)->local_dynrel); | 3429 | + elf_section_data (s)->local_dynrel); |
| 3297 | + p != NULL; | 3430 | + p != NULL; |
| 3298 | + p = p->next) | 3431 | + p = p->next) |
| @@ -3385,7 +3518,7 @@ index 0000000000..a357388115 | |||
| 3385 | + for (s = dynobj->sections; s != NULL; s = s->next) | 3518 | + for (s = dynobj->sections; s != NULL; s = s->next) |
| 3386 | + { | 3519 | + { |
| 3387 | + const char *name; | 3520 | + const char *name; |
| 3388 | + bfd_boolean strip = FALSE; | 3521 | + bool strip = false; |
| 3389 | + | 3522 | + |
| 3390 | + if ((s->flags & SEC_LINKER_CREATED) == 0) | 3523 | + if ((s->flags & SEC_LINKER_CREATED) == 0) |
| 3391 | + continue; | 3524 | + continue; |
| @@ -3394,7 +3527,7 @@ index 0000000000..a357388115 | |||
| 3394 | + of the dynobj section names depend upon the input files. */ | 3527 | + of the dynobj section names depend upon the input files. */ |
| 3395 | + name = bfd_section_name (s); | 3528 | + name = bfd_section_name (s); |
| 3396 | + | 3529 | + |
| 3397 | + if (strncmp (name, ".rela", 5) == 0) | 3530 | + if (startswith (name, ".rela")) |
| 3398 | + { | 3531 | + { |
| 3399 | + if (s->size == 0) | 3532 | + if (s->size == 0) |
| 3400 | + { | 3533 | + { |
| @@ -3407,7 +3540,7 @@ index 0000000000..a357388115 | |||
| 3407 | + adjust_dynamic_symbol is called, and it is that | 3540 | + adjust_dynamic_symbol is called, and it is that |
| 3408 | + function which decides whether anything needs to go | 3541 | + function which decides whether anything needs to go |
| 3409 | + into these sections. */ | 3542 | + into these sections. */ |
| 3410 | + strip = TRUE; | 3543 | + strip = true; |
| 3411 | + } | 3544 | + } |
| 3412 | + else | 3545 | + else |
| 3413 | + { | 3546 | + { |
| @@ -3427,67 +3560,31 @@ index 0000000000..a357388115 | |||
| 3427 | + } | 3560 | + } |
| 3428 | + | 3561 | + |
| 3429 | + if (strip) | 3562 | + if (strip) |
| 3430 | + { | 3563 | + { |
| 3431 | + s->flags |= SEC_EXCLUDE; | 3564 | + s->flags |= SEC_EXCLUDE; |
| 3432 | + continue; | 3565 | + continue; |
| 3433 | + } | 3566 | + } |
| 3434 | + | 3567 | + |
| 3435 | + /* Allocate memory for the section contents. */ | 3568 | + /* Allocate memory for the section contents. */ |
| 3436 | + /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. | 3569 | + /* FIXME: This should be a call to bfd_alloc not bfd_zalloc. |
| 3437 | + Unused entries should be reclaimed before the section's contents | 3570 | + Unused entries should be reclaimed before the section's contents |
| 3438 | + are written out, but at the moment this does not happen. Thus in | 3571 | + are written out, but at the moment this does not happen. Thus in |
| 3439 | + order to prevent writing out garbage, we initialise the section's | 3572 | + order to prevent writing out garbage, we initialise the section's |
| 3440 | + contents to zero. */ | 3573 | + contents to zero. */ |
| 3441 | + s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); | 3574 | + s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->size); |
| 3442 | + if (s->contents == NULL && s->size != 0) | 3575 | + if (s->contents == NULL && s->size != 0) |
| 3443 | + return FALSE; | 3576 | + return false; |
| 3444 | + } | 3577 | + } |
| 3445 | + | 3578 | + |
| 3446 | + if (elf_hash_table (info)->dynamic_sections_created) | 3579 | + /* ??? Force DF_BIND_NOW? */ |
| 3447 | + { | 3580 | + info->flags |= DF_BIND_NOW; |
| 3448 | + /* Add some entries to the .dynamic section. We fill in the | 3581 | + return _bfd_elf_add_dynamic_tags (output_bfd, info, true); |
| 3449 | + values later, in microblaze_elf_finish_dynamic_sections, but we | ||
| 3450 | + must add the entries now so that we get the correct size for | ||
| 3451 | + the .dynamic section. The DT_DEBUG entry is filled in by the | ||
| 3452 | + dynamic linker and used by the debugger. */ | ||
| 3453 | +#define add_dynamic_entry(TAG, VAL) \ | ||
| 3454 | + _bfd_elf_add_dynamic_entry (info, TAG, VAL) | ||
| 3455 | + | ||
| 3456 | + if (bfd_link_executable (info)) | ||
| 3457 | + { | ||
| 3458 | + if (!add_dynamic_entry (DT_DEBUG, 0)) | ||
| 3459 | + return FALSE; | ||
| 3460 | + } | ||
| 3461 | + | ||
| 3462 | + if (!add_dynamic_entry (DT_RELA, 0) | ||
| 3463 | + || !add_dynamic_entry (DT_RELASZ, 0) | ||
| 3464 | + || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela))) | ||
| 3465 | + return FALSE; | ||
| 3466 | + | ||
| 3467 | + if (htab->splt->size != 0) | ||
| 3468 | + { | ||
| 3469 | + if (!add_dynamic_entry (DT_PLTGOT, 0) | ||
| 3470 | + || !add_dynamic_entry (DT_PLTRELSZ, 0) | ||
| 3471 | + || !add_dynamic_entry (DT_PLTREL, DT_RELA) | ||
| 3472 | + || !add_dynamic_entry (DT_JMPREL, 0) | ||
| 3473 | + || !add_dynamic_entry (DT_BIND_NOW, 1)) | ||
| 3474 | + return FALSE; | ||
| 3475 | + } | ||
| 3476 | + | ||
| 3477 | + if (info->flags & DF_TEXTREL) | ||
| 3478 | + { | ||
| 3479 | + if (!add_dynamic_entry (DT_TEXTREL, 0)) | ||
| 3480 | + return FALSE; | ||
| 3481 | + } | ||
| 3482 | + } | ||
| 3483 | +#undef add_dynamic_entry | ||
| 3484 | + return TRUE; | ||
| 3485 | +} | 3582 | +} |
| 3486 | + | 3583 | + |
| 3487 | +/* Finish up dynamic symbol handling. We set the contents of various | 3584 | +/* Finish up dynamic symbol handling. We set the contents of various |
| 3488 | + dynamic sections here. */ | 3585 | + dynamic sections here. */ |
| 3489 | + | 3586 | + |
| 3490 | +static bfd_boolean | 3587 | +static bool |
| 3491 | +microblaze_elf_finish_dynamic_symbol (bfd *output_bfd, | 3588 | +microblaze_elf_finish_dynamic_symbol (bfd *output_bfd, |
| 3492 | + struct bfd_link_info *info, | 3589 | + struct bfd_link_info *info, |
| 3493 | + struct elf_link_hash_entry *h, | 3590 | + struct elf_link_hash_entry *h, |
| @@ -3498,7 +3595,7 @@ index 0000000000..a357388115 | |||
| 3498 | + | 3595 | + |
| 3499 | + htab = elf64_mb_hash_table (info); | 3596 | + htab = elf64_mb_hash_table (info); |
| 3500 | + if (htab == NULL) | 3597 | + if (htab == NULL) |
| 3501 | + return FALSE; | 3598 | + return false; |
| 3502 | + | 3599 | + |
| 3503 | + if (h->plt.offset != (bfd_vma) -1) | 3600 | + if (h->plt.offset != (bfd_vma) -1) |
| 3504 | + { | 3601 | + { |
| @@ -3515,9 +3612,9 @@ index 0000000000..a357388115 | |||
| 3515 | + it up. */ | 3612 | + it up. */ |
| 3516 | + BFD_ASSERT (h->dynindx != -1); | 3613 | + BFD_ASSERT (h->dynindx != -1); |
| 3517 | + | 3614 | + |
| 3518 | + splt = htab->splt; | 3615 | + splt = htab->elf.splt; |
| 3519 | + srela = htab->srelplt; | 3616 | + srela = htab->elf.srelplt; |
| 3520 | + sgotplt = htab->sgotplt; | 3617 | + sgotplt = htab->elf.sgotplt; |
| 3521 | + BFD_ASSERT (splt != NULL && srela != NULL && sgotplt != NULL); | 3618 | + BFD_ASSERT (splt != NULL && srela != NULL && sgotplt != NULL); |
| 3522 | + | 3619 | + |
| 3523 | + plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; /* first entry reserved. */ | 3620 | + plt_index = h->plt.offset / PLT_ENTRY_SIZE - 1; /* first entry reserved. */ |
| @@ -3593,16 +3690,23 @@ index 0000000000..a357388115 | |||
| 3593 | + if (bfd_link_pic (info) | 3690 | + if (bfd_link_pic (info) |
| 3594 | + && ((info->symbolic && h->def_regular) | 3691 | + && ((info->symbolic && h->def_regular) |
| 3595 | + || h->dynindx == -1)) | 3692 | + || h->dynindx == -1)) |
| 3596 | + { | 3693 | + { |
| 3597 | + asection *sec = h->root.u.def.section; | 3694 | + asection *sec = h->root.u.def.section; |
| 3598 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 3695 | + bfd_vma value; |
| 3599 | + srela, srela->reloc_count++, | 3696 | + |
| 3600 | + /* symindex= */ 0, | 3697 | + value = h->root.u.def.value; |
| 3601 | + R_MICROBLAZE_REL, offset, | 3698 | + if (sec->output_section != NULL) |
| 3602 | + h->root.u.def.value | 3699 | + /* PR 21180: If the output section is NULL, then the symbol is no |
| 3603 | + + sec->output_section->vma | 3700 | + longer needed, and in theory the GOT entry is redundant. But |
| 3604 | + + sec->output_offset); | 3701 | + it is too late to change our minds now... */ |
| 3605 | + } | 3702 | + value += sec->output_section->vma + sec->output_offset; |
| 3703 | + | ||
| 3704 | + microblaze_elf_output_dynamic_relocation (output_bfd, | ||
| 3705 | + srela, srela->reloc_count++, | ||
| 3706 | + /* symindex= */ 0, | ||
| 3707 | + R_MICROBLAZE_REL, offset, | ||
| 3708 | + value); | ||
| 3709 | + } | ||
| 3606 | + else | 3710 | + else |
| 3607 | + { | 3711 | + { |
| 3608 | + microblaze_elf_output_dynamic_relocation (output_bfd, | 3712 | + microblaze_elf_output_dynamic_relocation (output_bfd, |
| @@ -3626,16 +3730,17 @@ index 0000000000..a357388115 | |||
| 3626 | + | 3730 | + |
| 3627 | + BFD_ASSERT (h->dynindx != -1); | 3731 | + BFD_ASSERT (h->dynindx != -1); |
| 3628 | + | 3732 | + |
| 3629 | + s = bfd_get_linker_section (htab->elf.dynobj, ".rela.bss"); | ||
| 3630 | + BFD_ASSERT (s != NULL); | ||
| 3631 | + | ||
| 3632 | + rela.r_offset = (h->root.u.def.value | 3733 | + rela.r_offset = (h->root.u.def.value |
| 3633 | + + h->root.u.def.section->output_section->vma | 3734 | + + h->root.u.def.section->output_section->vma |
| 3634 | + + h->root.u.def.section->output_offset); | 3735 | + + h->root.u.def.section->output_offset); |
| 3635 | + rela.r_info = ELF64_R_INFO (h->dynindx, R_MICROBLAZE_COPY); | 3736 | + rela.r_info = ELF64_R_INFO (h->dynindx, R_MICROBLAZE_COPY); |
| 3636 | + rela.r_addend = 0; | 3737 | + rela.r_addend = 0; |
| 3637 | + loc = s->contents + s->reloc_count++ * sizeof (Elf64_External_Rela); | 3738 | + if (h->root.u.def.section == htab->elf.sdynrelro) |
| 3638 | + bfd_elf64_swap_reloca_out (output_bfd, &rela, loc); | 3739 | + s = htab->elf.sreldynrelro; |
| 3740 | + else | ||
| 3741 | + s = htab->elf.srelbss; | ||
| 3742 | + loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela); | ||
| 3743 | + bfd_elf32_swap_reloca_out (output_bfd, &rela, loc); | ||
| 3639 | + } | 3744 | + } |
| 3640 | + | 3745 | + |
| 3641 | + /* Mark some specially defined symbols as absolute. */ | 3746 | + /* Mark some specially defined symbols as absolute. */ |
| @@ -3644,13 +3749,13 @@ index 0000000000..a357388115 | |||
| 3644 | + || h == htab->elf.hplt) | 3749 | + || h == htab->elf.hplt) |
| 3645 | + sym->st_shndx = SHN_ABS; | 3750 | + sym->st_shndx = SHN_ABS; |
| 3646 | + | 3751 | + |
| 3647 | + return TRUE; | 3752 | + return true; |
| 3648 | +} | 3753 | +} |
| 3649 | + | 3754 | + |
| 3650 | + | 3755 | + |
| 3651 | +/* Finish up the dynamic sections. */ | 3756 | +/* Finish up the dynamic sections. */ |
| 3652 | + | 3757 | + |
| 3653 | +static bfd_boolean | 3758 | +static bool |
| 3654 | +microblaze_elf_finish_dynamic_sections (bfd *output_bfd, | 3759 | +microblaze_elf_finish_dynamic_sections (bfd *output_bfd, |
| 3655 | + struct bfd_link_info *info) | 3760 | + struct bfd_link_info *info) |
| 3656 | +{ | 3761 | +{ |
| @@ -3660,7 +3765,7 @@ index 0000000000..a357388115 | |||
| 3660 | + | 3765 | + |
| 3661 | + htab = elf64_mb_hash_table (info); | 3766 | + htab = elf64_mb_hash_table (info); |
| 3662 | + if (htab == NULL) | 3767 | + if (htab == NULL) |
| 3663 | + return FALSE; | 3768 | + return false; |
| 3664 | + | 3769 | + |
| 3665 | + dynobj = htab->elf.dynobj; | 3770 | + dynobj = htab->elf.dynobj; |
| 3666 | + | 3771 | + |
| @@ -3671,57 +3776,63 @@ index 0000000000..a357388115 | |||
| 3671 | + asection *splt; | 3776 | + asection *splt; |
| 3672 | + Elf64_External_Dyn *dyncon, *dynconend; | 3777 | + Elf64_External_Dyn *dyncon, *dynconend; |
| 3673 | + | 3778 | + |
| 3674 | + splt = bfd_get_linker_section (dynobj, ".plt"); | 3779 | + dyncon = (Elf32_External_Dyn *) sdyn->contents; |
| 3675 | + BFD_ASSERT (splt != NULL && sdyn != NULL); | 3780 | + dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size); |
| 3676 | + | ||
| 3677 | + dyncon = (Elf64_External_Dyn *) sdyn->contents; | ||
| 3678 | + dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size); | ||
| 3679 | + for (; dyncon < dynconend; dyncon++) | 3781 | + for (; dyncon < dynconend; dyncon++) |
| 3680 | + { | 3782 | + { |
| 3681 | + Elf_Internal_Dyn dyn; | 3783 | + Elf_Internal_Dyn dyn; |
| 3682 | + const char *name; | 3784 | + asection *s; |
| 3683 | + bfd_boolean size; | 3785 | + bool size; |
| 3684 | + | 3786 | + |
| 3685 | + bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); | 3787 | + bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn); |
| 3686 | + | 3788 | + |
| 3687 | + switch (dyn.d_tag) | 3789 | + switch (dyn.d_tag) |
| 3688 | + { | 3790 | + { |
| 3689 | + case DT_PLTGOT: name = ".got.plt"; size = FALSE; break; | 3791 | + case DT_PLTGOT: |
| 3690 | + case DT_PLTRELSZ: name = ".rela.plt"; size = TRUE; break; | 3792 | + s = htab->elf.sgotplt; |
| 3691 | + case DT_JMPREL: name = ".rela.plt"; size = FALSE; break; | 3793 | + size = false; |
| 3692 | + case DT_RELA: name = ".rela.dyn"; size = FALSE; break; | 3794 | + break; |
| 3693 | + case DT_RELASZ: name = ".rela.dyn"; size = TRUE; break; | ||
| 3694 | + default: name = NULL; size = FALSE; break; | ||
| 3695 | + } | ||
| 3696 | + | 3795 | + |
| 3697 | + if (name != NULL) | 3796 | + case DT_PLTRELSZ: |
| 3698 | + { | 3797 | + s = htab->elf.srelplt; |
| 3699 | + asection *s; | 3798 | + size = true; |
| 3799 | + break; | ||
| 3700 | + | 3800 | + |
| 3701 | + s = bfd_get_section_by_name (output_bfd, name); | 3801 | + case DT_JMPREL: |
| 3702 | + if (s == NULL) | 3802 | + s = htab->elf.srelplt; |
| 3703 | + dyn.d_un.d_val = 0; | 3803 | + size = false; |
| 3704 | + else | 3804 | + break; |
| 3705 | + { | 3805 | + |
| 3706 | + if (! size) | 3806 | + default: |
| 3707 | + dyn.d_un.d_ptr = s->vma; | 3807 | + continue; |
| 3708 | + else | 3808 | + } |
| 3709 | + dyn.d_un.d_val = s->size; | 3809 | + |
| 3710 | + } | 3810 | + if (s == NULL) |
| 3711 | + bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); | 3811 | + dyn.d_un.d_val = 0; |
| 3712 | + } | 3812 | + else |
| 3713 | + } | 3813 | + { |
| 3814 | + if (!size) | ||
| 3815 | + dyn.d_un.d_ptr = s->output_section->vma + s->output_offset; | ||
| 3816 | + else | ||
| 3817 | + dyn.d_un.d_val = s->size; | ||
| 3818 | + } | ||
| 3819 | + bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon); | ||
| 3820 | + } | ||
| 3821 | + | ||
| 3822 | + splt = htab->elf.splt; | ||
| 3823 | + BFD_ASSERT (splt != NULL && sdyn != NULL); | ||
| 3714 | + | 3824 | + |
| 3715 | + /* Clear the first entry in the procedure linkage table, | 3825 | + /* Clear the first entry in the procedure linkage table, |
| 3716 | + and put a nop in the last four bytes. */ | 3826 | + and put a nop in the last four bytes. */ |
| 3717 | + if (splt->size > 0) | 3827 | + if (splt->size > 0) |
| 3718 | + { | 3828 | + { |
| 3719 | + memset (splt->contents, 0, PLT_ENTRY_SIZE); | 3829 | + memset (splt->contents, 0, PLT_ENTRY_SIZE); |
| 3720 | + bfd_put_32 (output_bfd, (bfd_vma) 0x80000000 /* nop. */, | 3830 | + bfd_put_32 (output_bfd, (bfd_vma) 0x80000000 /* nop. */, |
| 3721 | + splt->contents + splt->size - 4); | 3831 | + splt->contents + splt->size - 4); |
| 3722 | + } | ||
| 3723 | + | 3832 | + |
| 3724 | + elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; | 3833 | + if (splt->output_section != bfd_abs_section_ptr) |
| 3834 | + elf_section_data (splt->output_section)->this_hdr.sh_entsize = 4; | ||
| 3835 | + } | ||
| 3725 | + } | 3836 | + } |
| 3726 | + | 3837 | + |
| 3727 | + /* Set the first entry in the global offset table to the address of | 3838 | + /* Set the first entry in the global offset table to the address of |
| @@ -3741,13 +3852,13 @@ index 0000000000..a357388115 | |||
| 3741 | + if (htab->elf.sgot && htab->elf.sgot->size > 0) | 3852 | + if (htab->elf.sgot && htab->elf.sgot->size > 0) |
| 3742 | + elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4; | 3853 | + elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4; |
| 3743 | + | 3854 | + |
| 3744 | + return TRUE; | 3855 | + return true; |
| 3745 | +} | 3856 | +} |
| 3746 | + | 3857 | + |
| 3747 | +/* Hook called by the linker routine which adds symbols from an object | 3858 | +/* Hook called by the linker routine which adds symbols from an object |
| 3748 | + file. We use it to put .comm items in .sbss, and not .bss. */ | 3859 | + file. We use it to put .comm items in .sbss, and not .bss. */ |
| 3749 | + | 3860 | + |
| 3750 | +static bfd_boolean | 3861 | +static bool |
| 3751 | +microblaze_elf_add_symbol_hook (bfd *abfd, | 3862 | +microblaze_elf_add_symbol_hook (bfd *abfd, |
| 3752 | + struct bfd_link_info *info, | 3863 | + struct bfd_link_info *info, |
| 3753 | + Elf_Internal_Sym *sym, | 3864 | + Elf_Internal_Sym *sym, |
| @@ -3764,13 +3875,13 @@ index 0000000000..a357388115 | |||
| 3764 | + put into .sbss. */ | 3875 | + put into .sbss. */ |
| 3765 | + *secp = bfd_make_section_old_way (abfd, ".sbss"); | 3876 | + *secp = bfd_make_section_old_way (abfd, ".sbss"); |
| 3766 | + if (*secp == NULL | 3877 | + if (*secp == NULL |
| 3767 | + || !bfd_set_section_flags (*secp, SEC_IS_COMMON)) | 3878 | + || !bfd_set_section_flags (*secp, SEC_IS_COMMON | SEC_SMALL_DATA)) |
| 3768 | + return FALSE; | 3879 | + return false; |
| 3769 | + | 3880 | + |
| 3770 | + *valp = sym->st_size; | 3881 | + *valp = sym->st_size; |
| 3771 | + } | 3882 | + } |
| 3772 | + | 3883 | + |
| 3773 | + return TRUE; | 3884 | + return true; |
| 3774 | +} | 3885 | +} |
| 3775 | + | 3886 | + |
| 3776 | +#define TARGET_LITTLE_SYM microblaze_elf64_le_vec | 3887 | +#define TARGET_LITTLE_SYM microblaze_elf64_le_vec |
| @@ -3791,34 +3902,78 @@ index 0000000000..a357388115 | |||
| 3791 | +#define bfd_elf64_bfd_is_local_label_name microblaze_elf_is_local_label_name | 3902 | +#define bfd_elf64_bfd_is_local_label_name microblaze_elf_is_local_label_name |
| 3792 | +#define elf_backend_relocate_section microblaze_elf_relocate_section | 3903 | +#define elf_backend_relocate_section microblaze_elf_relocate_section |
| 3793 | +#define bfd_elf64_bfd_relax_section microblaze_elf_relax_section | 3904 | +#define bfd_elf64_bfd_relax_section microblaze_elf_relax_section |
| 3794 | +#define bfd_elf64_bfd_merge_private_bfd_data microblaze_elf_merge_private_bfd_data | 3905 | +#define bfd_elf64_bfd_merge_private_bfd_data _bfd_generic_verify_endian_match |
| 3795 | +#define bfd_elf64_bfd_reloc_name_lookup microblaze_elf_reloc_name_lookup | 3906 | +#define bfd_elf64_bfd_reloc_name_lookup microblaze_elf_reloc_name_lookup |
| 3796 | + | 3907 | + |
| 3797 | +#define elf_backend_gc_mark_hook microblaze_elf_gc_mark_hook | 3908 | +#define elf_backend_gc_mark_hook microblaze_elf_gc_mark_hook |
| 3798 | +#define elf_backend_gc_sweep_hook microblaze_elf_gc_sweep_hook | 3909 | +#define elf_backend_check_relocs microblaze_elf_check_relocs |
| 3799 | +#define elf_backend_check_relocs microblaze_elf_check_relocs | 3910 | +#define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol |
| 3800 | +#define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol | 3911 | +#define bfd_elf32_bfd_link_hash_table_create microblaze_elf_link_hash_table_create |
| 3801 | +#define bfd_elf64_bfd_link_hash_table_create microblaze_elf_link_hash_table_create | ||
| 3802 | +#define elf_backend_can_gc_sections 1 | 3912 | +#define elf_backend_can_gc_sections 1 |
| 3803 | +#define elf_backend_can_refcount 1 | 3913 | +#define elf_backend_can_refcount 1 |
| 3804 | +#define elf_backend_want_got_plt 1 | 3914 | +#define elf_backend_want_got_plt 1 |
| 3805 | +#define elf_backend_plt_readonly 1 | 3915 | +#define elf_backend_plt_readonly 1 |
| 3806 | +#define elf_backend_got_header_size 12 | 3916 | +#define elf_backend_got_header_size 12 |
| 3807 | +#define elf_backend_rela_normal 1 | 3917 | +#define elf_backend_want_dynrelro 1 |
| 3808 | + | 3918 | +#define elf_backend_rela_normal 1 |
| 3809 | +#define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol | 3919 | +#define elf_backend_dtrel_excludes_plt 1 |
| 3810 | +#define elf_backend_create_dynamic_sections microblaze_elf_create_dynamic_sections | 3920 | + |
| 3811 | +#define elf_backend_finish_dynamic_sections microblaze_elf_finish_dynamic_sections | 3921 | +#define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol |
| 3812 | +#define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | 3922 | +#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections |
| 3813 | +#define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | 3923 | +#define elf_backend_finish_dynamic_sections microblaze_elf_finish_dynamic_sections |
| 3924 | +#define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | ||
| 3925 | +#define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | ||
| 3814 | +#define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | 3926 | +#define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook |
| 3815 | + | 3927 | + |
| 3816 | +#include "elf64-target.h" | 3928 | +#include "elf64-target.h" |
| 3929 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h | ||
| 3930 | index 4153b94564d..2caaf27bcd7 100644 | ||
| 3931 | --- a/bfd/libbfd.h | ||
| 3932 | +++ b/bfd/libbfd.h | ||
| 3933 | @@ -2990,7 +2990,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | ||
| 3934 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", | ||
| 3935 | "BFD_RELOC_MICROBLAZE_32_NONE", | ||
| 3936 | "BFD_RELOC_MICROBLAZE_64_NONE", | ||
| 3937 | + "BFD_RELOC_MICROBLAZE_64", | ||
| 3938 | "BFD_RELOC_MICROBLAZE_64_GOTPC", | ||
| 3939 | + "BFD_RELOC_MICROBLAZE_64_GPC", | ||
| 3940 | "BFD_RELOC_MICROBLAZE_64_GOT", | ||
| 3941 | "BFD_RELOC_MICROBLAZE_64_PLT", | ||
| 3942 | "BFD_RELOC_MICROBLAZE_64_GOTOFF", | ||
| 3943 | diff --git a/bfd/reloc.c b/bfd/reloc.c | ||
| 3944 | index 3a08f7a8a42..288a5026d27 100644 | ||
| 3945 | --- a/bfd/reloc.c | ||
| 3946 | +++ b/bfd/reloc.c | ||
| 3947 | @@ -6904,12 +6904,24 @@ ENUMDOC | ||
| 3948 | done here - only used for relaxing | ||
| 3949 | ENUM | ||
| 3950 | BFD_RELOC_MICROBLAZE_64_NONE | ||
| 3951 | +ENUMDOC | ||
| 3952 | + This is a 32 bit reloc that stores the 32 bit pc relative | ||
| 3953 | + value in two words (with an imml instruction). No relocation is | ||
| 3954 | + done here - only used for relaxing | ||
| 3955 | +ENUM | ||
| 3956 | + BFD_RELOC_MICROBLAZE_64 | ||
| 3957 | ENUMDOC | ||
| 3958 | This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 3959 | value in two words (with an imm instruction). No relocation is | ||
| 3960 | done here - only used for relaxing | ||
| 3961 | ENUM | ||
| 3962 | BFD_RELOC_MICROBLAZE_64_GOTPC | ||
| 3963 | +ENUMDOC | ||
| 3964 | + This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 3965 | + value in two words (with an imml instruction). No relocation is | ||
| 3966 | + done here - only used for relaxing | ||
| 3967 | +ENUM | ||
| 3968 | + BFD_RELOC_MICROBLAZE_64_GPC | ||
| 3969 | ENUMDOC | ||
| 3970 | This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 3971 | value in two words (with an imm instruction). The relocation is | ||
| 3817 | diff --git a/bfd/targets.c b/bfd/targets.c | 3972 | diff --git a/bfd/targets.c b/bfd/targets.c |
| 3818 | index 0732c5e429..1ec226b2f4 100644 | 3973 | index 89b49e721b4..22543016ffb 100644 |
| 3819 | --- a/bfd/targets.c | 3974 | --- a/bfd/targets.c |
| 3820 | +++ b/bfd/targets.c | 3975 | +++ b/bfd/targets.c |
| 3821 | @@ -782,6 +782,8 @@ extern const bfd_target mep_elf32_le_vec; | 3976 | @@ -791,6 +791,8 @@ extern const bfd_target mep_elf32_le_vec; |
| 3822 | extern const bfd_target metag_elf32_vec; | 3977 | extern const bfd_target metag_elf32_vec; |
| 3823 | extern const bfd_target microblaze_elf32_vec; | 3978 | extern const bfd_target microblaze_elf32_vec; |
| 3824 | extern const bfd_target microblaze_elf32_le_vec; | 3979 | extern const bfd_target microblaze_elf32_le_vec; |
| @@ -3827,7 +3982,7 @@ index 0732c5e429..1ec226b2f4 100644 | |||
| 3827 | extern const bfd_target mips_ecoff_be_vec; | 3982 | extern const bfd_target mips_ecoff_be_vec; |
| 3828 | extern const bfd_target mips_ecoff_le_vec; | 3983 | extern const bfd_target mips_ecoff_le_vec; |
| 3829 | extern const bfd_target mips_ecoff_bele_vec; | 3984 | extern const bfd_target mips_ecoff_bele_vec; |
| 3830 | @@ -1150,6 +1152,10 @@ static const bfd_target * const _bfd_target_vector[] = | 3985 | @@ -1156,6 +1158,10 @@ static const bfd_target * const _bfd_target_vector[] = |
| 3831 | 3986 | ||
| 3832 | &metag_elf32_vec, | 3987 | &metag_elf32_vec, |
| 3833 | 3988 | ||
| @@ -3839,7 +3994,7 @@ index 0732c5e429..1ec226b2f4 100644 | |||
| 3839 | 3994 | ||
| 3840 | &mips_ecoff_be_vec, | 3995 | &mips_ecoff_be_vec, |
| 3841 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 3996 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 3842 | index 5810a74a5f..ffbb843d33 100644 | 3997 | index 98d0c259246..378fb882f13 100644 |
| 3843 | --- a/gas/config/tc-microblaze.c | 3998 | --- a/gas/config/tc-microblaze.c |
| 3844 | +++ b/gas/config/tc-microblaze.c | 3999 | +++ b/gas/config/tc-microblaze.c |
| 3845 | @@ -35,10 +35,13 @@ | 4000 | @@ -35,10 +35,13 @@ |
| @@ -3855,8 +4010,45 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3855 | +#define OPTION_M64 (OPTION_MD_BASE + 4) | 4010 | +#define OPTION_M64 (OPTION_MD_BASE + 4) |
| 3856 | 4011 | ||
| 3857 | void microblaze_generate_symbol (char *sym); | 4012 | void microblaze_generate_symbol (char *sym); |
| 3858 | static bfd_boolean check_spl_reg (unsigned *); | 4013 | static bool check_spl_reg (unsigned *); |
| 3859 | @@ -773,6 +776,74 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) | 4014 | @@ -91,6 +94,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP"; |
| 4015 | #define TLSTPREL_OFFSET 16 | ||
| 4016 | #define TEXT_OFFSET 17 | ||
| 4017 | #define TEXT_PC_OFFSET 18 | ||
| 4018 | +#define DEFINED_64_OFFSET 19 | ||
| 4019 | |||
| 4020 | /* Initialize the relax table. */ | ||
| 4021 | const relax_typeS md_relax_table[] = | ||
| 4022 | @@ -113,7 +117,9 @@ const relax_typeS md_relax_table[] = | ||
| 4023 | { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 15: TLSGOTTPREL_OFFSET. */ | ||
| 4024 | { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 16: TLSTPREL_OFFSET. */ | ||
| 4025 | { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 17: TEXT_OFFSET. */ | ||
| 4026 | - { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 } /* 18: TEXT_PC_OFFSET. */ | ||
| 4027 | + { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 18: TEXT_PC_OFFSET. */ | ||
| 4028 | +// { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 } /* 16: TLSTPREL_OFFSET. */ | ||
| 4029 | + { 0x7fffffffffffffff, 0x8000000000000000, INST_WORD_SIZE, 0 } /* 17: DEFINED_64_OFFSET. */ | ||
| 4030 | }; | ||
| 4031 | |||
| 4032 | static htab_t opcode_hash_control; /* Opcode mnemonics. */ | ||
| 4033 | @@ -393,7 +399,8 @@ const pseudo_typeS md_pseudo_table[] = | ||
| 4034 | {"data32", cons, 4}, /* Same as word. */ | ||
| 4035 | {"ent", s_func, 0}, /* Treat ent as function entry point. */ | ||
| 4036 | {"end", microblaze_s_func, 1}, /* Treat end as function end point. */ | ||
| 4037 | - {"gpword", s_rva, 4}, /* gpword label => store resolved label address in data section. */ | ||
| 4038 | + {"gpword", s_rva, 8}, /* gpword label => store resolved label address in data section. */ | ||
| 4039 | + {"gpdword", s_rva, 8}, /* gpword label => store resolved label address in data section. */ | ||
| 4040 | {"weakext", microblaze_s_weakext, 0}, | ||
| 4041 | {"rodata", microblaze_s_rdata, 0}, | ||
| 4042 | {"sdata2", microblaze_s_rdata, 1}, | ||
| 4043 | @@ -402,6 +409,7 @@ const pseudo_typeS md_pseudo_table[] = | ||
| 4044 | {"sbss", microblaze_s_bss, 1}, | ||
| 4045 | {"text", microblaze_s_text, 0}, | ||
| 4046 | {"word", cons, 4}, | ||
| 4047 | + {"dword", cons, 8}, | ||
| 4048 | {"frame", s_ignore, 0}, | ||
| 4049 | {"mask", s_ignore, 0}, /* Emitted by gcc. */ | ||
| 4050 | {NULL, NULL, 0} | ||
| 4051 | @@ -773,6 +781,74 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) | ||
| 3860 | return new_pointer; | 4052 | return new_pointer; |
| 3861 | } | 4053 | } |
| 3862 | 4054 | ||
| @@ -3931,7 +4123,24 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3931 | static char * | 4123 | static char * |
| 3932 | check_got (int * got_type, int * got_len) | 4124 | check_got (int * got_type, int * got_len) |
| 3933 | { | 4125 | { |
| 3934 | @@ -920,6 +991,7 @@ md_assemble (char * str) | 4126 | @@ -827,7 +903,7 @@ check_got (int * got_type, int * got_len) |
| 4127 | extern bfd_reloc_code_real_type | ||
| 4128 | parse_cons_expression_microblaze (expressionS *exp, int size) | ||
| 4129 | { | ||
| 4130 | - if (size == 4) | ||
| 4131 | + if (size == 4 || (microblaze_arch_size == 64 && size == 8)) | ||
| 4132 | { | ||
| 4133 | /* Handle @GOTOFF et.al. */ | ||
| 4134 | char *save, *gotfree_copy; | ||
| 4135 | @@ -859,6 +935,7 @@ parse_cons_expression_microblaze (expressionS *exp, int size) | ||
| 4136 | |||
| 4137 | static const char * str_microblaze_ro_anchor = "RO"; | ||
| 4138 | static const char * str_microblaze_rw_anchor = "RW"; | ||
| 4139 | +static const char * str_microblaze_64 = "64"; | ||
| 4140 | |||
| 4141 | static bool | ||
| 4142 | check_spl_reg (unsigned * reg) | ||
| 4143 | @@ -920,6 +997,7 @@ md_assemble (char * str) | ||
| 3935 | unsigned int immed, immed2, temp; | 4144 | unsigned int immed, immed2, temp; |
| 3936 | expressionS exp; | 4145 | expressionS exp; |
| 3937 | char name[20]; | 4146 | char name[20]; |
| @@ -3939,7 +4148,41 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3939 | 4148 | ||
| 3940 | /* Drop leading whitespace. */ | 4149 | /* Drop leading whitespace. */ |
| 3941 | while (ISSPACE (* str)) | 4150 | while (ISSPACE (* str)) |
| 3942 | @@ -1129,7 +1201,7 @@ md_assemble (char * str) | 4151 | @@ -1106,6 +1184,33 @@ md_assemble (char * str) |
| 4152 | inst |= (immed << IMM_LOW) & IMM_MASK; | ||
| 4153 | } | ||
| 4154 | } | ||
| 4155 | +#if 0 //revisit | ||
| 4156 | + else if (streq (name, "lli") || streq (name, "sli")) | ||
| 4157 | + { | ||
| 4158 | + temp = immed & 0xFFFFFFFFFFFF8000; | ||
| 4159 | + if ((temp != 0) && (temp != 0xFFFFFFFFFFFF8000)) | ||
| 4160 | + { | ||
| 4161 | + /* Needs an immediate inst. */ | ||
| 4162 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 4163 | + if (opcode1 == NULL) | ||
| 4164 | + { | ||
| 4165 | + as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 4166 | + return; | ||
| 4167 | + } | ||
| 4168 | + | ||
| 4169 | + inst1 = opcode1->bit_sequence; | ||
| 4170 | + inst1 |= ((immedl & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | ||
| 4171 | + output[0] = INST_BYTE0 (inst1); | ||
| 4172 | + output[1] = INST_BYTE1 (inst1); | ||
| 4173 | + output[2] = INST_BYTE2 (inst1); | ||
| 4174 | + output[3] = INST_BYTE3 (inst1); | ||
| 4175 | + output = frag_more (isize); | ||
| 4176 | + } | ||
| 4177 | + inst |= (reg1 << RD_LOW) & RD_MASK; | ||
| 4178 | + inst |= (reg2 << RA_LOW) & RA_MASK; | ||
| 4179 | + inst |= (immed << IMM_LOW) & IMM_MASK; | ||
| 4180 | + } | ||
| 4181 | +#endif | ||
| 4182 | else | ||
| 4183 | { | ||
| 4184 | temp = immed & 0xFFFF8000; | ||
| 4185 | @@ -1135,7 +1240,7 @@ md_assemble (char * str) | ||
| 3943 | } | 4186 | } |
| 3944 | break; | 4187 | break; |
| 3945 | 4188 | ||
| @@ -3948,7 +4191,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3948 | if (strcmp (op_end, "")) | 4191 | if (strcmp (op_end, "")) |
| 3949 | op_end = parse_reg (op_end + 1, ®1); /* Get rd. */ | 4192 | op_end = parse_reg (op_end + 1, ®1); /* Get rd. */ |
| 3950 | else | 4193 | else |
| 3951 | @@ -1163,16 +1235,22 @@ md_assemble (char * str) | 4194 | @@ -1169,16 +1274,22 @@ md_assemble (char * str) |
| 3952 | immed = exp.X_add_number; | 4195 | immed = exp.X_add_number; |
| 3953 | } | 4196 | } |
| 3954 | 4197 | ||
| @@ -3974,7 +4217,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3974 | if (strcmp (op_end, "")) | 4217 | if (strcmp (op_end, "")) |
| 3975 | op_end = parse_reg (op_end + 1, ®1); /* Get rd. */ | 4218 | op_end = parse_reg (op_end + 1, ®1); /* Get rd. */ |
| 3976 | else | 4219 | else |
| 3977 | @@ -1196,7 +1274,7 @@ md_assemble (char * str) | 4220 | @@ -1202,7 +1313,7 @@ md_assemble (char * str) |
| 3978 | 4221 | ||
| 3979 | /* Width immediate value. */ | 4222 | /* Width immediate value. */ |
| 3980 | if (strcmp (op_end, "")) | 4223 | if (strcmp (op_end, "")) |
| @@ -3983,7 +4226,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3983 | else | 4226 | else |
| 3984 | as_fatal (_("Error in statement syntax")); | 4227 | as_fatal (_("Error in statement syntax")); |
| 3985 | if (exp.X_op != O_constant) | 4228 | if (exp.X_op != O_constant) |
| 3986 | @@ -1208,6 +1286,8 @@ md_assemble (char * str) | 4229 | @@ -1214,6 +1325,8 @@ md_assemble (char * str) |
| 3987 | immed = exp.X_add_number; | 4230 | immed = exp.X_add_number; |
| 3988 | if (opcode->instr == bsefi && immed > 31) | 4231 | if (opcode->instr == bsefi && immed > 31) |
| 3989 | as_fatal (_("Width value must be less than 32")); | 4232 | as_fatal (_("Width value must be less than 32")); |
| @@ -3992,7 +4235,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 3992 | 4235 | ||
| 3993 | /* Shift immediate value. */ | 4236 | /* Shift immediate value. */ |
| 3994 | if (strcmp (op_end, "")) | 4237 | if (strcmp (op_end, "")) |
| 3995 | @@ -1215,32 +1295,40 @@ md_assemble (char * str) | 4238 | @@ -1221,32 +1334,40 @@ md_assemble (char * str) |
| 3996 | else | 4239 | else |
| 3997 | as_fatal (_("Error in statement syntax")); | 4240 | as_fatal (_("Error in statement syntax")); |
| 3998 | if (exp.X_op != O_constant) | 4241 | if (exp.X_op != O_constant) |
| @@ -4044,7 +4287,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4044 | break; | 4287 | break; |
| 4045 | case INST_TYPE_R1_R2: | 4288 | case INST_TYPE_R1_R2: |
| 4046 | if (strcmp (op_end, "")) | 4289 | if (strcmp (op_end, "")) |
| 4047 | @@ -1808,6 +1896,142 @@ md_assemble (char * str) | 4290 | @@ -1820,6 +1941,143 @@ md_assemble (char * str) |
| 4048 | } | 4291 | } |
| 4049 | inst |= (immed << IMM_MBAR); | 4292 | inst |= (immed << IMM_MBAR); |
| 4050 | break; | 4293 | break; |
| @@ -4078,6 +4321,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4078 | + if (exp.X_op != O_constant) | 4321 | + if (exp.X_op != O_constant) |
| 4079 | + { | 4322 | + { |
| 4080 | + char *opc = NULL; | 4323 | + char *opc = NULL; |
| 4324 | + //char *opc = str_microblaze_64; | ||
| 4081 | + relax_substateT subtype; | 4325 | + relax_substateT subtype; |
| 4082 | + | 4326 | + |
| 4083 | + if (exp.X_md != 0) | 4327 | + if (exp.X_md != 0) |
| @@ -4091,7 +4335,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4091 | + subtype, /* PC-relative or not. */ | 4335 | + subtype, /* PC-relative or not. */ |
| 4092 | + exp.X_add_symbol, | 4336 | + exp.X_add_symbol, |
| 4093 | + exp.X_add_number, | 4337 | + exp.X_add_number, |
| 4094 | + opc); | 4338 | + (char *) opc); |
| 4095 | + immedl = 0L; | 4339 | + immedl = 0L; |
| 4096 | + } | 4340 | + } |
| 4097 | + else | 4341 | + else |
| @@ -4099,7 +4343,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4099 | + output = frag_more (isize); | 4343 | + output = frag_more (isize); |
| 4100 | + immedl = exp.X_add_number; | 4344 | + immedl = exp.X_add_number; |
| 4101 | + | 4345 | + |
| 4102 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 4346 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 4103 | + if (opcode1 == NULL) | 4347 | + if (opcode1 == NULL) |
| 4104 | + { | 4348 | + { |
| 4105 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 4349 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -4129,7 +4373,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4129 | + reg1 = 0; | 4373 | + reg1 = 0; |
| 4130 | + } | 4374 | + } |
| 4131 | + if (strcmp (op_end, "")) | 4375 | + if (strcmp (op_end, "")) |
| 4132 | + op_end = parse_imml (op_end + 1, & exp, MIN_IMM, MAX_IMM); | 4376 | + op_end = parse_imml (op_end + 1, & exp, MIN_IMML, MAX_IMML); |
| 4133 | + else | 4377 | + else |
| 4134 | + as_fatal (_("Error in statement syntax")); | 4378 | + as_fatal (_("Error in statement syntax")); |
| 4135 | + | 4379 | + |
| @@ -4139,7 +4383,8 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4139 | + | 4383 | + |
| 4140 | + if (exp.X_op != O_constant) | 4384 | + if (exp.X_op != O_constant) |
| 4141 | + { | 4385 | + { |
| 4142 | + char *opc = NULL; | 4386 | + //char *opc = NULL; |
| 4387 | + char *opc = str_microblaze_64; | ||
| 4143 | + relax_substateT subtype; | 4388 | + relax_substateT subtype; |
| 4144 | + | 4389 | + |
| 4145 | + if (exp.X_md != 0) | 4390 | + if (exp.X_md != 0) |
| @@ -4153,15 +4398,14 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4153 | + subtype, /* PC-relative or not. */ | 4398 | + subtype, /* PC-relative or not. */ |
| 4154 | + exp.X_add_symbol, | 4399 | + exp.X_add_symbol, |
| 4155 | + exp.X_add_number, | 4400 | + exp.X_add_number, |
| 4156 | + opc); | 4401 | + (char *) opc); |
| 4157 | + immedl = 0L; | 4402 | + immedl = 0L; |
| 4158 | + } | 4403 | + } |
| 4159 | + else | 4404 | + else |
| 4160 | + { | 4405 | + { |
| 4161 | + output = frag_more (isize); | 4406 | + output = frag_more (isize); |
| 4162 | + immedl = exp.X_add_number; | 4407 | + immedl = exp.X_add_number; |
| 4163 | + | 4408 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 4164 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 4165 | + if (opcode1 == NULL) | 4409 | + if (opcode1 == NULL) |
| 4166 | + { | 4410 | + { |
| 4167 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 4411 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -4187,7 +4431,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4187 | 4431 | ||
| 4188 | default: | 4432 | default: |
| 4189 | as_fatal (_("unimplemented opcode \"%s\""), name); | 4433 | as_fatal (_("unimplemented opcode \"%s\""), name); |
| 4190 | @@ -1915,6 +2139,7 @@ struct option md_longopts[] = | 4434 | @@ -1927,6 +2185,7 @@ struct option md_longopts[] = |
| 4191 | {"EL", no_argument, NULL, OPTION_EL}, | 4435 | {"EL", no_argument, NULL, OPTION_EL}, |
| 4192 | {"mlittle-endian", no_argument, NULL, OPTION_LITTLE}, | 4436 | {"mlittle-endian", no_argument, NULL, OPTION_LITTLE}, |
| 4193 | {"mbig-endian", no_argument, NULL, OPTION_BIG}, | 4437 | {"mbig-endian", no_argument, NULL, OPTION_BIG}, |
| @@ -4195,7 +4439,190 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4195 | { NULL, no_argument, NULL, 0} | 4439 | { NULL, no_argument, NULL, 0} |
| 4196 | }; | 4440 | }; |
| 4197 | 4441 | ||
| 4198 | @@ -2565,6 +2790,18 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | 4442 | @@ -1971,13 +2230,23 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, |
| 4443 | fragP->fr_fix += INST_WORD_SIZE * 2; | ||
| 4444 | fragP->fr_var = 0; | ||
| 4445 | break; | ||
| 4446 | + case DEFINED_64_OFFSET: | ||
| 4447 | + if (fragP->fr_symbol == GOT_symbol) | ||
| 4448 | + fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, | ||
| 4449 | + fragP->fr_offset, true, BFD_RELOC_MICROBLAZE_64_GPC); | ||
| 4450 | + else | ||
| 4451 | + fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, | ||
| 4452 | + fragP->fr_offset, true, BFD_RELOC_MICROBLAZE_64); | ||
| 4453 | + fragP->fr_fix += INST_WORD_SIZE * 2; | ||
| 4454 | + fragP->fr_var = 0; | ||
| 4455 | + break; | ||
| 4456 | case DEFINED_ABS_SEGMENT: | ||
| 4457 | if (fragP->fr_symbol == GOT_symbol) | ||
| 4458 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE * 2, fragP->fr_symbol, | ||
| 4459 | fragP->fr_offset, true, BFD_RELOC_MICROBLAZE_64_GOTPC); | ||
| 4460 | else | ||
| 4461 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE * 2, fragP->fr_symbol, | ||
| 4462 | - fragP->fr_offset, false, BFD_RELOC_64); | ||
| 4463 | + fragP->fr_offset, true, BFD_RELOC_64); | ||
| 4464 | fragP->fr_fix += INST_WORD_SIZE * 2; | ||
| 4465 | fragP->fr_var = 0; | ||
| 4466 | break; | ||
| 4467 | @@ -2198,23 +2467,38 @@ md_apply_fix (fixS * fixP, | ||
| 4468 | case BFD_RELOC_64_PCREL: | ||
| 4469 | case BFD_RELOC_64: | ||
| 4470 | case BFD_RELOC_MICROBLAZE_64_TEXTREL: | ||
| 4471 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 4472 | /* Add an imm instruction. First save the current instruction. */ | ||
| 4473 | for (i = 0; i < INST_WORD_SIZE; i++) | ||
| 4474 | buf[i + INST_WORD_SIZE] = buf[i]; | ||
| 4475 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | ||
| 4476 | + { | ||
| 4477 | + /* Generate the imm instruction. */ | ||
| 4478 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 4479 | + if (opcode1 == NULL) | ||
| 4480 | + { | ||
| 4481 | + as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 4482 | + return; | ||
| 4483 | + } | ||
| 4484 | |||
| 4485 | - /* Generate the imm instruction. */ | ||
| 4486 | - opcode1 | ||
| 4487 | - = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); | ||
| 4488 | - if (opcode1 == NULL) | ||
| 4489 | - { | ||
| 4490 | - as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 4491 | - return; | ||
| 4492 | - } | ||
| 4493 | - | ||
| 4494 | - inst1 = opcode1->bit_sequence; | ||
| 4495 | - if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | ||
| 4496 | - inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; | ||
| 4497 | - | ||
| 4498 | + inst1 = opcode1->bit_sequence; | ||
| 4499 | + if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | ||
| 4500 | + inst1 |= ((val & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | ||
| 4501 | + } | ||
| 4502 | + else | ||
| 4503 | + { | ||
| 4504 | + /* Generate the imm instruction. */ | ||
| 4505 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); | ||
| 4506 | + if (opcode1 == NULL) | ||
| 4507 | + { | ||
| 4508 | + as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 4509 | + return; | ||
| 4510 | + } | ||
| 4511 | + | ||
| 4512 | + inst1 = opcode1->bit_sequence; | ||
| 4513 | + if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | ||
| 4514 | + inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; | ||
| 4515 | + } | ||
| 4516 | buf[0] = INST_BYTE0 (inst1); | ||
| 4517 | buf[1] = INST_BYTE1 (inst1); | ||
| 4518 | buf[2] = INST_BYTE2 (inst1); | ||
| 4519 | @@ -2243,6 +2527,7 @@ md_apply_fix (fixS * fixP, | ||
| 4520 | /* Fall through. */ | ||
| 4521 | |||
| 4522 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 4523 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 4524 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 4525 | case BFD_RELOC_MICROBLAZE_64_PLT: | ||
| 4526 | case BFD_RELOC_MICROBLAZE_64_GOTOFF: | ||
| 4527 | @@ -2250,13 +2535,17 @@ md_apply_fix (fixS * fixP, | ||
| 4528 | /* Add an imm instruction. First save the current instruction. */ | ||
| 4529 | for (i = 0; i < INST_WORD_SIZE; i++) | ||
| 4530 | buf[i + INST_WORD_SIZE] = buf[i]; | ||
| 4531 | - | ||
| 4532 | /* Generate the imm instruction. */ | ||
| 4533 | - opcode1 | ||
| 4534 | - = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); | ||
| 4535 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) | ||
| 4536 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 4537 | + else | ||
| 4538 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); | ||
| 4539 | if (opcode1 == NULL) | ||
| 4540 | { | ||
| 4541 | - as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 4542 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) | ||
| 4543 | + as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 4544 | + else | ||
| 4545 | + as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 4546 | return; | ||
| 4547 | } | ||
| 4548 | |||
| 4549 | @@ -2280,6 +2569,8 @@ md_apply_fix (fixS * fixP, | ||
| 4550 | moves code around due to relaxing. */ | ||
| 4551 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) | ||
| 4552 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | ||
| 4553 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | ||
| 4554 | + fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | ||
| 4555 | else if (fixP->fx_r_type == BFD_RELOC_32) | ||
| 4556 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; | ||
| 4557 | else | ||
| 4558 | @@ -2323,6 +2614,32 @@ md_estimate_size_before_relax (fragS * fragP, | ||
| 4559 | as_bad (_("Absolute PC-relative value in relaxation code. Assembler error.....")); | ||
| 4560 | abort (); | ||
| 4561 | } | ||
| 4562 | + else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type | ||
| 4563 | + && !S_IS_WEAK (fragP->fr_symbol)) | ||
| 4564 | + { | ||
| 4565 | + if (fragP->fr_opcode != NULL) { | ||
| 4566 | + if(streq (fragP->fr_opcode, str_microblaze_64)) | ||
| 4567 | + { | ||
| 4568 | + /* Used as an absolute value. */ | ||
| 4569 | + fragP->fr_subtype = DEFINED_64_OFFSET; | ||
| 4570 | + /* Variable part does not change. */ | ||
| 4571 | + fragP->fr_var = INST_WORD_SIZE; | ||
| 4572 | + } | ||
| 4573 | + else | ||
| 4574 | + { | ||
| 4575 | + fragP->fr_subtype = DEFINED_PC_OFFSET; | ||
| 4576 | + /* Don't know now whether we need an imm instruction. */ | ||
| 4577 | + fragP->fr_var = INST_WORD_SIZE; | ||
| 4578 | + } | ||
| 4579 | + } | ||
| 4580 | + else | ||
| 4581 | + { | ||
| 4582 | + fragP->fr_subtype = DEFINED_PC_OFFSET; | ||
| 4583 | + /* Don't know now whether we need an imm instruction. */ | ||
| 4584 | + fragP->fr_var = INST_WORD_SIZE; | ||
| 4585 | + } | ||
| 4586 | + } | ||
| 4587 | + #if 0 | ||
| 4588 | else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type && | ||
| 4589 | !S_IS_WEAK (fragP->fr_symbol)) | ||
| 4590 | { | ||
| 4591 | @@ -2330,6 +2647,7 @@ md_estimate_size_before_relax (fragS * fragP, | ||
| 4592 | /* Don't know now whether we need an imm instruction. */ | ||
| 4593 | fragP->fr_var = INST_WORD_SIZE; | ||
| 4594 | } | ||
| 4595 | +#endif | ||
| 4596 | else if (S_IS_DEFINED (fragP->fr_symbol) | ||
| 4597 | && (((S_GET_SEGMENT (fragP->fr_symbol))->flags & SEC_CODE) == 0)) | ||
| 4598 | { | ||
| 4599 | @@ -2432,6 +2750,7 @@ md_estimate_size_before_relax (fragS * fragP, | ||
| 4600 | case TLSLD_OFFSET: | ||
| 4601 | case TLSTPREL_OFFSET: | ||
| 4602 | case TLSDTPREL_OFFSET: | ||
| 4603 | + case DEFINED_64_OFFSET: | ||
| 4604 | fragP->fr_var = INST_WORD_SIZE*2; | ||
| 4605 | break; | ||
| 4606 | case DEFINED_RO_SEGMENT: | ||
| 4607 | @@ -2485,7 +2804,7 @@ md_pcrel_from_section (fixS * fixp, segT sec ATTRIBUTE_UNUSED) | ||
| 4608 | else | ||
| 4609 | { | ||
| 4610 | /* The case where we are going to resolve things... */ | ||
| 4611 | - if (fixp->fx_r_type == BFD_RELOC_64_PCREL) | ||
| 4612 | + if (fixp->fx_r_type == BFD_RELOC_64_PCREL ||fixp->fx_r_type == BFD_RELOC_MICROBLAZE_64) | ||
| 4613 | return fixp->fx_where + fixp->fx_frag->fr_address + INST_WORD_SIZE; | ||
| 4614 | else | ||
| 4615 | return fixp->fx_where + fixp->fx_frag->fr_address; | ||
| 4616 | @@ -2518,6 +2837,8 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | ||
| 4617 | case BFD_RELOC_MICROBLAZE_32_RWSDA: | ||
| 4618 | case BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: | ||
| 4619 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 4620 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 4621 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 4622 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 4623 | case BFD_RELOC_MICROBLAZE_64_PLT: | ||
| 4624 | case BFD_RELOC_MICROBLAZE_64_GOTOFF: | ||
| 4625 | @@ -2578,6 +2899,18 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | ||
| 4199 | return rel; | 4626 | return rel; |
| 4200 | } | 4627 | } |
| 4201 | 4628 | ||
| @@ -4214,7 +4641,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4214 | int | 4641 | int |
| 4215 | md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) | 4642 | md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) |
| 4216 | { | 4643 | { |
| 4217 | @@ -2578,6 +2815,10 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) | 4644 | @@ -2591,6 +2924,10 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) |
| 4218 | case OPTION_LITTLE: | 4645 | case OPTION_LITTLE: |
| 4219 | target_big_endian = 0; | 4646 | target_big_endian = 0; |
| 4220 | break; | 4647 | break; |
| @@ -4225,7 +4652,7 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4225 | default: | 4652 | default: |
| 4226 | return 0; | 4653 | return 0; |
| 4227 | } | 4654 | } |
| 4228 | @@ -2593,6 +2834,7 @@ md_show_usage (FILE * stream ATTRIBUTE_UNUSED) | 4655 | @@ -2606,6 +2943,7 @@ md_show_usage (FILE * stream ATTRIBUTE_UNUSED) |
| 4229 | fprintf (stream, _(" MicroBlaze specific assembler options:\n")); | 4656 | fprintf (stream, _(" MicroBlaze specific assembler options:\n")); |
| 4230 | fprintf (stream, " -%-23s%s\n", "mbig-endian", N_("assemble for a big endian cpu")); | 4657 | fprintf (stream, " -%-23s%s\n", "mbig-endian", N_("assemble for a big endian cpu")); |
| 4231 | fprintf (stream, " -%-23s%s\n", "mlittle-endian", N_("assemble for a little endian cpu")); | 4658 | fprintf (stream, " -%-23s%s\n", "mlittle-endian", N_("assemble for a little endian cpu")); |
| @@ -4233,8 +4660,20 @@ index 5810a74a5f..ffbb843d33 100644 | |||
| 4233 | } | 4660 | } |
| 4234 | 4661 | ||
| 4235 | 4662 | ||
| 4663 | @@ -2643,7 +2981,10 @@ cons_fix_new_microblaze (fragS * frag, | ||
| 4664 | r = BFD_RELOC_32; | ||
| 4665 | break; | ||
| 4666 | case 8: | ||
| 4667 | - r = BFD_RELOC_64; | ||
| 4668 | + if (microblaze_arch_size == 64) | ||
| 4669 | + r = BFD_RELOC_32; | ||
| 4670 | + else | ||
| 4671 | + r = BFD_RELOC_64; | ||
| 4672 | break; | ||
| 4673 | default: | ||
| 4674 | as_bad (_("unsupported BFD relocation size %u"), size); | ||
| 4236 | diff --git a/gas/config/tc-microblaze.h b/gas/config/tc-microblaze.h | 4675 | diff --git a/gas/config/tc-microblaze.h b/gas/config/tc-microblaze.h |
| 4237 | index 01cb3e894f..7435a70ef5 100644 | 4676 | index c6d33f873c4..34aa1174ed2 100644 |
| 4238 | --- a/gas/config/tc-microblaze.h | 4677 | --- a/gas/config/tc-microblaze.h |
| 4239 | +++ b/gas/config/tc-microblaze.h | 4678 | +++ b/gas/config/tc-microblaze.h |
| 4240 | @@ -78,7 +78,9 @@ extern const struct relax_type md_relax_table[]; | 4679 | @@ -78,7 +78,9 @@ extern const struct relax_type md_relax_table[]; |
| @@ -4249,31 +4688,44 @@ index 01cb3e894f..7435a70ef5 100644 | |||
| 4249 | #define ELF_TC_SPECIAL_SECTIONS \ | 4688 | #define ELF_TC_SPECIAL_SECTIONS \ |
| 4250 | { ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, \ | 4689 | { ".sdata", SHT_PROGBITS, SHF_ALLOC + SHF_WRITE }, \ |
| 4251 | diff --git a/include/elf/common.h b/include/elf/common.h | 4690 | diff --git a/include/elf/common.h b/include/elf/common.h |
| 4252 | index 4d94c4fd5b..f709a01816 100644 | 4691 | index 0cca28673dd..a650d624e3c 100644 |
| 4253 | --- a/include/elf/common.h | 4692 | --- a/include/elf/common.h |
| 4254 | +++ b/include/elf/common.h | 4693 | +++ b/include/elf/common.h |
| 4255 | @@ -340,6 +340,7 @@ | 4694 | @@ -354,6 +354,7 @@ |
| 4256 | #define EM_RISCV 243 /* RISC-V */ | 4695 | #define EM_65816 257 /* WDC 65816/65C816 */ |
| 4257 | #define EM_LANAI 244 /* Lanai 32-bit processor. */ | 4696 | #define EM_LOONGARCH 258 /* LoongArch */ |
| 4258 | #define EM_BPF 247 /* Linux BPF – in-kernel virtual machine. */ | 4697 | #define EM_KF32 259 /* ChipON KungFu32 */ |
| 4259 | +#define EM_MB_64 248 /* Xilinx MicroBlaze 32-bit RISC soft processor core */ | 4698 | +#define EM_MB_64 260 /* Xilinx MicroBlaze 32-bit RISC soft processor core */ |
| 4260 | #define EM_NFP 250 /* Netronome Flow Processor. */ | 4699 | |
| 4261 | #define EM_CSKY 252 /* C-SKY processor family. */ | 4700 | /* If it is necessary to assign new unofficial EM_* values, please pick large |
| 4701 | random numbers (0x8523, 0xa7f2, etc.) to minimize the chances of collision | ||
| 4702 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h | ||
| 4703 | index 936ef484289..1f958724e5f 100644 | ||
| 4704 | --- a/include/elf/microblaze.h | ||
| 4705 | +++ b/include/elf/microblaze.h | ||
| 4706 | @@ -62,6 +62,8 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) | ||
| 4707 | RELOC_NUMBER (R_MICROBLAZE_TEXTREL_64, 31) /* TEXT Entry offset 64-bit. */ | ||
| 4708 | RELOC_NUMBER (R_MICROBLAZE_TEXTREL_32_LO, 32) /* TEXT Entry offset 32-bit. */ | ||
| 4709 | RELOC_NUMBER (R_MICROBLAZE_32_NONE, 33) | ||
| 4710 | + RELOC_NUMBER (R_MICROBLAZE_IMML_64, 34) | ||
| 4711 | + RELOC_NUMBER (R_MICROBLAZE_GPC_64, 35) /* GOT entry offset. */ | ||
| 4712 | |||
| 4713 | END_RELOC_NUMBERS (R_MICROBLAZE_max) | ||
| 4262 | 4714 | ||
| 4263 | diff --git a/ld/Makefile.am b/ld/Makefile.am | 4715 | diff --git a/ld/Makefile.am b/ld/Makefile.am |
| 4264 | index 02c4fc1639..d063e2d32c 100644 | 4716 | index f8e99325361..8d263078750 100644 |
| 4265 | --- a/ld/Makefile.am | 4717 | --- a/ld/Makefile.am |
| 4266 | +++ b/ld/Makefile.am | 4718 | +++ b/ld/Makefile.am |
| 4267 | @@ -416,6 +416,8 @@ ALL_64_EMULATION_SOURCES = \ | 4719 | @@ -410,6 +410,8 @@ ALL_64_EMULATION_SOURCES = \ |
| 4268 | eelf32ltsmipn32.c \ | 4720 | eelf32ltsmipn32.c \ |
| 4269 | eelf32ltsmipn32_fbsd.c \ | 4721 | eelf32ltsmipn32_fbsd.c \ |
| 4270 | eelf32mipswindiss.c \ | 4722 | eelf32mipswindiss.c \ |
| 4271 | + eelf64microblazeel.c \ | 4723 | + eelf64microblazeel.c \ |
| 4272 | + eelf64microblaze.c \ | 4724 | + eelf64microblaze.c \ |
| 4273 | eelf64_aix.c \ | 4725 | eelf32lriscv.c \ |
| 4274 | eelf64bpf.c \ | 4726 | eelf32lriscv_ilp32f.c \ |
| 4275 | eelf64_ia64.c \ | 4727 | eelf32lriscv_ilp32.c \ |
| 4276 | @@ -898,6 +900,8 @@ $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES): $(GEN_DEPENDS) | 4728 | @@ -902,6 +904,8 @@ $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES): $(GEN_DEPENDS) |
| 4277 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32.Pc@am__quote@ | 4729 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32.Pc@am__quote@ |
| 4278 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32_fbsd.Pc@am__quote@ | 4730 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32_fbsd.Pc@am__quote@ |
| 4279 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32mipswindiss.Pc@am__quote@ | 4731 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32mipswindiss.Pc@am__quote@ |
| @@ -4283,19 +4735,19 @@ index 02c4fc1639..d063e2d32c 100644 | |||
| 4283 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64bpf.Pc@am__quote@ | 4735 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64bpf.Pc@am__quote@ |
| 4284 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64.Pc@am__quote@ | 4736 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64.Pc@am__quote@ |
| 4285 | diff --git a/ld/Makefile.in b/ld/Makefile.in | 4737 | diff --git a/ld/Makefile.in b/ld/Makefile.in |
| 4286 | index 2fe12e14f6..797212859f 100644 | 4738 | index ef2e99e08da..f7e845b9274 100644 |
| 4287 | --- a/ld/Makefile.in | 4739 | --- a/ld/Makefile.in |
| 4288 | +++ b/ld/Makefile.in | 4740 | +++ b/ld/Makefile.in |
| 4289 | @@ -898,6 +898,8 @@ ALL_64_EMULATION_SOURCES = \ | 4741 | @@ -899,6 +899,8 @@ ALL_64_EMULATION_SOURCES = \ |
| 4290 | eelf32ltsmipn32.c \ | 4742 | eelf32ltsmipn32.c \ |
| 4291 | eelf32ltsmipn32_fbsd.c \ | 4743 | eelf32ltsmipn32_fbsd.c \ |
| 4292 | eelf32mipswindiss.c \ | 4744 | eelf32mipswindiss.c \ |
| 4293 | + eelf64microblazeel.c \ | 4745 | + eelf64microblazeel.c \ |
| 4294 | + eelf64microblaze.c \ | 4746 | + eelf64microblaze.c \ |
| 4295 | eelf64_aix.c \ | 4747 | eelf32lriscv.c \ |
| 4296 | eelf64bpf.c \ | 4748 | eelf32lriscv_ilp32f.c \ |
| 4297 | eelf64_ia64.c \ | 4749 | eelf32lriscv_ilp32.c \ |
| 4298 | @@ -1338,6 +1340,8 @@ distclean-compile: | 4750 | @@ -1398,6 +1400,8 @@ distclean-compile: |
| 4299 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xstormy16.Po@am__quote@ | 4751 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xstormy16.Po@am__quote@ |
| 4300 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xtensa.Po@am__quote@ | 4752 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32xtensa.Po@am__quote@ |
| 4301 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32z80.Po@am__quote@ | 4753 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32z80.Po@am__quote@ |
| @@ -4304,7 +4756,7 @@ index 2fe12e14f6..797212859f 100644 | |||
| 4304 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_aix.Po@am__quote@ | 4756 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_aix.Po@am__quote@ |
| 4305 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64.Po@am__quote@ | 4757 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64.Po@am__quote@ |
| 4306 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64_fbsd.Po@am__quote@ | 4758 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64_fbsd.Po@am__quote@ |
| 4307 | @@ -2493,6 +2497,8 @@ $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES): $(GEN_DEPENDS) | 4759 | @@ -2560,6 +2564,8 @@ $(ALL_EMULATION_SOURCES) $(ALL_64_EMULATION_SOURCES): $(GEN_DEPENDS) |
| 4308 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32.Pc@am__quote@ | 4760 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32.Pc@am__quote@ |
| 4309 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32_fbsd.Pc@am__quote@ | 4761 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32ltsmipn32_fbsd.Pc@am__quote@ |
| 4310 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32mipswindiss.Pc@am__quote@ | 4762 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf32mipswindiss.Pc@am__quote@ |
| @@ -4314,10 +4766,10 @@ index 2fe12e14f6..797212859f 100644 | |||
| 4314 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64bpf.Pc@am__quote@ | 4766 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64bpf.Pc@am__quote@ |
| 4315 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64.Pc@am__quote@ | 4767 | @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/eelf64_ia64.Pc@am__quote@ |
| 4316 | diff --git a/ld/configure.tgt b/ld/configure.tgt | 4768 | diff --git a/ld/configure.tgt b/ld/configure.tgt |
| 4317 | index 87c7d9a4ca..801d27c9e3 100644 | 4769 | index 6205d7c9872..3e97dbb311c 100644 |
| 4318 | --- a/ld/configure.tgt | 4770 | --- a/ld/configure.tgt |
| 4319 | +++ b/ld/configure.tgt | 4771 | +++ b/ld/configure.tgt |
| 4320 | @@ -469,6 +469,9 @@ microblaze*-linux*) targ_emul="elf32mb_linux" | 4772 | @@ -468,6 +468,9 @@ microblaze*-linux*) targ_emul="elf32mb_linux" |
| 4321 | microblazeel*) targ_emul=elf32microblazeel | 4773 | microblazeel*) targ_emul=elf32microblazeel |
| 4322 | targ_extra_emuls=elf32microblaze | 4774 | targ_extra_emuls=elf32microblaze |
| 4323 | ;; | 4775 | ;; |
| @@ -4329,7 +4781,7 @@ index 87c7d9a4ca..801d27c9e3 100644 | |||
| 4329 | ;; | 4781 | ;; |
| 4330 | diff --git a/ld/emulparams/elf64microblaze.sh b/ld/emulparams/elf64microblaze.sh | 4782 | diff --git a/ld/emulparams/elf64microblaze.sh b/ld/emulparams/elf64microblaze.sh |
| 4331 | new file mode 100644 | 4783 | new file mode 100644 |
| 4332 | index 0000000000..9c7b0eb708 | 4784 | index 00000000000..9c7b0eb7080 |
| 4333 | --- /dev/null | 4785 | --- /dev/null |
| 4334 | +++ b/ld/emulparams/elf64microblaze.sh | 4786 | +++ b/ld/emulparams/elf64microblaze.sh |
| 4335 | @@ -0,0 +1,23 @@ | 4787 | @@ -0,0 +1,23 @@ |
| @@ -4358,7 +4810,7 @@ index 0000000000..9c7b0eb708 | |||
| 4358 | +#GENERATE_SHLIB_SCRIPT=yes | 4810 | +#GENERATE_SHLIB_SCRIPT=yes |
| 4359 | diff --git a/ld/emulparams/elf64microblazeel.sh b/ld/emulparams/elf64microblazeel.sh | 4811 | diff --git a/ld/emulparams/elf64microblazeel.sh b/ld/emulparams/elf64microblazeel.sh |
| 4360 | new file mode 100644 | 4812 | new file mode 100644 |
| 4361 | index 0000000000..9c7b0eb708 | 4813 | index 00000000000..9c7b0eb7080 |
| 4362 | --- /dev/null | 4814 | --- /dev/null |
| 4363 | +++ b/ld/emulparams/elf64microblazeel.sh | 4815 | +++ b/ld/emulparams/elf64microblazeel.sh |
| 4364 | @@ -0,0 +1,23 @@ | 4816 | @@ -0,0 +1,23 @@ |
| @@ -4386,7 +4838,7 @@ index 0000000000..9c7b0eb708 | |||
| 4386 | +TEMPLATE_NAME=elf32 | 4838 | +TEMPLATE_NAME=elf32 |
| 4387 | +#GENERATE_SHLIB_SCRIPT=yes | 4839 | +#GENERATE_SHLIB_SCRIPT=yes |
| 4388 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | 4840 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c |
| 4389 | index 315c6e9350..f643f2600d 100644 | 4841 | index 1fe8da2e51b..fc15d210fe0 100644 |
| 4390 | --- a/opcodes/microblaze-dis.c | 4842 | --- a/opcodes/microblaze-dis.c |
| 4391 | +++ b/opcodes/microblaze-dis.c | 4843 | +++ b/opcodes/microblaze-dis.c |
| 4392 | @@ -33,6 +33,7 @@ | 4844 | @@ -33,6 +33,7 @@ |
| @@ -4476,7 +4928,7 @@ index 315c6e9350..f643f2600d 100644 | |||
| 4476 | /* For tuqula instruction */ | 4928 | /* For tuqula instruction */ |
| 4477 | case INST_TYPE_RD: | 4929 | case INST_TYPE_RD: |
| 4478 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 4930 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 4479 | index f61f4ef66d..61eaa39b3e 100644 | 4931 | index 6fcded04b49..4a1545d8920 100644 |
| 4480 | --- a/opcodes/microblaze-opc.h | 4932 | --- a/opcodes/microblaze-opc.h |
| 4481 | +++ b/opcodes/microblaze-opc.h | 4933 | +++ b/opcodes/microblaze-opc.h |
| 4482 | @@ -40,7 +40,7 @@ | 4934 | @@ -40,7 +40,7 @@ |
| @@ -4528,17 +4980,17 @@ index f61f4ef66d..61eaa39b3e 100644 | |||
| 4528 | -#define MAX_OPCODES 301 | 4980 | -#define MAX_OPCODES 301 |
| 4529 | +#define MAX_OPCODES 412 | 4981 | +#define MAX_OPCODES 412 |
| 4530 | 4982 | ||
| 4531 | struct op_code_struct | 4983 | const struct op_code_struct |
| 4532 | { | 4984 | { |
| 4533 | @@ -125,6 +132,7 @@ struct op_code_struct | 4985 | @@ -125,6 +132,7 @@ const struct op_code_struct |
| 4534 | /* More info about output format here. */ | 4986 | /* More info about output format here. */ |
| 4535 | } opcodes[MAX_OPCODES] = | 4987 | } microblaze_opcodes[MAX_OPCODES] = |
| 4536 | { | 4988 | { |
| 4537 | + /* 32-bit instructions */ | 4989 | + /* 32-bit instructions */ |
| 4538 | {"add", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst }, | 4990 | {"add", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x00000000, OPCODE_MASK_H4, add, arithmetic_inst }, |
| 4539 | {"rsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst }, | 4991 | {"rsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x04000000, OPCODE_MASK_H4, rsub, arithmetic_inst }, |
| 4540 | {"addc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst }, | 4992 | {"addc", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x08000000, OPCODE_MASK_H4, addc, arithmetic_inst }, |
| 4541 | @@ -161,11 +169,11 @@ struct op_code_struct | 4993 | @@ -161,11 +169,11 @@ const struct op_code_struct |
| 4542 | {"ncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst }, | 4994 | {"ncget", INST_TYPE_RD_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C006000, OPCODE_MASK_H32, ncget, anyware_inst }, |
| 4543 | {"ncput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst }, | 4995 | {"ncput", INST_TYPE_R1_RFSL, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x6C00E000, OPCODE_MASK_H32, ncput, anyware_inst }, |
| 4544 | {"muli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst }, | 4996 | {"muli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x60000000, OPCODE_MASK_H, muli, mult_inst }, |
| @@ -4555,7 +5007,7 @@ index f61f4ef66d..61eaa39b3e 100644 | |||
| 4555 | {"or", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, microblaze_or, logical_inst }, | 5007 | {"or", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x80000000, OPCODE_MASK_H4, microblaze_or, logical_inst }, |
| 4556 | {"and", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, microblaze_and, logical_inst }, | 5008 | {"and", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x84000000, OPCODE_MASK_H4, microblaze_and, logical_inst }, |
| 4557 | {"xor", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, microblaze_xor, logical_inst }, | 5009 | {"xor", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x88000000, OPCODE_MASK_H4, microblaze_xor, logical_inst }, |
| 4558 | @@ -425,6 +433,129 @@ struct op_code_struct | 5010 | @@ -425,6 +433,129 @@ const struct op_code_struct |
| 4559 | {"suspend", INST_TYPE_NONE, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBB020004, OPCODE_MASK_HN, invalid_inst, special_inst }, /* translates to mbar 24. */ | 5011 | {"suspend", INST_TYPE_NONE, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xBB020004, OPCODE_MASK_HN, invalid_inst, special_inst }, /* translates to mbar 24. */ |
| 4560 | {"swapb", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900001E0, OPCODE_MASK_H4, swapb, arithmetic_inst }, | 5012 | {"swapb", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900001E0, OPCODE_MASK_H4, swapb, arithmetic_inst }, |
| 4561 | {"swaph", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900001E2, OPCODE_MASK_H4, swaph, arithmetic_inst }, | 5013 | {"swaph", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x900001E2, OPCODE_MASK_H4, swaph, arithmetic_inst }, |
| @@ -4664,8 +5116,8 @@ index f61f4ef66d..61eaa39b3e 100644 | |||
| 4664 | + {"llr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000300, OPCODE_MASK_H4, llr, memory_load_inst }, | 5116 | + {"llr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000300, OPCODE_MASK_H4, llr, memory_load_inst }, |
| 4665 | + {"sl", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000100, OPCODE_MASK_H4, sl, memory_store_inst }, | 5117 | + {"sl", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000100, OPCODE_MASK_H4, sl, memory_store_inst }, |
| 4666 | + {"slr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000300, OPCODE_MASK_H4, slr, memory_store_inst }, | 5118 | + {"slr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000300, OPCODE_MASK_H4, slr, memory_store_inst }, |
| 4667 | + {"lli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, /* Identical to 32-bit */ | 5119 | + {"lli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xEC000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, /* Identical to 32-bit */ |
| 4668 | + {"sli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, /* Identical to 32-bit */ | 5120 | + {"sli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xFC000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, /* Identical to 32-bit */ |
| 4669 | + {"lla", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* lla translates to addlik */ | 5121 | + {"lla", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* lla translates to addlik */ |
| 4670 | + {"dadd", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000400, OPCODE_MASK_H4, dadd, arithmetic_inst }, | 5122 | + {"dadd", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000400, OPCODE_MASK_H4, dadd, arithmetic_inst }, |
| 4671 | + {"drsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000480, OPCODE_MASK_H4, drsub, arithmetic_inst }, | 5123 | + {"drsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000480, OPCODE_MASK_H4, drsub, arithmetic_inst }, |
| @@ -4704,7 +5156,7 @@ index f61f4ef66d..61eaa39b3e 100644 | |||
| 4704 | #endif /* MICROBLAZE_OPC */ | 5156 | #endif /* MICROBLAZE_OPC */ |
| 4705 | 5157 | ||
| 4706 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | 5158 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h |
| 4707 | index fa921c90c9..1dcd3dca3d 100644 | 5159 | index 78a2ac44960..70e351f6f4e 100644 |
| 4708 | --- a/opcodes/microblaze-opcm.h | 5160 | --- a/opcodes/microblaze-opcm.h |
| 4709 | +++ b/opcodes/microblaze-opcm.h | 5161 | +++ b/opcodes/microblaze-opcm.h |
| 4710 | @@ -25,6 +25,7 @@ | 5162 | @@ -25,6 +25,7 @@ |
| @@ -4715,6 +5167,17 @@ index fa921c90c9..1dcd3dca3d 100644 | |||
| 4715 | add, rsub, addc, rsubc, addk, rsubk, addkc, rsubkc, clz, cmp, cmpu, | 5167 | add, rsub, addc, rsubc, addk, rsubk, addkc, rsubkc, clz, cmp, cmpu, |
| 4716 | addi, rsubi, addic, rsubic, addik, rsubik, addikc, rsubikc, mul, | 5168 | addi, rsubi, addic, rsubic, addik, rsubik, addikc, rsubikc, mul, |
| 4717 | mulh, mulhu, mulhsu,swapb,swaph, | 5169 | mulh, mulhu, mulhsu,swapb,swaph, |
| 5170 | @@ -39,8 +40,8 @@ enum microblaze_instr | ||
| 5171 | imm, rtsd, rtid, rtbd, rted, bri, brid, brlid, brai, braid, bralid, | ||
| 5172 | brki, beqi, beqid, bnei, bneid, blti, bltid, blei, bleid, bgti, | ||
| 5173 | bgtid, bgei, bgeid, lbu, lbuea, lbur, lhu, lhuea, lhur, lw, lwea, lwr, lwx, | ||
| 5174 | - sb, sbea, sbr, sh, shea, shr, sw, swea, swr, swx, lbui, lhui, lwi, | ||
| 5175 | - sbi, shi, swi, msrset, msrclr, tuqula, mbi_fadd, frsub, mbi_fmul, mbi_fdiv, | ||
| 5176 | + sb, sbea, sbr, sh, shea, shr, sw, swea, swr, swx, lbui, lhui, lwi, lli, | ||
| 5177 | + sbi, shi, swi, sli, msrset, msrclr, tuqula, mbi_fadd, frsub, mbi_fmul, mbi_fdiv, | ||
| 5178 | fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, flt, | ||
| 5179 | fint, fsqrt, | ||
| 5180 | tget, tcget, tnget, tncget, tput, tcput, tnput, tncput, | ||
| 4718 | @@ -58,6 +59,18 @@ enum microblaze_instr | 5181 | @@ -58,6 +59,18 @@ enum microblaze_instr |
| 4719 | aputd, taputd, caputd, tcaputd, naputd, tnaputd, ncaputd, tncaputd, | 5182 | aputd, taputd, caputd, tcaputd, naputd, tnaputd, ncaputd, tncaputd, |
| 4720 | eagetd, teagetd, ecagetd, tecagetd, neagetd, tneagetd, necagetd, tnecagetd, | 5183 | eagetd, teagetd, ecagetd, tecagetd, neagetd, tneagetd, necagetd, tnecagetd, |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0015-MB-X-initial-commit.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0015-MB-X-initial-commit.patch deleted file mode 100644 index 7b87f40f..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0015-MB-X-initial-commit.patch +++ /dev/null | |||
| @@ -1,684 +0,0 @@ | |||
| 1 | From 550150a8f97738902539ad774fbd0c977ab3a427 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | ||
| 3 | Date: Sun, 30 Sep 2018 16:31:26 +0530 | ||
| 4 | Subject: [PATCH 15/52] MB-X initial commit code cleanup is needed. | ||
| 5 | |||
| 6 | Conflicts: | ||
| 7 | bfd/elf32-microblaze.c | ||
| 8 | gas/config/tc-microblaze.c | ||
| 9 | opcodes/microblaze-opcm.h | ||
| 10 | --- | ||
| 11 | bfd/bfd-in2.h | 10 +++ | ||
| 12 | bfd/elf32-microblaze.c | 59 +++++++++++++- | ||
| 13 | bfd/elf64-microblaze.c | 61 ++++++++++++++- | ||
| 14 | bfd/libbfd.h | 2 + | ||
| 15 | bfd/reloc.c | 12 +++ | ||
| 16 | gas/config/tc-microblaze.c | 154 ++++++++++++++++++++++++++++++------- | ||
| 17 | include/elf/microblaze.h | 2 + | ||
| 18 | opcodes/microblaze-opc.h | 4 +- | ||
| 19 | opcodes/microblaze-opcm.h | 4 +- | ||
| 20 | 9 files changed, 275 insertions(+), 33 deletions(-) | ||
| 21 | |||
| 22 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | ||
| 23 | index 1bd19a2b63..a335182ba1 100644 | ||
| 24 | --- a/bfd/bfd-in2.h | ||
| 25 | +++ b/bfd/bfd-in2.h | ||
| 26 | @@ -5438,11 +5438,21 @@ value in two words (with an imm instruction). No relocation is | ||
| 27 | done here - only used for relaxing */ | ||
| 28 | BFD_RELOC_MICROBLAZE_64_NONE, | ||
| 29 | |||
| 30 | +/* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 31 | + * +value in two words (with an imml instruction). No relocation is | ||
| 32 | + * +done here - only used for relaxing */ | ||
| 33 | + BFD_RELOC_MICROBLAZE_64, | ||
| 34 | + | ||
| 35 | /* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 36 | value in two words (with an imm instruction). The relocation is | ||
| 37 | PC-relative GOT offset */ | ||
| 38 | BFD_RELOC_MICROBLAZE_64_GOTPC, | ||
| 39 | |||
| 40 | +/* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 41 | +value in two words (with an imml instruction). The relocation is | ||
| 42 | +PC-relative GOT offset */ | ||
| 43 | + BFD_RELOC_MICROBLAZE_64_GPC, | ||
| 44 | + | ||
| 45 | /* This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 46 | value in two words (with an imm instruction). The relocation is | ||
| 47 | GOT offset */ | ||
| 48 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | ||
| 49 | index c22130fd8c..14bb6de052 100644 | ||
| 50 | --- a/bfd/elf32-microblaze.c | ||
| 51 | +++ b/bfd/elf32-microblaze.c | ||
| 52 | @@ -116,6 +116,20 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 53 | 0x0000ffff, /* Dest Mask. */ | ||
| 54 | TRUE), /* PC relative offset? */ | ||
| 55 | |||
| 56 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ | ||
| 57 | + 0, /* Rightshift. */ | ||
| 58 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 59 | + 16, /* Bitsize. */ | ||
| 60 | + TRUE, /* PC_relative. */ | ||
| 61 | + 0, /* Bitpos. */ | ||
| 62 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 63 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
| 64 | + "R_MICROBLAZE_IMML_64", /* Name. */ | ||
| 65 | + FALSE, /* Partial Inplace. */ | ||
| 66 | + 0, /* Source Mask. */ | ||
| 67 | + 0x0000ffff, /* Dest Mask. */ | ||
| 68 | + FALSE), /* PC relative offset? */ | ||
| 69 | + | ||
| 70 | /* A 64 bit relocation. Table entry not really used. */ | ||
| 71 | HOWTO (R_MICROBLAZE_64, /* Type. */ | ||
| 72 | 0, /* Rightshift. */ | ||
| 73 | @@ -280,6 +294,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 74 | 0x0000ffff, /* Dest Mask. */ | ||
| 75 | TRUE), /* PC relative offset? */ | ||
| 76 | |||
| 77 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | ||
| 78 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ | ||
| 79 | + 0, /* Rightshift. */ | ||
| 80 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 81 | + 16, /* Bitsize. */ | ||
| 82 | + TRUE, /* PC_relative. */ | ||
| 83 | + 0, /* Bitpos. */ | ||
| 84 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 85 | + bfd_elf_generic_reloc, /* Special Function. */ | ||
| 86 | + "R_MICROBLAZE_GPC_64", /* Name. */ | ||
| 87 | + FALSE, /* Partial Inplace. */ | ||
| 88 | + 0, /* Source Mask. */ | ||
| 89 | + 0x0000ffff, /* Dest Mask. */ | ||
| 90 | + TRUE), /* PC relative offset? */ | ||
| 91 | + | ||
| 92 | /* A 64 bit GOT relocation. Table-entry not really used. */ | ||
| 93 | HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | ||
| 94 | 0, /* Rightshift. */ | ||
| 95 | @@ -619,9 +648,15 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 96 | case BFD_RELOC_VTABLE_ENTRY: | ||
| 97 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; | ||
| 98 | break; | ||
| 99 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 100 | + microblaze_reloc = R_MICROBLAZE_IMML_64; | ||
| 101 | + break; | ||
| 102 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 103 | microblaze_reloc = R_MICROBLAZE_GOTPC_64; | ||
| 104 | break; | ||
| 105 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 106 | + microblaze_reloc = R_MICROBLAZE_GPC_64; | ||
| 107 | + break; | ||
| 108 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 109 | microblaze_reloc = R_MICROBLAZE_GOT_64; | ||
| 110 | break; | ||
| 111 | @@ -1463,7 +1498,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 112 | if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) | ||
| 113 | { | ||
| 114 | relocation += addend; | ||
| 115 | - if (r_type == R_MICROBLAZE_32) | ||
| 116 | + if (r_type == R_MICROBLAZE_32)// || r_type == R_MICROBLAZE_IMML_64) | ||
| 117 | bfd_put_32 (input_bfd, relocation, contents + offset); | ||
| 118 | else | ||
| 119 | { | ||
| 120 | @@ -1929,6 +1964,28 @@ microblaze_elf_relax_section (bfd *abfd, | ||
| 121 | irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); | ||
| 122 | } | ||
| 123 | break; | ||
| 124 | + case R_MICROBLAZE_IMML_64: | ||
| 125 | + { | ||
| 126 | + /* This was a PC-relative instruction that was | ||
| 127 | + completely resolved. */ | ||
| 128 | + int sfix, efix; | ||
| 129 | + unsigned int val; | ||
| 130 | + bfd_vma target_address; | ||
| 131 | + target_address = irel->r_addend + irel->r_offset; | ||
| 132 | + sfix = calc_fixup (irel->r_offset, 0, sec); | ||
| 133 | + efix = calc_fixup (target_address, 0, sec); | ||
| 134 | + | ||
| 135 | + /* Validate the in-band val. */ | ||
| 136 | + val = bfd_get_32 (abfd, contents + irel->r_offset); | ||
| 137 | + if (val != irel->r_addend && ELF64_R_TYPE (irel->r_info) == R_MICROBLAZE_32_NONE) { | ||
| 138 | + fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); | ||
| 139 | + } | ||
| 140 | + irel->r_addend -= (efix - sfix); | ||
| 141 | + /* Should use HOWTO. */ | ||
| 142 | + microblaze_bfd_write_imm_value_64 (abfd, contents + irel->r_offset, | ||
| 143 | + irel->r_addend); | ||
| 144 | + } | ||
| 145 | + break; | ||
| 146 | case R_MICROBLAZE_NONE: | ||
| 147 | case R_MICROBLAZE_32_NONE: | ||
| 148 | { | ||
| 149 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | ||
| 150 | index a357388115..6b1f47d00d 100644 | ||
| 151 | --- a/bfd/elf64-microblaze.c | ||
| 152 | +++ b/bfd/elf64-microblaze.c | ||
| 153 | @@ -116,6 +116,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 154 | 0x0000ffff, /* Dest Mask. */ | ||
| 155 | TRUE), /* PC relative offset? */ | ||
| 156 | |||
| 157 | + /* A 64 bit relocation. Table entry not really used. */ | ||
| 158 | + HOWTO (R_MICROBLAZE_IMML_64, /* Type. */ | ||
| 159 | + 0, /* Rightshift. */ | ||
| 160 | + 4, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 161 | + 64, /* Bitsize. */ | ||
| 162 | + TRUE, /* PC_relative. */ | ||
| 163 | + 0, /* Bitpos. */ | ||
| 164 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 165 | + bfd_elf_generic_reloc,/* Special Function. */ | ||
| 166 | + "R_MICROBLAZE_IMML_64", /* Name. */ | ||
| 167 | + FALSE, /* Partial Inplace. */ | ||
| 168 | + 0, /* Source Mask. */ | ||
| 169 | + 0x0000ffff, /* Dest Mask. */ | ||
| 170 | + TRUE), /* PC relative offset? */ | ||
| 171 | + | ||
| 172 | /* A 64 bit relocation. Table entry not really used. */ | ||
| 173 | HOWTO (R_MICROBLAZE_64, /* Type. */ | ||
| 174 | 0, /* Rightshift. */ | ||
| 175 | @@ -265,6 +280,21 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | ||
| 176 | 0x0000ffff, /* Dest Mask. */ | ||
| 177 | TRUE), /* PC relative offset? */ | ||
| 178 | |||
| 179 | + /* A 64 bit GOTPC relocation. Table-entry not really used. */ | ||
| 180 | + HOWTO (R_MICROBLAZE_GPC_64, /* Type. */ | ||
| 181 | + 0, /* Rightshift. */ | ||
| 182 | + 2, /* Size (0 = byte, 1 = short, 2 = long). */ | ||
| 183 | + 16, /* Bitsize. */ | ||
| 184 | + TRUE, /* PC_relative. */ | ||
| 185 | + 0, /* Bitpos. */ | ||
| 186 | + complain_overflow_dont, /* Complain on overflow. */ | ||
| 187 | + bfd_elf_generic_reloc, /* Special Function. */ | ||
| 188 | + "R_MICROBLAZE_GPC_64", /* Name. */ | ||
| 189 | + FALSE, /* Partial Inplace. */ | ||
| 190 | + 0, /* Source Mask. */ | ||
| 191 | + 0x0000ffff, /* Dest Mask. */ | ||
| 192 | + TRUE), /* PC relative offset? */ | ||
| 193 | + | ||
| 194 | /* A 64 bit GOT relocation. Table-entry not really used. */ | ||
| 195 | HOWTO (R_MICROBLAZE_GOT_64, /* Type. */ | ||
| 196 | 0, /* Rightshift. */ | ||
| 197 | @@ -589,9 +619,15 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 198 | case BFD_RELOC_VTABLE_ENTRY: | ||
| 199 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; | ||
| 200 | break; | ||
| 201 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 202 | + microblaze_reloc = R_MICROBLAZE_IMML_64; | ||
| 203 | + break; | ||
| 204 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 205 | microblaze_reloc = R_MICROBLAZE_GOTPC_64; | ||
| 206 | break; | ||
| 207 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 208 | + microblaze_reloc = R_MICROBLAZE_GPC_64; | ||
| 209 | + break; | ||
| 210 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 211 | microblaze_reloc = R_MICROBLAZE_GOT_64; | ||
| 212 | break; | ||
| 213 | @@ -1172,6 +1208,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 214 | break; /* Do nothing. */ | ||
| 215 | |||
| 216 | case (int) R_MICROBLAZE_GOTPC_64: | ||
| 217 | + case (int) R_MICROBLAZE_GPC_64: | ||
| 218 | relocation = htab->sgotplt->output_section->vma | ||
| 219 | + htab->sgotplt->output_offset; | ||
| 220 | relocation -= (input_section->output_section->vma | ||
| 221 | @@ -1443,7 +1480,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 222 | if (r_symndx == STN_UNDEF || (input_section->flags & SEC_ALLOC) == 0) | ||
| 223 | { | ||
| 224 | relocation += addend; | ||
| 225 | - if (r_type == R_MICROBLAZE_32) | ||
| 226 | + if (r_type == R_MICROBLAZE_32)// || r_type == R_MICROBLAZE_IMML_64) | ||
| 227 | bfd_put_32 (input_bfd, relocation, contents + offset); | ||
| 228 | else | ||
| 229 | { | ||
| 230 | @@ -1889,6 +1926,28 @@ microblaze_elf_relax_section (bfd *abfd, | ||
| 231 | irel->r_addend -= calc_fixup (irel->r_addend, 0, sec); | ||
| 232 | } | ||
| 233 | break; | ||
| 234 | + case R_MICROBLAZE_IMML_64: | ||
| 235 | + { | ||
| 236 | + /* This was a PC-relative instruction that was | ||
| 237 | + completely resolved. */ | ||
| 238 | + int sfix, efix; | ||
| 239 | + unsigned int val; | ||
| 240 | + bfd_vma target_address; | ||
| 241 | + target_address = irel->r_addend + irel->r_offset; | ||
| 242 | + sfix = calc_fixup (irel->r_offset, 0, sec); | ||
| 243 | + efix = calc_fixup (target_address, 0, sec); | ||
| 244 | + | ||
| 245 | + /* Validate the in-band val. */ | ||
| 246 | + val = bfd_get_32 (abfd, contents + irel->r_offset); | ||
| 247 | + if (val != irel->r_addend && ELF64_R_TYPE (irel->r_info) == R_MICROBLAZE_32_NONE) { | ||
| 248 | + fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); | ||
| 249 | + } | ||
| 250 | + irel->r_addend -= (efix - sfix); | ||
| 251 | + /* Should use HOWTO. */ | ||
| 252 | + microblaze_bfd_write_imm_value_64 (abfd, contents + irel->r_offset, | ||
| 253 | + irel->r_addend); | ||
| 254 | + } | ||
| 255 | + break; | ||
| 256 | case R_MICROBLAZE_NONE: | ||
| 257 | case R_MICROBLAZE_32_NONE: | ||
| 258 | { | ||
| 259 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h | ||
| 260 | index c1551b9240..b4aace6a70 100644 | ||
| 261 | --- a/bfd/libbfd.h | ||
| 262 | +++ b/bfd/libbfd.h | ||
| 263 | @@ -2969,7 +2969,9 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | ||
| 264 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", | ||
| 265 | "BFD_RELOC_MICROBLAZE_32_NONE", | ||
| 266 | "BFD_RELOC_MICROBLAZE_64_NONE", | ||
| 267 | + "BFD_RELOC_MICROBLAZE_64", | ||
| 268 | "BFD_RELOC_MICROBLAZE_64_GOTPC", | ||
| 269 | + "BFD_RELOC_MICROBLAZE_64_GPC", | ||
| 270 | "BFD_RELOC_MICROBLAZE_64_GOT", | ||
| 271 | "BFD_RELOC_MICROBLAZE_64_PLT", | ||
| 272 | "BFD_RELOC_MICROBLAZE_64_GOTOFF", | ||
| 273 | diff --git a/bfd/reloc.c b/bfd/reloc.c | ||
| 274 | index 9b39b41941..0e8a24e9cb 100644 | ||
| 275 | --- a/bfd/reloc.c | ||
| 276 | +++ b/bfd/reloc.c | ||
| 277 | @@ -6866,12 +6866,24 @@ ENUMDOC | ||
| 278 | done here - only used for relaxing | ||
| 279 | ENUM | ||
| 280 | BFD_RELOC_MICROBLAZE_64_NONE | ||
| 281 | +ENUMDOC | ||
| 282 | + This is a 32 bit reloc that stores the 32 bit pc relative | ||
| 283 | + value in two words (with an imml instruction). No relocation is | ||
| 284 | + done here - only used for relaxing | ||
| 285 | +ENUM | ||
| 286 | + BFD_RELOC_MICROBLAZE_64 | ||
| 287 | ENUMDOC | ||
| 288 | This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 289 | value in two words (with an imm instruction). No relocation is | ||
| 290 | done here - only used for relaxing | ||
| 291 | ENUM | ||
| 292 | BFD_RELOC_MICROBLAZE_64_GOTPC | ||
| 293 | +ENUMDOC | ||
| 294 | + This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 295 | + value in two words (with an imml instruction). No relocation is | ||
| 296 | + done here - only used for relaxing | ||
| 297 | +ENUM | ||
| 298 | + BFD_RELOC_MICROBLAZE_64_GPC | ||
| 299 | ENUMDOC | ||
| 300 | This is a 64 bit reloc that stores the 32 bit pc relative | ||
| 301 | value in two words (with an imm instruction). The relocation is | ||
| 302 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | ||
| 303 | index ffbb843d33..33eda2a4da 100644 | ||
| 304 | --- a/gas/config/tc-microblaze.c | ||
| 305 | +++ b/gas/config/tc-microblaze.c | ||
| 306 | @@ -94,6 +94,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP"; | ||
| 307 | #define TLSTPREL_OFFSET 16 | ||
| 308 | #define TEXT_OFFSET 17 | ||
| 309 | #define TEXT_PC_OFFSET 18 | ||
| 310 | +#define DEFINED_64_OFFSET 19 | ||
| 311 | |||
| 312 | /* Initialize the relax table. */ | ||
| 313 | const relax_typeS md_relax_table[] = | ||
| 314 | @@ -116,7 +117,9 @@ const relax_typeS md_relax_table[] = | ||
| 315 | { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 15: TLSGOTTPREL_OFFSET. */ | ||
| 316 | { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 16: TLSTPREL_OFFSET. */ | ||
| 317 | { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 17: TEXT_OFFSET. */ | ||
| 318 | - { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 } /* 18: TEXT_PC_OFFSET. */ | ||
| 319 | + { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 }, /* 18: TEXT_PC_OFFSET. */ | ||
| 320 | +// { 0x7fffffff, 0x80000000, INST_WORD_SIZE*2, 0 } /* 16: TLSTPREL_OFFSET. */ | ||
| 321 | + { 0x7fffffffffffffff, 0x8000000000000000, INST_WORD_SIZE, 0 } /* 17: DEFINED_64_OFFSET. */ | ||
| 322 | }; | ||
| 323 | |||
| 324 | static struct hash_control * opcode_hash_control; /* Opcode mnemonics. */ | ||
| 325 | @@ -396,7 +399,8 @@ const pseudo_typeS md_pseudo_table[] = | ||
| 326 | {"data32", cons, 4}, /* Same as word. */ | ||
| 327 | {"ent", s_func, 0}, /* Treat ent as function entry point. */ | ||
| 328 | {"end", microblaze_s_func, 1}, /* Treat end as function end point. */ | ||
| 329 | - {"gpword", s_rva, 4}, /* gpword label => store resolved label address in data section. */ | ||
| 330 | + {"gpword", s_rva, 8}, /* gpword label => store resolved label address in data section. */ | ||
| 331 | + {"gpdword", s_rva, 8}, /* gpword label => store resolved label address in data section. */ | ||
| 332 | {"weakext", microblaze_s_weakext, 0}, | ||
| 333 | {"rodata", microblaze_s_rdata, 0}, | ||
| 334 | {"sdata2", microblaze_s_rdata, 1}, | ||
| 335 | @@ -405,6 +409,7 @@ const pseudo_typeS md_pseudo_table[] = | ||
| 336 | {"sbss", microblaze_s_bss, 1}, | ||
| 337 | {"text", microblaze_s_text, 0}, | ||
| 338 | {"word", cons, 4}, | ||
| 339 | + {"dword", cons, 8}, | ||
| 340 | {"frame", s_ignore, 0}, | ||
| 341 | {"mask", s_ignore, 0}, /* Emitted by gcc. */ | ||
| 342 | {NULL, NULL, 0} | ||
| 343 | @@ -898,7 +903,7 @@ check_got (int * got_type, int * got_len) | ||
| 344 | extern bfd_reloc_code_real_type | ||
| 345 | parse_cons_expression_microblaze (expressionS *exp, int size) | ||
| 346 | { | ||
| 347 | - if (size == 4) | ||
| 348 | + if (size == 4 || (microblaze_arch_size == 64 && size == 8)) | ||
| 349 | { | ||
| 350 | /* Handle @GOTOFF et.al. */ | ||
| 351 | char *save, *gotfree_copy; | ||
| 352 | @@ -930,6 +935,7 @@ parse_cons_expression_microblaze (expressionS *exp, int size) | ||
| 353 | |||
| 354 | static const char * str_microblaze_ro_anchor = "RO"; | ||
| 355 | static const char * str_microblaze_rw_anchor = "RW"; | ||
| 356 | +static const char * str_microblaze_64 = "64"; | ||
| 357 | |||
| 358 | static bfd_boolean | ||
| 359 | check_spl_reg (unsigned * reg) | ||
| 360 | @@ -1174,6 +1180,33 @@ md_assemble (char * str) | ||
| 361 | inst |= (immed << IMM_LOW) & IMM_MASK; | ||
| 362 | } | ||
| 363 | } | ||
| 364 | +#if 0 //revisit | ||
| 365 | + else if (streq (name, "lli") || streq (name, "sli")) | ||
| 366 | + { | ||
| 367 | + temp = immed & 0xFFFFFFFFFFFF8000; | ||
| 368 | + if ((temp != 0) && (temp != 0xFFFFFFFFFFFF8000)) | ||
| 369 | + { | ||
| 370 | + /* Needs an immediate inst. */ | ||
| 371 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 372 | + if (opcode1 == NULL) | ||
| 373 | + { | ||
| 374 | + as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 375 | + return; | ||
| 376 | + } | ||
| 377 | + | ||
| 378 | + inst1 = opcode1->bit_sequence; | ||
| 379 | + inst1 |= ((immedl & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | ||
| 380 | + output[0] = INST_BYTE0 (inst1); | ||
| 381 | + output[1] = INST_BYTE1 (inst1); | ||
| 382 | + output[2] = INST_BYTE2 (inst1); | ||
| 383 | + output[3] = INST_BYTE3 (inst1); | ||
| 384 | + output = frag_more (isize); | ||
| 385 | + } | ||
| 386 | + inst |= (reg1 << RD_LOW) & RD_MASK; | ||
| 387 | + inst |= (reg2 << RA_LOW) & RA_MASK; | ||
| 388 | + inst |= (immed << IMM_LOW) & IMM_MASK; | ||
| 389 | + } | ||
| 390 | +#endif | ||
| 391 | else | ||
| 392 | { | ||
| 393 | temp = immed & 0xFFFF8000; | ||
| 394 | @@ -1926,6 +1959,7 @@ md_assemble (char * str) | ||
| 395 | if (exp.X_op != O_constant) | ||
| 396 | { | ||
| 397 | char *opc = NULL; | ||
| 398 | + //char *opc = str_microblaze_64; | ||
| 399 | relax_substateT subtype; | ||
| 400 | |||
| 401 | if (exp.X_md != 0) | ||
| 402 | @@ -1939,7 +1973,7 @@ md_assemble (char * str) | ||
| 403 | subtype, /* PC-relative or not. */ | ||
| 404 | exp.X_add_symbol, | ||
| 405 | exp.X_add_number, | ||
| 406 | - opc); | ||
| 407 | + (char *) opc); | ||
| 408 | immedl = 0L; | ||
| 409 | } | ||
| 410 | else | ||
| 411 | @@ -1977,7 +2011,7 @@ md_assemble (char * str) | ||
| 412 | reg1 = 0; | ||
| 413 | } | ||
| 414 | if (strcmp (op_end, "")) | ||
| 415 | - op_end = parse_imml (op_end + 1, & exp, MIN_IMM, MAX_IMM); | ||
| 416 | + op_end = parse_imml (op_end + 1, & exp, MIN_IMML, MAX_IMML); | ||
| 417 | else | ||
| 418 | as_fatal (_("Error in statement syntax")); | ||
| 419 | |||
| 420 | @@ -1987,7 +2021,8 @@ md_assemble (char * str) | ||
| 421 | |||
| 422 | if (exp.X_op != O_constant) | ||
| 423 | { | ||
| 424 | - char *opc = NULL; | ||
| 425 | + //char *opc = NULL; | ||
| 426 | + char *opc = str_microblaze_64; | ||
| 427 | relax_substateT subtype; | ||
| 428 | |||
| 429 | if (exp.X_md != 0) | ||
| 430 | @@ -2001,14 +2036,13 @@ md_assemble (char * str) | ||
| 431 | subtype, /* PC-relative or not. */ | ||
| 432 | exp.X_add_symbol, | ||
| 433 | exp.X_add_number, | ||
| 434 | - opc); | ||
| 435 | + (char *) opc); | ||
| 436 | immedl = 0L; | ||
| 437 | } | ||
| 438 | else | ||
| 439 | { | ||
| 440 | output = frag_more (isize); | ||
| 441 | immedl = exp.X_add_number; | ||
| 442 | - | ||
| 443 | opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 444 | if (opcode1 == NULL) | ||
| 445 | { | ||
| 446 | @@ -2184,13 +2218,23 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 447 | fragP->fr_fix += INST_WORD_SIZE * 2; | ||
| 448 | fragP->fr_var = 0; | ||
| 449 | break; | ||
| 450 | + case DEFINED_64_OFFSET: | ||
| 451 | + if (fragP->fr_symbol == GOT_symbol) | ||
| 452 | + fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, | ||
| 453 | + fragP->fr_offset, TRUE, BFD_RELOC_MICROBLAZE_64_GPC); | ||
| 454 | + else | ||
| 455 | + fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, | ||
| 456 | + fragP->fr_offset, TRUE, BFD_RELOC_MICROBLAZE_64); | ||
| 457 | + fragP->fr_fix += INST_WORD_SIZE * 2; | ||
| 458 | + fragP->fr_var = 0; | ||
| 459 | + break; | ||
| 460 | case DEFINED_ABS_SEGMENT: | ||
| 461 | if (fragP->fr_symbol == GOT_symbol) | ||
| 462 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE * 2, fragP->fr_symbol, | ||
| 463 | fragP->fr_offset, TRUE, BFD_RELOC_MICROBLAZE_64_GOTPC); | ||
| 464 | else | ||
| 465 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE * 2, fragP->fr_symbol, | ||
| 466 | - fragP->fr_offset, FALSE, BFD_RELOC_64); | ||
| 467 | + fragP->fr_offset, TRUE, BFD_RELOC_64); | ||
| 468 | fragP->fr_fix += INST_WORD_SIZE * 2; | ||
| 469 | fragP->fr_var = 0; | ||
| 470 | break; | ||
| 471 | @@ -2412,22 +2456,38 @@ md_apply_fix (fixS * fixP, | ||
| 472 | case BFD_RELOC_64_PCREL: | ||
| 473 | case BFD_RELOC_64: | ||
| 474 | case BFD_RELOC_MICROBLAZE_64_TEXTREL: | ||
| 475 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 476 | /* Add an imm instruction. First save the current instruction. */ | ||
| 477 | for (i = 0; i < INST_WORD_SIZE; i++) | ||
| 478 | buf[i + INST_WORD_SIZE] = buf[i]; | ||
| 479 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | ||
| 480 | + { | ||
| 481 | + /* Generate the imm instruction. */ | ||
| 482 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 483 | + if (opcode1 == NULL) | ||
| 484 | + { | ||
| 485 | + as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 486 | + return; | ||
| 487 | + } | ||
| 488 | |||
| 489 | - /* Generate the imm instruction. */ | ||
| 490 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 491 | - if (opcode1 == NULL) | ||
| 492 | - { | ||
| 493 | - as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 494 | - return; | ||
| 495 | - } | ||
| 496 | - | ||
| 497 | - inst1 = opcode1->bit_sequence; | ||
| 498 | - if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | ||
| 499 | - inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; | ||
| 500 | - | ||
| 501 | + inst1 = opcode1->bit_sequence; | ||
| 502 | + if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | ||
| 503 | + inst1 |= ((val & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | ||
| 504 | + } | ||
| 505 | + else | ||
| 506 | + { | ||
| 507 | + /* Generate the imm instruction. */ | ||
| 508 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 509 | + if (opcode1 == NULL) | ||
| 510 | + { | ||
| 511 | + as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 512 | + return; | ||
| 513 | + } | ||
| 514 | + | ||
| 515 | + inst1 = opcode1->bit_sequence; | ||
| 516 | + if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | ||
| 517 | + inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; | ||
| 518 | + } | ||
| 519 | buf[0] = INST_BYTE0 (inst1); | ||
| 520 | buf[1] = INST_BYTE1 (inst1); | ||
| 521 | buf[2] = INST_BYTE2 (inst1); | ||
| 522 | @@ -2456,6 +2516,7 @@ md_apply_fix (fixS * fixP, | ||
| 523 | /* Fall through. */ | ||
| 524 | |||
| 525 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 526 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 527 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 528 | case BFD_RELOC_MICROBLAZE_64_PLT: | ||
| 529 | case BFD_RELOC_MICROBLAZE_64_GOTOFF: | ||
| 530 | @@ -2463,12 +2524,16 @@ md_apply_fix (fixS * fixP, | ||
| 531 | /* Add an imm instruction. First save the current instruction. */ | ||
| 532 | for (i = 0; i < INST_WORD_SIZE; i++) | ||
| 533 | buf[i + INST_WORD_SIZE] = buf[i]; | ||
| 534 | - | ||
| 535 | - /* Generate the imm instruction. */ | ||
| 536 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 537 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) | ||
| 538 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 539 | + else | ||
| 540 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 541 | if (opcode1 == NULL) | ||
| 542 | { | ||
| 543 | - as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 544 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) | ||
| 545 | + as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 546 | + else | ||
| 547 | + as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 548 | return; | ||
| 549 | } | ||
| 550 | |||
| 551 | @@ -2492,6 +2557,8 @@ md_apply_fix (fixS * fixP, | ||
| 552 | moves code around due to relaxing. */ | ||
| 553 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) | ||
| 554 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | ||
| 555 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | ||
| 556 | + fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | ||
| 557 | else if (fixP->fx_r_type == BFD_RELOC_32) | ||
| 558 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; | ||
| 559 | else | ||
| 560 | @@ -2535,6 +2602,32 @@ md_estimate_size_before_relax (fragS * fragP, | ||
| 561 | as_bad (_("Absolute PC-relative value in relaxation code. Assembler error.....")); | ||
| 562 | abort (); | ||
| 563 | } | ||
| 564 | + else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type | ||
| 565 | + && !S_IS_WEAK (fragP->fr_symbol)) | ||
| 566 | + { | ||
| 567 | + if (fragP->fr_opcode != NULL) { | ||
| 568 | + if(streq (fragP->fr_opcode, str_microblaze_64)) | ||
| 569 | + { | ||
| 570 | + /* Used as an absolute value. */ | ||
| 571 | + fragP->fr_subtype = DEFINED_64_OFFSET; | ||
| 572 | + /* Variable part does not change. */ | ||
| 573 | + fragP->fr_var = INST_WORD_SIZE; | ||
| 574 | + } | ||
| 575 | + else | ||
| 576 | + { | ||
| 577 | + fragP->fr_subtype = DEFINED_PC_OFFSET; | ||
| 578 | + /* Don't know now whether we need an imm instruction. */ | ||
| 579 | + fragP->fr_var = INST_WORD_SIZE; | ||
| 580 | + } | ||
| 581 | + } | ||
| 582 | + else | ||
| 583 | + { | ||
| 584 | + fragP->fr_subtype = DEFINED_PC_OFFSET; | ||
| 585 | + /* Don't know now whether we need an imm instruction. */ | ||
| 586 | + fragP->fr_var = INST_WORD_SIZE; | ||
| 587 | + } | ||
| 588 | + } | ||
| 589 | + #if 0 | ||
| 590 | else if (S_GET_SEGMENT (fragP->fr_symbol) == segment_type && | ||
| 591 | !S_IS_WEAK (fragP->fr_symbol)) | ||
| 592 | { | ||
| 593 | @@ -2542,6 +2635,7 @@ md_estimate_size_before_relax (fragS * fragP, | ||
| 594 | /* Don't know now whether we need an imm instruction. */ | ||
| 595 | fragP->fr_var = INST_WORD_SIZE; | ||
| 596 | } | ||
| 597 | +#endif | ||
| 598 | else if (S_IS_DEFINED (fragP->fr_symbol) | ||
| 599 | && (((S_GET_SEGMENT (fragP->fr_symbol))->flags & SEC_CODE) == 0)) | ||
| 600 | { | ||
| 601 | @@ -2644,6 +2738,7 @@ md_estimate_size_before_relax (fragS * fragP, | ||
| 602 | case TLSLD_OFFSET: | ||
| 603 | case TLSTPREL_OFFSET: | ||
| 604 | case TLSDTPREL_OFFSET: | ||
| 605 | + case DEFINED_64_OFFSET: | ||
| 606 | fragP->fr_var = INST_WORD_SIZE*2; | ||
| 607 | break; | ||
| 608 | case DEFINED_RO_SEGMENT: | ||
| 609 | @@ -2697,7 +2792,7 @@ md_pcrel_from_section (fixS * fixp, segT sec ATTRIBUTE_UNUSED) | ||
| 610 | else | ||
| 611 | { | ||
| 612 | /* The case where we are going to resolve things... */ | ||
| 613 | - if (fixp->fx_r_type == BFD_RELOC_64_PCREL) | ||
| 614 | + if (fixp->fx_r_type == BFD_RELOC_64_PCREL ||fixp->fx_r_type == BFD_RELOC_MICROBLAZE_64) | ||
| 615 | return fixp->fx_where + fixp->fx_frag->fr_address + INST_WORD_SIZE; | ||
| 616 | else | ||
| 617 | return fixp->fx_where + fixp->fx_frag->fr_address; | ||
| 618 | @@ -2730,6 +2825,8 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | ||
| 619 | case BFD_RELOC_MICROBLAZE_32_RWSDA: | ||
| 620 | case BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: | ||
| 621 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | ||
| 622 | + case BFD_RELOC_MICROBLAZE_64_GPC: | ||
| 623 | + case BFD_RELOC_MICROBLAZE_64: | ||
| 624 | case BFD_RELOC_MICROBLAZE_64_GOT: | ||
| 625 | case BFD_RELOC_MICROBLAZE_64_PLT: | ||
| 626 | case BFD_RELOC_MICROBLAZE_64_GOTOFF: | ||
| 627 | @@ -2872,7 +2969,10 @@ cons_fix_new_microblaze (fragS * frag, | ||
| 628 | r = BFD_RELOC_32; | ||
| 629 | break; | ||
| 630 | case 8: | ||
| 631 | - r = BFD_RELOC_64; | ||
| 632 | + if (microblaze_arch_size == 64) | ||
| 633 | + r = BFD_RELOC_32; | ||
| 634 | + else | ||
| 635 | + r = BFD_RELOC_64; | ||
| 636 | break; | ||
| 637 | default: | ||
| 638 | as_bad (_("unsupported BFD relocation size %u"), size); | ||
| 639 | diff --git a/include/elf/microblaze.h b/include/elf/microblaze.h | ||
| 640 | index 3978a3dc01..938841b240 100644 | ||
| 641 | --- a/include/elf/microblaze.h | ||
| 642 | +++ b/include/elf/microblaze.h | ||
| 643 | @@ -62,6 +62,8 @@ START_RELOC_NUMBERS (elf_microblaze_reloc_type) | ||
| 644 | RELOC_NUMBER (R_MICROBLAZE_TEXTREL_64, 31) /* TEXT Entry offset 64-bit. */ | ||
| 645 | RELOC_NUMBER (R_MICROBLAZE_TEXTREL_32_LO, 32) /* TEXT Entry offset 32-bit. */ | ||
| 646 | RELOC_NUMBER (R_MICROBLAZE_32_NONE, 33) | ||
| 647 | + RELOC_NUMBER (R_MICROBLAZE_IMML_64, 34) | ||
| 648 | + RELOC_NUMBER (R_MICROBLAZE_GPC_64, 35) /* GOT entry offset. */ | ||
| 649 | |||
| 650 | END_RELOC_NUMBERS (R_MICROBLAZE_max) | ||
| 651 | |||
| 652 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | ||
| 653 | index 61eaa39b3e..f2139a6839 100644 | ||
| 654 | --- a/opcodes/microblaze-opc.h | ||
| 655 | +++ b/opcodes/microblaze-opc.h | ||
| 656 | @@ -538,8 +538,8 @@ struct op_code_struct | ||
| 657 | {"llr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xC8000300, OPCODE_MASK_H4, llr, memory_load_inst }, | ||
| 658 | {"sl", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000100, OPCODE_MASK_H4, sl, memory_store_inst }, | ||
| 659 | {"slr", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xD8000300, OPCODE_MASK_H4, slr, memory_store_inst }, | ||
| 660 | - {"lli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, /* Identical to 32-bit */ | ||
| 661 | - {"sli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, /* Identical to 32-bit */ | ||
| 662 | + {"lli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xEC000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, /* Identical to 32-bit */ | ||
| 663 | + {"sli", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xFC000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, /* Identical to 32-bit */ | ||
| 664 | {"lla", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* lla translates to addlik */ | ||
| 665 | {"dadd", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000400, OPCODE_MASK_H4, dadd, arithmetic_inst }, | ||
| 666 | {"drsub", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000480, OPCODE_MASK_H4, drsub, arithmetic_inst }, | ||
| 667 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | ||
| 668 | index 1dcd3dca3d..fcf259a362 100644 | ||
| 669 | --- a/opcodes/microblaze-opcm.h | ||
| 670 | +++ b/opcodes/microblaze-opcm.h | ||
| 671 | @@ -40,8 +40,8 @@ enum microblaze_instr | ||
| 672 | imm, rtsd, rtid, rtbd, rted, bri, brid, brlid, brai, braid, bralid, | ||
| 673 | brki, beqi, beqid, bnei, bneid, blti, bltid, blei, bleid, bgti, | ||
| 674 | bgtid, bgei, bgeid, lbu, lbuea, lbur, lhu, lhuea, lhur, lw, lwea, lwr, lwx, | ||
| 675 | - sb, sbea, sbr, sh, shea, shr, sw, swea, swr, swx, lbui, lhui, lwi, | ||
| 676 | - sbi, shi, swi, msrset, msrclr, tuqula, mbi_fadd, frsub, mbi_fmul, mbi_fdiv, | ||
| 677 | + sb, sbea, sbr, sh, shea, shr, sw, swea, swr, swx, lbui, lhui, lwi, lli, | ||
| 678 | + sbi, shi, swi, sli, msrset, msrclr, tuqula, mbi_fadd, frsub, mbi_fmul, mbi_fdiv, | ||
| 679 | fcmp_lt, fcmp_eq, fcmp_le, fcmp_gt, fcmp_ne, fcmp_ge, fcmp_un, flt, | ||
| 680 | fint, fsqrt, | ||
| 681 | tget, tcget, tnget, tncget, tput, tcput, tnput, tncput, | ||
| 682 | -- | ||
| 683 | 2.17.1 | ||
| 684 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0016-Patch-Microblaze-negl-instruction-is-overriding-rsub.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0015-Patch-Microblaze-negl-instruction-is-overriding-rsub.patch index 6a3e34c4..0d472331 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0016-Patch-Microblaze-negl-instruction-is-overriding-rsub.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0015-Patch-Microblaze-negl-instruction-is-overriding-rsub.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 5b9a1079eefbfbe23992f231ad69af488040e302 Mon Sep 17 00:00:00 2001 | 1 | From e3d5306efa998ff6e72a6b0ca92d1b9bfadf8156 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Tue, 11 Sep 2018 13:48:33 +0530 | 3 | Date: Tue, 11 Sep 2018 13:48:33 +0530 |
| 4 | Subject: [PATCH 16/52] [Patch,Microblaze] : negl instruction is overriding | 4 | Subject: [PATCH 15/38] [Patch,Microblaze] : negl instruction is overriding |
| 5 | rsubl,fixed it by changing the instruction order... | 5 | rsubl,fixed it by changing the instruction order... |
| 6 | 6 | ||
| 7 | --- | 7 | --- |
| @@ -9,10 +9,10 @@ Subject: [PATCH 16/52] [Patch,Microblaze] : negl instruction is overriding | |||
| 9 | 1 file changed, 2 insertions(+), 2 deletions(-) | 9 | 1 file changed, 2 insertions(+), 2 deletions(-) |
| 10 | 10 | ||
| 11 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 11 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 12 | index f2139a6839..f970941209 100644 | 12 | index 4a1545d8920..b1635f41529 100644 |
| 13 | --- a/opcodes/microblaze-opc.h | 13 | --- a/opcodes/microblaze-opc.h |
| 14 | +++ b/opcodes/microblaze-opc.h | 14 | +++ b/opcodes/microblaze-opc.h |
| 15 | @@ -275,9 +275,7 @@ struct op_code_struct | 15 | @@ -275,9 +275,7 @@ const struct op_code_struct |
| 16 | {"la", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik. */ | 16 | {"la", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x30000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* la translates to addik. */ |
| 17 | {"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42. */ | 17 | {"tuqula",INST_TYPE_RD, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x3000002A, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* tuqula rd translates to addik rd, r0, 42. */ |
| 18 | {"not", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA800FFFF, OPCODE_MASK_H34, invalid_inst, logical_inst }, /* not translates to xori rd,ra,-1. */ | 18 | {"not", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA800FFFF, OPCODE_MASK_H34, invalid_inst, logical_inst }, /* not translates to xori rd,ra,-1. */ |
| @@ -22,7 +22,7 @@ index f2139a6839..f970941209 100644 | |||
| 22 | {"lmi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, | 22 | {"lmi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xE8000000, OPCODE_MASK_H, invalid_inst, memory_load_inst }, |
| 23 | {"smi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, | 23 | {"smi", INST_TYPE_RD_R1_IMM, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xF8000000, OPCODE_MASK_H, invalid_inst, memory_store_inst }, |
| 24 | {"msrset",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst }, | 24 | {"msrset",INST_TYPE_RD_IMM15, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x94100000, OPCODE_MASK_H23N, msrset, special_inst }, |
| 25 | @@ -555,6 +553,8 @@ struct op_code_struct | 25 | @@ -555,6 +553,8 @@ const struct op_code_struct |
| 26 | {"dbl", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000680, OPCODE_MASK_H4, dbl, arithmetic_inst }, | 26 | {"dbl", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000680, OPCODE_MASK_H4, dbl, arithmetic_inst }, |
| 27 | {"dlong", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000700, OPCODE_MASK_H4, dlong, arithmetic_inst }, | 27 | {"dlong", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000700, OPCODE_MASK_H4, dlong, arithmetic_inst }, |
| 28 | {"dsqrt", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000780, OPCODE_MASK_H4, dsqrt, arithmetic_inst }, | 28 | {"dsqrt", INST_TYPE_RD_R1, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x58000780, OPCODE_MASK_H4, dsqrt, arithmetic_inst }, |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0017-Added-relocations-for-MB-X.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0016-Added-relocations-for-MB-X.patch index 3e0773b0..c42ad41f 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0017-Added-relocations-for-MB-X.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0016-Added-relocations-for-MB-X.patch | |||
| @@ -1,11 +1,14 @@ | |||
| 1 | From 442430f1010a9e16821e68ca2842579538ff564b Mon Sep 17 00:00:00 2001 | 1 | From f3d027568966b3c5ff8404656e6aa875c71926a1 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Tue, 11 Sep 2018 17:30:17 +0530 | 3 | Date: Tue, 11 Sep 2018 17:30:17 +0530 |
| 4 | Subject: [PATCH 17/52] Added relocations for MB-X | 4 | Subject: [PATCH 16/38] Added relocations for MB-X |
| 5 | 5 | ||
| 6 | Conflicts: | 6 | Conflicts: |
| 7 | bfd/bfd-in2.h | 7 | bfd/bfd-in2.h |
| 8 | gas/config/tc-microblaze.c | 8 | gas/config/tc-microblaze.c |
| 9 | |||
| 10 | Conflicts: | ||
| 11 | gas/config/tc-microblaze.c | ||
| 9 | --- | 12 | --- |
| 10 | bfd/bfd-in2.h | 9 +++- | 13 | bfd/bfd-in2.h | 9 +++- |
| 11 | bfd/libbfd.h | 4 +- | 14 | bfd/libbfd.h | 4 +- |
| @@ -14,10 +17,10 @@ Conflicts: | |||
| 14 | 4 files changed, 61 insertions(+), 68 deletions(-) | 17 | 4 files changed, 61 insertions(+), 68 deletions(-) |
| 15 | 18 | ||
| 16 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | 19 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h |
| 17 | index a335182ba1..57ea4f6132 100644 | 20 | index 2a1d7563643..568bfafee7c 100644 |
| 18 | --- a/bfd/bfd-in2.h | 21 | --- a/bfd/bfd-in2.h |
| 19 | +++ b/bfd/bfd-in2.h | 22 | +++ b/bfd/bfd-in2.h |
| 20 | @@ -5436,13 +5436,18 @@ done here - only used for relaxing */ | 23 | @@ -5431,13 +5431,18 @@ done here - only used for relaxing */ |
| 21 | /* This is a 64 bit reloc that stores the 32 bit pc relative | 24 | /* This is a 64 bit reloc that stores the 32 bit pc relative |
| 22 | value in two words (with an imm instruction). No relocation is | 25 | value in two words (with an imm instruction). No relocation is |
| 23 | done here - only used for relaxing */ | 26 | done here - only used for relaxing */ |
| @@ -39,10 +42,10 @@ index a335182ba1..57ea4f6132 100644 | |||
| 39 | value in two words (with an imm instruction). The relocation is | 42 | value in two words (with an imm instruction). The relocation is |
| 40 | PC-relative GOT offset */ | 43 | PC-relative GOT offset */ |
| 41 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h | 44 | diff --git a/bfd/libbfd.h b/bfd/libbfd.h |
| 42 | index b4aace6a70..b4b7ee29a3 100644 | 45 | index 2caaf27bcd7..4a21358f5e0 100644 |
| 43 | --- a/bfd/libbfd.h | 46 | --- a/bfd/libbfd.h |
| 44 | +++ b/bfd/libbfd.h | 47 | +++ b/bfd/libbfd.h |
| 45 | @@ -2969,14 +2969,14 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", | 48 | @@ -2990,14 +2990,14 @@ static const char *const bfd_reloc_code_real_names[] = { "@@uninitialized@@", |
| 46 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", | 49 | "BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM", |
| 47 | "BFD_RELOC_MICROBLAZE_32_NONE", | 50 | "BFD_RELOC_MICROBLAZE_32_NONE", |
| 48 | "BFD_RELOC_MICROBLAZE_64_NONE", | 51 | "BFD_RELOC_MICROBLAZE_64_NONE", |
| @@ -60,10 +63,10 @@ index b4aace6a70..b4b7ee29a3 100644 | |||
| 60 | "BFD_RELOC_MICROBLAZE_64_TLSGD", | 63 | "BFD_RELOC_MICROBLAZE_64_TLSGD", |
| 61 | "BFD_RELOC_MICROBLAZE_64_TLSLD", | 64 | "BFD_RELOC_MICROBLAZE_64_TLSLD", |
| 62 | diff --git a/bfd/reloc.c b/bfd/reloc.c | 65 | diff --git a/bfd/reloc.c b/bfd/reloc.c |
| 63 | index 0e8a24e9cb..b5c97da3ff 100644 | 66 | index 288a5026d27..472a06a188d 100644 |
| 64 | --- a/bfd/reloc.c | 67 | --- a/bfd/reloc.c |
| 65 | +++ b/bfd/reloc.c | 68 | +++ b/bfd/reloc.c |
| 66 | @@ -6866,24 +6866,12 @@ ENUMDOC | 69 | @@ -6904,24 +6904,12 @@ ENUMDOC |
| 67 | done here - only used for relaxing | 70 | done here - only used for relaxing |
| 68 | ENUM | 71 | ENUM |
| 69 | BFD_RELOC_MICROBLAZE_64_NONE | 72 | BFD_RELOC_MICROBLAZE_64_NONE |
| @@ -88,7 +91,7 @@ index 0e8a24e9cb..b5c97da3ff 100644 | |||
| 88 | ENUMDOC | 91 | ENUMDOC |
| 89 | This is a 64 bit reloc that stores the 32 bit pc relative | 92 | This is a 64 bit reloc that stores the 32 bit pc relative |
| 90 | value in two words (with an imm instruction). The relocation is | 93 | value in two words (with an imm instruction). The relocation is |
| 91 | @@ -6969,6 +6957,20 @@ ENUMDOC | 94 | @@ -7007,6 +6995,20 @@ ENUMDOC |
| 92 | value in two words (with an imm instruction). The relocation is | 95 | value in two words (with an imm instruction). The relocation is |
| 93 | relative offset from start of TEXT. | 96 | relative offset from start of TEXT. |
| 94 | 97 | ||
| @@ -110,7 +113,7 @@ index 0e8a24e9cb..b5c97da3ff 100644 | |||
| 110 | BFD_RELOC_AARCH64_RELOC_START | 113 | BFD_RELOC_AARCH64_RELOC_START |
| 111 | ENUMDOC | 114 | ENUMDOC |
| 112 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 115 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 113 | index 33eda2a4da..5e11a77e70 100644 | 116 | index 378fb882f13..685a6e93f2b 100644 |
| 114 | --- a/gas/config/tc-microblaze.c | 117 | --- a/gas/config/tc-microblaze.c |
| 115 | +++ b/gas/config/tc-microblaze.c | 118 | +++ b/gas/config/tc-microblaze.c |
| 116 | @@ -95,6 +95,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP"; | 119 | @@ -95,6 +95,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP"; |
| @@ -130,8 +133,8 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 130 | + { 0x7fffffffffffffff, 0x8000000000000000, INST_WORD_SIZE*2, 0 } /* 20: DEFINED_64_PC_OFFSET. */ | 133 | + { 0x7fffffffffffffff, 0x8000000000000000, INST_WORD_SIZE*2, 0 } /* 20: DEFINED_64_PC_OFFSET. */ |
| 131 | }; | 134 | }; |
| 132 | 135 | ||
| 133 | static struct hash_control * opcode_hash_control; /* Opcode mnemonics. */ | 136 | static htab_t opcode_hash_control; /* Opcode mnemonics. */ |
| 134 | @@ -1180,33 +1182,6 @@ md_assemble (char * str) | 137 | @@ -1184,33 +1186,6 @@ md_assemble (char * str) |
| 135 | inst |= (immed << IMM_LOW) & IMM_MASK; | 138 | inst |= (immed << IMM_LOW) & IMM_MASK; |
| 136 | } | 139 | } |
| 137 | } | 140 | } |
| @@ -142,7 +145,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 142 | - if ((temp != 0) && (temp != 0xFFFFFFFFFFFF8000)) | 145 | - if ((temp != 0) && (temp != 0xFFFFFFFFFFFF8000)) |
| 143 | - { | 146 | - { |
| 144 | - /* Needs an immediate inst. */ | 147 | - /* Needs an immediate inst. */ |
| 145 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 148 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 146 | - if (opcode1 == NULL) | 149 | - if (opcode1 == NULL) |
| 147 | - { | 150 | - { |
| 148 | - as_bad (_("unknown opcode \"%s\""), "imml"); | 151 | - as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -165,7 +168,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 165 | else | 168 | else |
| 166 | { | 169 | { |
| 167 | temp = immed & 0xFFFF8000; | 170 | temp = immed & 0xFFFF8000; |
| 168 | @@ -1958,8 +1933,8 @@ md_assemble (char * str) | 171 | @@ -1970,8 +1945,8 @@ md_assemble (char * str) |
| 169 | 172 | ||
| 170 | if (exp.X_op != O_constant) | 173 | if (exp.X_op != O_constant) |
| 171 | { | 174 | { |
| @@ -176,7 +179,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 176 | relax_substateT subtype; | 179 | relax_substateT subtype; |
| 177 | 180 | ||
| 178 | if (exp.X_md != 0) | 181 | if (exp.X_md != 0) |
| 179 | @@ -2218,13 +2193,19 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, | 182 | @@ -2230,13 +2205,19 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, |
| 180 | fragP->fr_fix += INST_WORD_SIZE * 2; | 183 | fragP->fr_fix += INST_WORD_SIZE * 2; |
| 181 | fragP->fr_var = 0; | 184 | fragP->fr_var = 0; |
| 182 | break; | 185 | break; |
| @@ -189,25 +192,25 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 189 | case DEFINED_64_OFFSET: | 192 | case DEFINED_64_OFFSET: |
| 190 | if (fragP->fr_symbol == GOT_symbol) | 193 | if (fragP->fr_symbol == GOT_symbol) |
| 191 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, | 194 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, |
| 192 | - fragP->fr_offset, TRUE, BFD_RELOC_MICROBLAZE_64_GPC); | 195 | - fragP->fr_offset, true, BFD_RELOC_MICROBLAZE_64_GPC); |
| 193 | + fragP->fr_offset, FALSE, BFD_RELOC_MICROBLAZE_64_GPC); | 196 | + fragP->fr_offset, false, BFD_RELOC_MICROBLAZE_64_GPC); |
| 194 | else | 197 | else |
| 195 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, | 198 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE, fragP->fr_symbol, |
| 196 | - fragP->fr_offset, TRUE, BFD_RELOC_MICROBLAZE_64); | 199 | - fragP->fr_offset, true, BFD_RELOC_MICROBLAZE_64); |
| 197 | + fragP->fr_offset, FALSE, BFD_RELOC_MICROBLAZE_64); | 200 | + fragP->fr_offset, false, BFD_RELOC_MICROBLAZE_64); |
| 198 | fragP->fr_fix += INST_WORD_SIZE * 2; | 201 | fragP->fr_fix += INST_WORD_SIZE * 2; |
| 199 | fragP->fr_var = 0; | 202 | fragP->fr_var = 0; |
| 200 | break; | 203 | break; |
| 201 | @@ -2234,7 +2215,7 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, | 204 | @@ -2246,7 +2227,7 @@ md_convert_frag (bfd * abfd ATTRIBUTE_UNUSED, |
| 202 | fragP->fr_offset, TRUE, BFD_RELOC_MICROBLAZE_64_GOTPC); | 205 | fragP->fr_offset, true, BFD_RELOC_MICROBLAZE_64_GOTPC); |
| 203 | else | 206 | else |
| 204 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE * 2, fragP->fr_symbol, | 207 | fix_new (fragP, fragP->fr_fix, INST_WORD_SIZE * 2, fragP->fr_symbol, |
| 205 | - fragP->fr_offset, TRUE, BFD_RELOC_64); | 208 | - fragP->fr_offset, true, BFD_RELOC_64); |
| 206 | + fragP->fr_offset, FALSE, BFD_RELOC_64); | 209 | + fragP->fr_offset, false, BFD_RELOC_64); |
| 207 | fragP->fr_fix += INST_WORD_SIZE * 2; | 210 | fragP->fr_fix += INST_WORD_SIZE * 2; |
| 208 | fragP->fr_var = 0; | 211 | fragP->fr_var = 0; |
| 209 | break; | 212 | break; |
| 210 | @@ -2453,14 +2434,17 @@ md_apply_fix (fixS * fixP, | 213 | @@ -2464,14 +2445,17 @@ md_apply_fix (fixS * fixP, |
| 211 | } | 214 | } |
| 212 | } | 215 | } |
| 213 | break; | 216 | break; |
| @@ -225,8 +228,8 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 225 | + || fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) | 228 | + || fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) |
| 226 | { | 229 | { |
| 227 | /* Generate the imm instruction. */ | 230 | /* Generate the imm instruction. */ |
| 228 | opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 231 | opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 229 | @@ -2473,6 +2457,10 @@ md_apply_fix (fixS * fixP, | 232 | @@ -2484,6 +2468,10 @@ md_apply_fix (fixS * fixP, |
| 230 | inst1 = opcode1->bit_sequence; | 233 | inst1 = opcode1->bit_sequence; |
| 231 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 234 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| 232 | inst1 |= ((val & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | 235 | inst1 |= ((val & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; |
| @@ -237,7 +240,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 237 | } | 240 | } |
| 238 | else | 241 | else |
| 239 | { | 242 | { |
| 240 | @@ -2483,7 +2471,7 @@ md_apply_fix (fixS * fixP, | 243 | @@ -2494,7 +2482,7 @@ md_apply_fix (fixS * fixP, |
| 241 | as_bad (_("unknown opcode \"%s\""), "imm"); | 244 | as_bad (_("unknown opcode \"%s\""), "imm"); |
| 242 | return; | 245 | return; |
| 243 | } | 246 | } |
| @@ -246,8 +249,8 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 246 | inst1 = opcode1->bit_sequence; | 249 | inst1 = opcode1->bit_sequence; |
| 247 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 250 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| 248 | inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; | 251 | inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; |
| 249 | @@ -2530,7 +2518,7 @@ md_apply_fix (fixS * fixP, | 252 | @@ -2542,7 +2530,7 @@ md_apply_fix (fixS * fixP, |
| 250 | opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 253 | opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); |
| 251 | if (opcode1 == NULL) | 254 | if (opcode1 == NULL) |
| 252 | { | 255 | { |
| 253 | - if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) | 256 | - if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) |
| @@ -255,7 +258,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 255 | as_bad (_("unknown opcode \"%s\""), "imml"); | 258 | as_bad (_("unknown opcode \"%s\""), "imml"); |
| 256 | else | 259 | else |
| 257 | as_bad (_("unknown opcode \"%s\""), "imm"); | 260 | as_bad (_("unknown opcode \"%s\""), "imm"); |
| 258 | @@ -2557,8 +2545,6 @@ md_apply_fix (fixS * fixP, | 261 | @@ -2569,8 +2557,6 @@ md_apply_fix (fixS * fixP, |
| 259 | moves code around due to relaxing. */ | 262 | moves code around due to relaxing. */ |
| 260 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) | 263 | if (fixP->fx_r_type == BFD_RELOC_64_PCREL) |
| 261 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | 264 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; |
| @@ -264,7 +267,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 264 | else if (fixP->fx_r_type == BFD_RELOC_32) | 267 | else if (fixP->fx_r_type == BFD_RELOC_32) |
| 265 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; | 268 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; |
| 266 | else | 269 | else |
| 267 | @@ -2609,33 +2595,24 @@ md_estimate_size_before_relax (fragS * fragP, | 270 | @@ -2621,33 +2607,24 @@ md_estimate_size_before_relax (fragS * fragP, |
| 268 | if(streq (fragP->fr_opcode, str_microblaze_64)) | 271 | if(streq (fragP->fr_opcode, str_microblaze_64)) |
| 269 | { | 272 | { |
| 270 | /* Used as an absolute value. */ | 273 | /* Used as an absolute value. */ |
| @@ -302,7 +305,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 302 | else if (S_IS_DEFINED (fragP->fr_symbol) | 305 | else if (S_IS_DEFINED (fragP->fr_symbol) |
| 303 | && (((S_GET_SEGMENT (fragP->fr_symbol))->flags & SEC_CODE) == 0)) | 306 | && (((S_GET_SEGMENT (fragP->fr_symbol))->flags & SEC_CODE) == 0)) |
| 304 | { | 307 | { |
| 305 | @@ -2665,6 +2642,13 @@ md_estimate_size_before_relax (fragS * fragP, | 308 | @@ -2677,6 +2654,13 @@ md_estimate_size_before_relax (fragS * fragP, |
| 306 | /* Variable part does not change. */ | 309 | /* Variable part does not change. */ |
| 307 | fragP->fr_var = INST_WORD_SIZE*2; | 310 | fragP->fr_var = INST_WORD_SIZE*2; |
| 308 | } | 311 | } |
| @@ -316,7 +319,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 316 | else if (streq (fragP->fr_opcode, str_microblaze_ro_anchor)) | 319 | else if (streq (fragP->fr_opcode, str_microblaze_ro_anchor)) |
| 317 | { | 320 | { |
| 318 | /* It is accessed using the small data read only anchor. */ | 321 | /* It is accessed using the small data read only anchor. */ |
| 319 | @@ -2739,6 +2723,7 @@ md_estimate_size_before_relax (fragS * fragP, | 322 | @@ -2751,6 +2735,7 @@ md_estimate_size_before_relax (fragS * fragP, |
| 320 | case TLSTPREL_OFFSET: | 323 | case TLSTPREL_OFFSET: |
| 321 | case TLSDTPREL_OFFSET: | 324 | case TLSDTPREL_OFFSET: |
| 322 | case DEFINED_64_OFFSET: | 325 | case DEFINED_64_OFFSET: |
| @@ -324,7 +327,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 324 | fragP->fr_var = INST_WORD_SIZE*2; | 327 | fragP->fr_var = INST_WORD_SIZE*2; |
| 325 | break; | 328 | break; |
| 326 | case DEFINED_RO_SEGMENT: | 329 | case DEFINED_RO_SEGMENT: |
| 327 | @@ -2792,7 +2777,7 @@ md_pcrel_from_section (fixS * fixp, segT sec ATTRIBUTE_UNUSED) | 330 | @@ -2804,7 +2789,7 @@ md_pcrel_from_section (fixS * fixp, segT sec ATTRIBUTE_UNUSED) |
| 328 | else | 331 | else |
| 329 | { | 332 | { |
| 330 | /* The case where we are going to resolve things... */ | 333 | /* The case where we are going to resolve things... */ |
| @@ -333,7 +336,7 @@ index 33eda2a4da..5e11a77e70 100644 | |||
| 333 | return fixp->fx_where + fixp->fx_frag->fr_address + INST_WORD_SIZE; | 336 | return fixp->fx_where + fixp->fx_frag->fr_address + INST_WORD_SIZE; |
| 334 | else | 337 | else |
| 335 | return fixp->fx_where + fixp->fx_frag->fr_address; | 338 | return fixp->fx_where + fixp->fx_frag->fr_address; |
| 336 | @@ -2827,6 +2812,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | 339 | @@ -2839,6 +2824,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) |
| 337 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | 340 | case BFD_RELOC_MICROBLAZE_64_GOTPC: |
| 338 | case BFD_RELOC_MICROBLAZE_64_GPC: | 341 | case BFD_RELOC_MICROBLAZE_64_GPC: |
| 339 | case BFD_RELOC_MICROBLAZE_64: | 342 | case BFD_RELOC_MICROBLAZE_64: |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0018-Fixed-MB-x-relocation-issues.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0017-Fixed-MB-x-relocation-issues.patch index 315d0445..a14b7159 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0018-Fixed-MB-x-relocation-issues.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0017-Fixed-MB-x-relocation-issues.patch | |||
| @@ -1,72 +1,53 @@ | |||
| 1 | From 5b1793fe6dfb16755f584821023145bdfc4b55d7 Mon Sep 17 00:00:00 2001 | 1 | From 835389f0f82b69f923aad7148717c48372a28828 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Fri, 28 Sep 2018 12:04:55 +0530 | 3 | Date: Fri, 28 Sep 2018 12:04:55 +0530 |
| 4 | Subject: [PATCH 18/52] -Fixed MB-x relocation issues -Added imml for required | 4 | Subject: [PATCH 17/38] -Fixed MB-x relocation issues -Added imml for required |
| 5 | MB-x instructions | 5 | MB-x instructions |
| 6 | 6 | ||
| 7 | Conflicts: | ||
| 8 | bfd/elf64-microblaze.c | ||
| 9 | gas/config/tc-microblaze.c | ||
| 7 | --- | 10 | --- |
| 8 | bfd/elf64-microblaze.c | 68 ++++++++++++++--- | 11 | bfd/elf64-microblaze.c | 48 ++++++++++-- |
| 9 | gas/config/tc-microblaze.c | 152 +++++++++++++++++++++++++++---------- | 12 | gas/config/tc-microblaze.c | 155 ++++++++++++++++++++++++++----------- |
| 10 | gas/tc.h | 2 +- | 13 | gas/tc.h | 2 +- |
| 11 | 3 files changed, 167 insertions(+), 55 deletions(-) | 14 | 3 files changed, 152 insertions(+), 53 deletions(-) |
| 12 | 15 | ||
| 13 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 16 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 14 | index 6b1f47d00d..6676d9f93d 100644 | 17 | index 46c4aba46f1..010ee1d15b4 100644 |
| 15 | --- a/bfd/elf64-microblaze.c | 18 | --- a/bfd/elf64-microblaze.c |
| 16 | +++ b/bfd/elf64-microblaze.c | 19 | +++ b/bfd/elf64-microblaze.c |
| 17 | @@ -1488,8 +1488,17 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 20 | @@ -1511,6 +1511,14 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 18 | relocation -= (input_section->output_section->vma | 21 | bfd_put_16 (input_bfd, relocation & 0xffff, |
| 19 | + input_section->output_offset | 22 | contents + offset + endian); |
| 20 | + offset + INST_WORD_SIZE); | 23 | |
| 21 | - bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 24 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); |
| 22 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | 25 | + if (insn == 0xb2000000 || insn == 0xb2ffffff) |
| 23 | + if (insn == 0xb2000000 || insn == 0xb2ffffff) | 26 | + { |
| 24 | + { | 27 | + insn &= ~0x00ffffff; |
| 25 | + insn &= ~0x00ffffff; | 28 | + insn |= (relocation >> 16) & 0xffffff; |
| 26 | + insn |= (relocation >> 16) & 0xffffff; | 29 | + bfd_put_32 (input_bfd, insn, |
| 27 | + bfd_put_32 (input_bfd, insn, | 30 | + contents + offset + endian); |
| 28 | contents + offset + endian); | 31 | + } |
| 29 | + } | 32 | else |
| 30 | + else | 33 | { |
| 31 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 34 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
| 32 | + contents + offset + endian); | 35 | @@ -1618,6 +1626,14 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 33 | bfd_put_16 (input_bfd, relocation & 0xffff, | 36 | bfd_put_16 (input_bfd, relocation & 0xffff, |
| 34 | contents + offset + endian + INST_WORD_SIZE); | 37 | contents + offset + endian); |
| 35 | } | 38 | } |
| 36 | @@ -1580,11 +1589,28 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 37 | else | ||
| 38 | { | ||
| 39 | if (r_type == R_MICROBLAZE_64_PCREL) | ||
| 40 | - relocation -= (input_section->output_section->vma | ||
| 41 | - + input_section->output_offset | ||
| 42 | - + offset + INST_WORD_SIZE); | ||
| 43 | - bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 44 | + { | ||
| 45 | + if (!input_section->output_section->vma && | ||
| 46 | + !input_section->output_offset && !offset) | ||
| 47 | + relocation -= (input_section->output_section->vma | ||
| 48 | + + input_section->output_offset | ||
| 49 | + + offset); | ||
| 50 | + else | ||
| 51 | + relocation -= (input_section->output_section->vma | ||
| 52 | + + input_section->output_offset | ||
| 53 | + + offset + INST_WORD_SIZE); | ||
| 54 | + } | ||
| 55 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | 39 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); |
| 56 | + if (insn == 0xb2000000 || insn == 0xb2ffffff) | 40 | + if (insn == 0xb2000000 || insn == 0xb2ffffff) |
| 57 | + { | 41 | + { |
| 58 | + insn &= ~0x00ffffff; | 42 | + insn &= ~0x00ffffff; |
| 59 | + insn |= (relocation >> 16) & 0xffffff; | 43 | + insn |= (relocation >> 16) & 0xffffff; |
| 60 | + bfd_put_32 (input_bfd, insn, | 44 | + bfd_put_32 (input_bfd, insn, |
| 61 | contents + offset + endian); | 45 | + contents + offset + endian); |
| 62 | + } | 46 | + } |
| 63 | + else | 47 | else |
| 64 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | 48 | { |
| 65 | + contents + offset + endian); | 49 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
| 66 | bfd_put_16 (input_bfd, relocation & 0xffff, | 50 | @@ -1727,9 +1743,19 @@ static void |
| 67 | contents + offset + endian + INST_WORD_SIZE); | ||
| 68 | } | ||
| 69 | @@ -1703,9 +1729,19 @@ static void | ||
| 70 | microblaze_bfd_write_imm_value_32 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) | 51 | microblaze_bfd_write_imm_value_32 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) |
| 71 | { | 52 | { |
| 72 | unsigned long instr = bfd_get_32 (abfd, bfd_addr); | 53 | unsigned long instr = bfd_get_32 (abfd, bfd_addr); |
| @@ -89,7 +70,7 @@ index 6b1f47d00d..6676d9f93d 100644 | |||
| 89 | } | 70 | } |
| 90 | 71 | ||
| 91 | /* Read-modify-write into the bfd, an immediate value into appropriate fields of | 72 | /* Read-modify-write into the bfd, an immediate value into appropriate fields of |
| 92 | @@ -1717,10 +1753,18 @@ microblaze_bfd_write_imm_value_64 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) | 73 | @@ -1741,10 +1767,18 @@ microblaze_bfd_write_imm_value_64 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) |
| 93 | unsigned long instr_lo; | 74 | unsigned long instr_lo; |
| 94 | 75 | ||
| 95 | instr_hi = bfd_get_32 (abfd, bfd_addr); | 76 | instr_hi = bfd_get_32 (abfd, bfd_addr); |
| @@ -113,7 +94,7 @@ index 6b1f47d00d..6676d9f93d 100644 | |||
| 113 | instr_lo &= ~0x0000ffff; | 94 | instr_lo &= ~0x0000ffff; |
| 114 | instr_lo |= (val & 0x0000ffff); | 95 | instr_lo |= (val & 0x0000ffff); |
| 115 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 96 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 116 | index 5e11a77e70..48f306ef41 100644 | 97 | index 685a6e93f2b..9b311ed1450 100644 |
| 117 | --- a/gas/config/tc-microblaze.c | 98 | --- a/gas/config/tc-microblaze.c |
| 118 | +++ b/gas/config/tc-microblaze.c | 99 | +++ b/gas/config/tc-microblaze.c |
| 119 | @@ -392,7 +392,7 @@ microblaze_s_weakext (int ignore ATTRIBUTE_UNUSED) | 100 | @@ -392,7 +392,7 @@ microblaze_s_weakext (int ignore ATTRIBUTE_UNUSED) |
| @@ -155,7 +136,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 155 | opc = str_microblaze_ro_anchor; | 136 | opc = str_microblaze_ro_anchor; |
| 156 | else if (reg2 == REG_RWSDP) | 137 | else if (reg2 == REG_RWSDP) |
| 157 | opc = str_microblaze_rw_anchor; | 138 | opc = str_microblaze_rw_anchor; |
| 158 | @@ -1182,31 +1183,55 @@ md_assemble (char * str) | 139 | @@ -1186,33 +1187,57 @@ md_assemble (char * str) |
| 159 | inst |= (immed << IMM_LOW) & IMM_MASK; | 140 | inst |= (immed << IMM_LOW) & IMM_MASK; |
| 160 | } | 141 | } |
| 161 | } | 142 | } |
| @@ -170,8 +151,10 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 170 | + if (temp != 0 && temp != 0xFFFFFF8000) | 151 | + if (temp != 0 && temp != 0xFFFFFF8000) |
| 171 | + { | 152 | + { |
| 172 | /* Needs an immediate inst. */ | 153 | /* Needs an immediate inst. */ |
| 173 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 154 | opcode1 |
| 174 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 155 | = (struct op_code_struct *) str_hash_find (opcode_hash_control, |
| 156 | - "imm"); | ||
| 157 | + "imml"); | ||
| 175 | if (opcode1 == NULL) | 158 | if (opcode1 == NULL) |
| 176 | { | 159 | { |
| 177 | - as_bad (_("unknown opcode \"%s\""), "imm"); | 160 | - as_bad (_("unknown opcode \"%s\""), "imm"); |
| @@ -203,7 +186,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 203 | + if ((temp != 0) && (temp != 0xFFFF8000)) | 186 | + if ((temp != 0) && (temp != 0xFFFF8000)) |
| 204 | + { | 187 | + { |
| 205 | + /* Needs an immediate inst. */ | 188 | + /* Needs an immediate inst. */ |
| 206 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 189 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); |
| 207 | + if (opcode1 == NULL) | 190 | + if (opcode1 == NULL) |
| 208 | + { | 191 | + { |
| 209 | + as_bad (_("unknown opcode \"%s\""), "imm"); | 192 | + as_bad (_("unknown opcode \"%s\""), "imm"); |
| @@ -225,7 +208,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 225 | break; | 208 | break; |
| 226 | 209 | ||
| 227 | case INST_TYPE_RD_R1_IMMS: | 210 | case INST_TYPE_RD_R1_IMMS: |
| 228 | @@ -1832,12 +1857,20 @@ md_assemble (char * str) | 211 | @@ -1842,12 +1867,20 @@ md_assemble (char * str) |
| 229 | case INST_TYPE_IMM: | 212 | case INST_TYPE_IMM: |
| 230 | if (streq (name, "imm")) | 213 | if (streq (name, "imm")) |
| 231 | as_fatal (_("An IMM instruction should not be present in the .s file")); | 214 | as_fatal (_("An IMM instruction should not be present in the .s file")); |
| @@ -249,10 +232,22 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 249 | relax_substateT subtype; | 232 | relax_substateT subtype; |
| 250 | 233 | ||
| 251 | if (exp.X_md != 0) | 234 | if (exp.X_md != 0) |
| 252 | @@ -1860,27 +1893,54 @@ md_assemble (char * str) | 235 | @@ -1870,29 +1903,53 @@ md_assemble (char * str) |
| 253 | immed = exp.X_add_number; | 236 | immed = exp.X_add_number; |
| 254 | } | 237 | } |
| 255 | 238 | ||
| 239 | - | ||
| 240 | - temp = immed & 0xFFFF8000; | ||
| 241 | - if ((temp != 0) && (temp != 0xFFFF8000)) | ||
| 242 | - { | ||
| 243 | - /* Needs an immediate inst. */ | ||
| 244 | - opcode1 | ||
| 245 | - = (struct op_code_struct *) str_hash_find (opcode_hash_control, | ||
| 246 | - "imm"); | ||
| 247 | - if (opcode1 == NULL) | ||
| 248 | - { | ||
| 249 | - as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 250 | - return; | ||
| 256 | + if (microblaze_arch_size == 64 && (streq (name, "breai") || | 251 | + if (microblaze_arch_size == 64 && (streq (name, "breai") || |
| 257 | + streq (name, "breaid") || | 252 | + streq (name, "breaid") || |
| 258 | + streq (name, "brai") || streq (name, "braid"))) | 253 | + streq (name, "brai") || streq (name, "braid"))) |
| @@ -261,22 +256,12 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 261 | + if (temp != 0) | 256 | + if (temp != 0) |
| 262 | + { | 257 | + { |
| 263 | + /* Needs an immediate inst. */ | 258 | + /* Needs an immediate inst. */ |
| 264 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 259 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 265 | + if (opcode1 == NULL) | 260 | + if (opcode1 == NULL) |
| 266 | + { | 261 | + { |
| 267 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 262 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| 268 | + return; | 263 | + return; |
| 269 | + } | 264 | + } |
| 270 | |||
| 271 | - temp = immed & 0xFFFF8000; | ||
| 272 | - if ((temp != 0) && (temp != 0xFFFF8000)) | ||
| 273 | - { | ||
| 274 | - /* Needs an immediate inst. */ | ||
| 275 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 276 | - if (opcode1 == NULL) | ||
| 277 | - { | ||
| 278 | - as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 279 | - return; | ||
| 280 | + inst1 = opcode1->bit_sequence; | 265 | + inst1 = opcode1->bit_sequence; |
| 281 | + inst1 |= ((immed & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | 266 | + inst1 |= ((immed & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; |
| 282 | + output[0] = INST_BYTE0 (inst1); | 267 | + output[0] = INST_BYTE0 (inst1); |
| @@ -293,7 +278,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 293 | + if ((temp != 0) && (temp != 0xFFFF8000)) | 278 | + if ((temp != 0) && (temp != 0xFFFF8000)) |
| 294 | + { | 279 | + { |
| 295 | + /* Needs an immediate inst. */ | 280 | + /* Needs an immediate inst. */ |
| 296 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 281 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); |
| 297 | + if (opcode1 == NULL) | 282 | + if (opcode1 == NULL) |
| 298 | + { | 283 | + { |
| 299 | + as_bad (_("unknown opcode \"%s\""), "imm"); | 284 | + as_bad (_("unknown opcode \"%s\""), "imm"); |
| @@ -322,7 +307,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 322 | break; | 307 | break; |
| 323 | 308 | ||
| 324 | case INST_TYPE_NONE: | 309 | case INST_TYPE_NONE: |
| 325 | @@ -2456,7 +2516,7 @@ md_apply_fix (fixS * fixP, | 310 | @@ -2467,7 +2524,7 @@ md_apply_fix (fixS * fixP, |
| 326 | 311 | ||
| 327 | inst1 = opcode1->bit_sequence; | 312 | inst1 = opcode1->bit_sequence; |
| 328 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 313 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| @@ -331,7 +316,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 331 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | 316 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) |
| 332 | fixP->fx_r_type = BFD_RELOC_64; | 317 | fixP->fx_r_type = BFD_RELOC_64; |
| 333 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) | 318 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) |
| 334 | @@ -2624,7 +2684,14 @@ md_estimate_size_before_relax (fragS * fragP, | 319 | @@ -2636,7 +2693,14 @@ md_estimate_size_before_relax (fragS * fragP, |
| 335 | } | 320 | } |
| 336 | else | 321 | else |
| 337 | { | 322 | { |
| @@ -347,7 +332,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 347 | fragP->fr_var = INST_WORD_SIZE*2; | 332 | fragP->fr_var = INST_WORD_SIZE*2; |
| 348 | } | 333 | } |
| 349 | break; | 334 | break; |
| 350 | @@ -2901,6 +2968,7 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) | 335 | @@ -2913,6 +2977,7 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) |
| 351 | case OPTION_M64: | 336 | case OPTION_M64: |
| 352 | //if (arg != NULL && strcmp (arg, "64") == 0) | 337 | //if (arg != NULL && strcmp (arg, "64") == 0) |
| 353 | microblaze_arch_size = 64; | 338 | microblaze_arch_size = 64; |
| @@ -356,7 +341,7 @@ index 5e11a77e70..48f306ef41 100644 | |||
| 356 | default: | 341 | default: |
| 357 | return 0; | 342 | return 0; |
| 358 | diff --git a/gas/tc.h b/gas/tc.h | 343 | diff --git a/gas/tc.h b/gas/tc.h |
| 359 | index da1738d67a..5bdfe5c347 100644 | 344 | index c9722307dea..f1fa7495e29 100644 |
| 360 | --- a/gas/tc.h | 345 | --- a/gas/tc.h |
| 361 | +++ b/gas/tc.h | 346 | +++ b/gas/tc.h |
| 362 | @@ -22,7 +22,7 @@ | 347 | @@ -22,7 +22,7 @@ |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0019-Fixing-the-branch-related-issues.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0018-Fixing-the-branch-related-issues.patch index 027b8e83..5b76c492 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0019-Fixing-the-branch-related-issues.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0018-Fixing-the-branch-related-issues.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 33081da0bb8820f3c695d8f865582436b16002bf Mon Sep 17 00:00:00 2001 | 1 | From 2ebffe31b57e7fe73ea8dbd60f3330da1f780243 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Sun, 30 Sep 2018 17:06:58 +0530 | 3 | Date: Sun, 30 Sep 2018 17:06:58 +0530 |
| 4 | Subject: [PATCH 19/52] Fixing the branch related issues | 4 | Subject: [PATCH 18/38] Fixing the branch related issues |
| 5 | 5 | ||
| 6 | Conflicts: | 6 | Conflicts: |
| 7 | bfd/elf64-microblaze.c | 7 | bfd/elf64-microblaze.c |
| @@ -10,10 +10,10 @@ Conflicts: | |||
| 10 | 1 file changed, 3 insertions(+) | 10 | 1 file changed, 3 insertions(+) |
| 11 | 11 | ||
| 12 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 12 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 13 | index 6676d9f93d..d7b7d9f5e7 100644 | 13 | index 010ee1d15b4..f68fc344c1a 100644 |
| 14 | --- a/bfd/elf64-microblaze.c | 14 | --- a/bfd/elf64-microblaze.c |
| 15 | +++ b/bfd/elf64-microblaze.c | 15 | +++ b/bfd/elf64-microblaze.c |
| 16 | @@ -2545,6 +2545,9 @@ microblaze_elf_check_relocs (bfd * abfd, | 16 | @@ -2521,6 +2521,9 @@ microblaze_elf_check_relocs (bfd * abfd, |
| 17 | while (h->root.type == bfd_link_hash_indirect | 17 | while (h->root.type == bfd_link_hash_indirect |
| 18 | || h->root.type == bfd_link_hash_warning) | 18 | || h->root.type == bfd_link_hash_warning) |
| 19 | h = (struct elf_link_hash_entry *) h->root.u.i.link; | 19 | h = (struct elf_link_hash_entry *) h->root.u.i.link; |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0020-Fixed-address-computation-issues-with-64bit-address.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0019-Fixed-address-computation-issues-with-64bit-address.patch index d9de811d..0a5ff410 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0020-Fixed-address-computation-issues-with-64bit-address.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0019-Fixed-address-computation-issues-with-64bit-address.patch | |||
| @@ -1,12 +1,15 @@ | |||
| 1 | From 22b1b41a7873fa117642cad6b150f465eb9b60cb Mon Sep 17 00:00:00 2001 | 1 | From 46c4a8876203a8799dd4c7fb8b8ae1501e17b672 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Tue, 9 Oct 2018 10:14:22 +0530 | 3 | Date: Tue, 9 Oct 2018 10:14:22 +0530 |
| 4 | Subject: [PATCH 20/52] - Fixed address computation issues with 64bit address - | 4 | Subject: [PATCH 19/38] - Fixed address computation issues with 64bit address - |
| 5 | Fixed imml dissassamble issue | 5 | Fixed imml dissassamble issue |
| 6 | 6 | ||
| 7 | Conflicts: | 7 | Conflicts: |
| 8 | gas/config/tc-microblaze.c | 8 | gas/config/tc-microblaze.c |
| 9 | opcodes/microblaze-dis.c | 9 | opcodes/microblaze-dis.c |
| 10 | |||
| 11 | Conflicts: | ||
| 12 | bfd/elf64-microblaze.c | ||
| 10 | --- | 13 | --- |
| 11 | bfd/bfd-in2.h | 5 +++ | 14 | bfd/bfd-in2.h | 5 +++ |
| 12 | bfd/elf64-microblaze.c | 14 ++++---- | 15 | bfd/elf64-microblaze.c | 14 ++++---- |
| @@ -15,10 +18,10 @@ Conflicts: | |||
| 15 | 4 files changed, 79 insertions(+), 16 deletions(-) | 18 | 4 files changed, 79 insertions(+), 16 deletions(-) |
| 16 | 19 | ||
| 17 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | 20 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h |
| 18 | index 57ea4f6132..05fbeb9b3a 100644 | 21 | index 568bfafee7c..03794ea1ecf 100644 |
| 19 | --- a/bfd/bfd-in2.h | 22 | --- a/bfd/bfd-in2.h |
| 20 | +++ b/bfd/bfd-in2.h | 23 | +++ b/bfd/bfd-in2.h |
| 21 | @@ -5443,6 +5443,11 @@ done here - only used for relaxing */ | 24 | @@ -5438,6 +5438,11 @@ done here - only used for relaxing */ |
| 22 | * +done here - only used for relaxing */ | 25 | * +done here - only used for relaxing */ |
| 23 | BFD_RELOC_MICROBLAZE_64, | 26 | BFD_RELOC_MICROBLAZE_64, |
| 24 | 27 | ||
| @@ -31,29 +34,29 @@ index 57ea4f6132..05fbeb9b3a 100644 | |||
| 31 | * +value in two words (with an imm instruction). No relocation is | 34 | * +value in two words (with an imm instruction). No relocation is |
| 32 | * +done here - only used for relaxing */ | 35 | * +done here - only used for relaxing */ |
| 33 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 36 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 34 | index d7b7d9f5e7..f42d7f429b 100644 | 37 | index f68fc344c1a..2ae1f2b118a 100644 |
| 35 | --- a/bfd/elf64-microblaze.c | 38 | --- a/bfd/elf64-microblaze.c |
| 36 | +++ b/bfd/elf64-microblaze.c | 39 | +++ b/bfd/elf64-microblaze.c |
| 37 | @@ -121,15 +121,15 @@ static reloc_howto_type microblaze_elf_howto_raw[] = | 40 | @@ -119,15 +119,15 @@ static reloc_howto_type microblaze_elf_howto_raw[] = |
| 38 | 0, /* Rightshift. */ | 41 | 0, /* Rightshift. */ |
| 39 | 4, /* Size (0 = byte, 1 = short, 2 = long). */ | 42 | 4, /* Size (0 = byte, 1 = short, 2 = long). */ |
| 40 | 64, /* Bitsize. */ | 43 | 64, /* Bitsize. */ |
| 41 | - TRUE, /* PC_relative. */ | 44 | - true, /* PC_relative. */ |
| 42 | + FALSE, /* PC_relative. */ | 45 | + false, /* PC_relative. */ |
| 43 | 0, /* Bitpos. */ | 46 | 0, /* Bitpos. */ |
| 44 | complain_overflow_dont, /* Complain on overflow. */ | 47 | complain_overflow_dont, /* Complain on overflow. */ |
| 45 | bfd_elf_generic_reloc,/* Special Function. */ | 48 | bfd_elf_generic_reloc,/* Special Function. */ |
| 46 | "R_MICROBLAZE_IMML_64", /* Name. */ | 49 | "R_MICROBLAZE_IMML_64", /* Name. */ |
| 47 | FALSE, /* Partial Inplace. */ | 50 | false, /* Partial Inplace. */ |
| 48 | 0, /* Source Mask. */ | 51 | 0, /* Source Mask. */ |
| 49 | - 0x0000ffff, /* Dest Mask. */ | 52 | - 0x0000ffff, /* Dest Mask. */ |
| 50 | - TRUE), /* PC relative offset? */ | 53 | - true), /* PC relative offset? */ |
| 51 | + 0xffffffffffffff, /* Dest Mask. */ | 54 | + 0xffffffffffffff, /* Dest Mask. */ |
| 52 | + FALSE), /* PC relative offset? */ | 55 | + false), /* PC relative offset? */ |
| 53 | 56 | ||
| 54 | /* A 64 bit relocation. Table entry not really used. */ | 57 | /* A 64 bit relocation. Table entry not really used. */ |
| 55 | HOWTO (R_MICROBLAZE_64, /* Type. */ | 58 | HOWTO (R_MICROBLAZE_64, /* Type. */ |
| 56 | @@ -585,9 +585,9 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | 59 | @@ -614,9 +614,9 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, |
| 57 | case BFD_RELOC_32: | 60 | case BFD_RELOC_32: |
| 58 | microblaze_reloc = R_MICROBLAZE_32; | 61 | microblaze_reloc = R_MICROBLAZE_32; |
| 59 | break; | 62 | break; |
| @@ -65,7 +68,7 @@ index d7b7d9f5e7..f42d7f429b 100644 | |||
| 65 | break; | 68 | break; |
| 66 | case BFD_RELOC_32_PCREL: | 69 | case BFD_RELOC_32_PCREL: |
| 67 | microblaze_reloc = R_MICROBLAZE_32_PCREL; | 70 | microblaze_reloc = R_MICROBLAZE_32_PCREL; |
| 68 | @@ -619,7 +619,7 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, | 71 | @@ -648,7 +648,7 @@ microblaze_elf_reloc_type_lookup (bfd * abfd ATTRIBUTE_UNUSED, |
| 69 | case BFD_RELOC_VTABLE_ENTRY: | 72 | case BFD_RELOC_VTABLE_ENTRY: |
| 70 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; | 73 | microblaze_reloc = R_MICROBLAZE_GNU_VTENTRY; |
| 71 | break; | 74 | break; |
| @@ -74,7 +77,7 @@ index d7b7d9f5e7..f42d7f429b 100644 | |||
| 74 | microblaze_reloc = R_MICROBLAZE_IMML_64; | 77 | microblaze_reloc = R_MICROBLAZE_IMML_64; |
| 75 | break; | 78 | break; |
| 76 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | 79 | case BFD_RELOC_MICROBLAZE_64_GOTPC: |
| 77 | @@ -1982,7 +1982,7 @@ microblaze_elf_relax_section (bfd *abfd, | 80 | @@ -2005,7 +2005,7 @@ microblaze_elf_relax_section (bfd *abfd, |
| 78 | efix = calc_fixup (target_address, 0, sec); | 81 | efix = calc_fixup (target_address, 0, sec); |
| 79 | 82 | ||
| 80 | /* Validate the in-band val. */ | 83 | /* Validate the in-band val. */ |
| @@ -84,7 +87,7 @@ index d7b7d9f5e7..f42d7f429b 100644 | |||
| 84 | fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); | 87 | fprintf(stderr, "%d: CORRUPT relax reloc %x %lx\n", __LINE__, val, irel->r_addend); |
| 85 | } | 88 | } |
| 86 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 89 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 87 | index 48f306ef41..bfb3104720 100644 | 90 | index 9b311ed1450..542c68a0857 100644 |
| 88 | --- a/gas/config/tc-microblaze.c | 91 | --- a/gas/config/tc-microblaze.c |
| 89 | +++ b/gas/config/tc-microblaze.c | 92 | +++ b/gas/config/tc-microblaze.c |
| 90 | @@ -402,7 +402,6 @@ pseudo_typeS md_pseudo_table[] = | 93 | @@ -402,7 +402,6 @@ pseudo_typeS md_pseudo_table[] = |
| @@ -95,7 +98,7 @@ index 48f306ef41..bfb3104720 100644 | |||
| 95 | {"weakext", microblaze_s_weakext, 0}, | 98 | {"weakext", microblaze_s_weakext, 0}, |
| 96 | {"rodata", microblaze_s_rdata, 0}, | 99 | {"rodata", microblaze_s_rdata, 0}, |
| 97 | {"sdata2", microblaze_s_rdata, 1}, | 100 | {"sdata2", microblaze_s_rdata, 1}, |
| 98 | @@ -2475,18 +2474,74 @@ md_apply_fix (fixS * fixP, | 101 | @@ -2483,18 +2482,74 @@ md_apply_fix (fixS * fixP, |
| 99 | case BFD_RELOC_RVA: | 102 | case BFD_RELOC_RVA: |
| 100 | case BFD_RELOC_32_PCREL: | 103 | case BFD_RELOC_32_PCREL: |
| 101 | case BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: | 104 | case BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: |
| @@ -174,7 +177,7 @@ index 48f306ef41..bfb3104720 100644 | |||
| 174 | buf[3] |= ((val >> 24) & 0xff); | 177 | buf[3] |= ((val >> 24) & 0xff); |
| 175 | buf[2] |= ((val >> 16) & 0xff); | 178 | buf[2] |= ((val >> 16) & 0xff); |
| 176 | buf[1] |= ((val >> 8) & 0xff); | 179 | buf[1] |= ((val >> 8) & 0xff); |
| 177 | @@ -2607,6 +2662,8 @@ md_apply_fix (fixS * fixP, | 180 | @@ -2616,6 +2671,8 @@ md_apply_fix (fixS * fixP, |
| 178 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; | 181 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_64_NONE; |
| 179 | else if (fixP->fx_r_type == BFD_RELOC_32) | 182 | else if (fixP->fx_r_type == BFD_RELOC_32) |
| 180 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; | 183 | fixP->fx_r_type = BFD_RELOC_MICROBLAZE_32_NONE; |
| @@ -183,7 +186,7 @@ index 48f306ef41..bfb3104720 100644 | |||
| 183 | else | 186 | else |
| 184 | fixP->fx_r_type = BFD_RELOC_NONE; | 187 | fixP->fx_r_type = BFD_RELOC_NONE; |
| 185 | fixP->fx_addsy = section_symbol (absolute_section); | 188 | fixP->fx_addsy = section_symbol (absolute_section); |
| 186 | @@ -2878,6 +2935,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) | 189 | @@ -2887,6 +2944,7 @@ tc_gen_reloc (asection * section ATTRIBUTE_UNUSED, fixS * fixp) |
| 187 | case BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: | 190 | case BFD_RELOC_MICROBLAZE_32_SYM_OP_SYM: |
| 188 | case BFD_RELOC_MICROBLAZE_64_GOTPC: | 191 | case BFD_RELOC_MICROBLAZE_64_GOTPC: |
| 189 | case BFD_RELOC_MICROBLAZE_64_GPC: | 192 | case BFD_RELOC_MICROBLAZE_64_GPC: |
| @@ -191,7 +194,7 @@ index 48f306ef41..bfb3104720 100644 | |||
| 191 | case BFD_RELOC_MICROBLAZE_64: | 194 | case BFD_RELOC_MICROBLAZE_64: |
| 192 | case BFD_RELOC_MICROBLAZE_64_PCREL: | 195 | case BFD_RELOC_MICROBLAZE_64_PCREL: |
| 193 | case BFD_RELOC_MICROBLAZE_64_GOT: | 196 | case BFD_RELOC_MICROBLAZE_64_GOT: |
| 194 | @@ -3023,10 +3081,10 @@ cons_fix_new_microblaze (fragS * frag, | 197 | @@ -3032,10 +3090,10 @@ cons_fix_new_microblaze (fragS * frag, |
| 195 | r = BFD_RELOC_32; | 198 | r = BFD_RELOC_32; |
| 196 | break; | 199 | break; |
| 197 | case 8: | 200 | case 8: |
| @@ -206,7 +209,7 @@ index 48f306ef41..bfb3104720 100644 | |||
| 206 | default: | 209 | default: |
| 207 | as_bad (_("unsupported BFD relocation size %u"), size); | 210 | as_bad (_("unsupported BFD relocation size %u"), size); |
| 208 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | 211 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c |
| 209 | index f643f2600d..1dc11a2653 100644 | 212 | index fc15d210fe0..143a0a9d59e 100644 |
| 210 | --- a/opcodes/microblaze-dis.c | 213 | --- a/opcodes/microblaze-dis.c |
| 211 | +++ b/opcodes/microblaze-dis.c | 214 | +++ b/opcodes/microblaze-dis.c |
| 212 | @@ -77,7 +77,7 @@ static char * | 215 | @@ -77,7 +77,7 @@ static char * |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0021-Adding-new-relocation-to-support-64bit-rodata.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0020-Patch-MicroBlaze-Adding-new-relocation-to-support-64.patch index 908f7572..43627c29 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0021-Adding-new-relocation-to-support-64bit-rodata.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0020-Patch-MicroBlaze-Adding-new-relocation-to-support-64.patch | |||
| @@ -1,7 +1,8 @@ | |||
| 1 | From 9880b06269a176c0b5c4f0ecb9e3784f630a76be Mon Sep 17 00:00:00 2001 | 1 | From e49fe1aee519af464c873425212914c56fa683bc Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Sat, 13 Oct 2018 21:17:01 +0530 | 3 | Date: Tue, 2 Nov 2021 17:28:24 +0530 |
| 4 | Subject: [PATCH 21/52] Adding new relocation to support 64bit rodata | 4 | Subject: [PATCH 20/38] [Patch,MicroBlaze : Adding new relocation to support |
| 5 | 64bit rodata. | ||
| 5 | 6 | ||
| 6 | --- | 7 | --- |
| 7 | bfd/elf64-microblaze.c | 11 +++++++-- | 8 | bfd/elf64-microblaze.c | 11 +++++++-- |
| @@ -9,10 +10,10 @@ Subject: [PATCH 21/52] Adding new relocation to support 64bit rodata | |||
| 9 | 2 files changed, 54 insertions(+), 6 deletions(-) | 10 | 2 files changed, 54 insertions(+), 6 deletions(-) |
| 10 | 11 | ||
| 11 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 12 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 12 | index f42d7f429b..ddcb5baf74 100644 | 13 | index 2ae1f2b118a..55c01b44d29 100644 |
| 13 | --- a/bfd/elf64-microblaze.c | 14 | --- a/bfd/elf64-microblaze.c |
| 14 | +++ b/bfd/elf64-microblaze.c | 15 | +++ b/bfd/elf64-microblaze.c |
| 15 | @@ -1473,6 +1473,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 16 | @@ -1488,6 +1488,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 16 | case (int) R_MICROBLAZE_64_PCREL : | 17 | case (int) R_MICROBLAZE_64_PCREL : |
| 17 | case (int) R_MICROBLAZE_64: | 18 | case (int) R_MICROBLAZE_64: |
| 18 | case (int) R_MICROBLAZE_32: | 19 | case (int) R_MICROBLAZE_32: |
| @@ -20,7 +21,7 @@ index f42d7f429b..ddcb5baf74 100644 | |||
| 20 | { | 21 | { |
| 21 | /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols | 22 | /* r_symndx will be STN_UNDEF (zero) only for relocs against symbols |
| 22 | from removed linkonce sections, or sections discarded by | 23 | from removed linkonce sections, or sections discarded by |
| 23 | @@ -1482,6 +1483,8 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 24 | @@ -1497,6 +1498,8 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 24 | relocation += addend; | 25 | relocation += addend; |
| 25 | if (r_type == R_MICROBLAZE_32)// || r_type == R_MICROBLAZE_IMML_64) | 26 | if (r_type == R_MICROBLAZE_32)// || r_type == R_MICROBLAZE_IMML_64) |
| 26 | bfd_put_32 (input_bfd, relocation, contents + offset); | 27 | bfd_put_32 (input_bfd, relocation, contents + offset); |
| @@ -29,7 +30,7 @@ index f42d7f429b..ddcb5baf74 100644 | |||
| 29 | else | 30 | else |
| 30 | { | 31 | { |
| 31 | if (r_type == R_MICROBLAZE_64_PCREL) | 32 | if (r_type == R_MICROBLAZE_64_PCREL) |
| 32 | @@ -1560,7 +1563,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 33 | @@ -1585,7 +1588,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 33 | } | 34 | } |
| 34 | else | 35 | else |
| 35 | { | 36 | { |
| @@ -38,7 +39,7 @@ index f42d7f429b..ddcb5baf74 100644 | |||
| 38 | { | 39 | { |
| 39 | outrel.r_info = ELF64_R_INFO (0, R_MICROBLAZE_REL); | 40 | outrel.r_info = ELF64_R_INFO (0, R_MICROBLAZE_REL); |
| 40 | outrel.r_addend = relocation + addend; | 41 | outrel.r_addend = relocation + addend; |
| 41 | @@ -1586,6 +1589,8 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 42 | @@ -1611,6 +1614,8 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 42 | relocation += addend; | 43 | relocation += addend; |
| 43 | if (r_type == R_MICROBLAZE_32) | 44 | if (r_type == R_MICROBLAZE_32) |
| 44 | bfd_put_32 (input_bfd, relocation, contents + offset); | 45 | bfd_put_32 (input_bfd, relocation, contents + offset); |
| @@ -47,7 +48,7 @@ index f42d7f429b..ddcb5baf74 100644 | |||
| 47 | else | 48 | else |
| 48 | { | 49 | { |
| 49 | if (r_type == R_MICROBLAZE_64_PCREL) | 50 | if (r_type == R_MICROBLAZE_64_PCREL) |
| 50 | @@ -2098,7 +2103,8 @@ microblaze_elf_relax_section (bfd *abfd, | 51 | @@ -2121,7 +2126,8 @@ microblaze_elf_relax_section (bfd *abfd, |
| 51 | microblaze_bfd_write_imm_value_32 (abfd, ocontents + irelscan->r_offset, | 52 | microblaze_bfd_write_imm_value_32 (abfd, ocontents + irelscan->r_offset, |
| 52 | irelscan->r_addend); | 53 | irelscan->r_addend); |
| 53 | } | 54 | } |
| @@ -57,7 +58,7 @@ index f42d7f429b..ddcb5baf74 100644 | |||
| 57 | { | 58 | { |
| 58 | isym = isymbuf + ELF64_R_SYM (irelscan->r_info); | 59 | isym = isymbuf + ELF64_R_SYM (irelscan->r_info); |
| 59 | 60 | ||
| 60 | @@ -2606,6 +2612,7 @@ microblaze_elf_check_relocs (bfd * abfd, | 61 | @@ -2595,6 +2601,7 @@ microblaze_elf_check_relocs (bfd * abfd, |
| 61 | case R_MICROBLAZE_64: | 62 | case R_MICROBLAZE_64: |
| 62 | case R_MICROBLAZE_64_PCREL: | 63 | case R_MICROBLAZE_64_PCREL: |
| 63 | case R_MICROBLAZE_32: | 64 | case R_MICROBLAZE_32: |
| @@ -66,7 +67,7 @@ index f42d7f429b..ddcb5baf74 100644 | |||
| 66 | if (h != NULL && !bfd_link_pic (info)) | 67 | if (h != NULL && !bfd_link_pic (info)) |
| 67 | { | 68 | { |
| 68 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 69 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 69 | index bfb3104720..532a26eaa5 100644 | 70 | index 542c68a0857..6902a1518a6 100644 |
| 70 | --- a/gas/config/tc-microblaze.c | 71 | --- a/gas/config/tc-microblaze.c |
| 71 | +++ b/gas/config/tc-microblaze.c | 72 | +++ b/gas/config/tc-microblaze.c |
| 72 | @@ -1119,6 +1119,13 @@ md_assemble (char * str) | 73 | @@ -1119,6 +1119,13 @@ md_assemble (char * str) |
| @@ -83,7 +84,7 @@ index bfb3104720..532a26eaa5 100644 | |||
| 83 | else if (reg2 == REG_ROSDP) | 84 | else if (reg2 == REG_ROSDP) |
| 84 | opc = str_microblaze_ro_anchor; | 85 | opc = str_microblaze_ro_anchor; |
| 85 | else if (reg2 == REG_RWSDP) | 86 | else if (reg2 == REG_RWSDP) |
| 86 | @@ -1182,7 +1189,10 @@ md_assemble (char * str) | 87 | @@ -1186,7 +1193,10 @@ md_assemble (char * str) |
| 87 | inst |= (immed << IMM_LOW) & IMM_MASK; | 88 | inst |= (immed << IMM_LOW) & IMM_MASK; |
| 88 | } | 89 | } |
| 89 | } | 90 | } |
| @@ -95,7 +96,7 @@ index bfb3104720..532a26eaa5 100644 | |||
| 95 | { | 96 | { |
| 96 | temp = immed & 0xFFFFFF8000; | 97 | temp = immed & 0xFFFFFF8000; |
| 97 | if (temp != 0 && temp != 0xFFFFFF8000) | 98 | if (temp != 0 && temp != 0xFFFFFF8000) |
| 98 | @@ -1794,6 +1804,11 @@ md_assemble (char * str) | 99 | @@ -1802,6 +1812,11 @@ md_assemble (char * str) |
| 99 | 100 | ||
| 100 | if (exp.X_md != 0) | 101 | if (exp.X_md != 0) |
| 101 | subtype = get_imm_otype(exp.X_md); | 102 | subtype = get_imm_otype(exp.X_md); |
| @@ -107,7 +108,7 @@ index bfb3104720..532a26eaa5 100644 | |||
| 107 | else | 108 | else |
| 108 | subtype = opcode->inst_offset_type; | 109 | subtype = opcode->inst_offset_type; |
| 109 | 110 | ||
| 110 | @@ -1811,6 +1826,31 @@ md_assemble (char * str) | 111 | @@ -1819,6 +1834,31 @@ md_assemble (char * str) |
| 111 | output = frag_more (isize); | 112 | output = frag_more (isize); |
| 112 | immed = exp.X_add_number; | 113 | immed = exp.X_add_number; |
| 113 | } | 114 | } |
| @@ -117,7 +118,7 @@ index bfb3104720..532a26eaa5 100644 | |||
| 117 | + if (temp != 0 && temp != 0xFFFFFF8000) | 118 | + if (temp != 0 && temp != 0xFFFFFF8000) |
| 118 | + { | 119 | + { |
| 119 | + /* Needs an immediate inst. */ | 120 | + /* Needs an immediate inst. */ |
| 120 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 121 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 121 | + if (opcode1 == NULL) | 122 | + if (opcode1 == NULL) |
| 122 | + { | 123 | + { |
| 123 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 124 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -139,7 +140,7 @@ index bfb3104720..532a26eaa5 100644 | |||
| 139 | 140 | ||
| 140 | temp = immed & 0xFFFF8000; | 141 | temp = immed & 0xFFFF8000; |
| 141 | if ((temp != 0) && (temp != 0xFFFF8000)) | 142 | if ((temp != 0) && (temp != 0xFFFF8000)) |
| 142 | @@ -1834,6 +1874,7 @@ md_assemble (char * str) | 143 | @@ -1844,6 +1884,7 @@ md_assemble (char * str) |
| 143 | 144 | ||
| 144 | inst |= (reg1 << RD_LOW) & RD_MASK; | 145 | inst |= (reg1 << RD_LOW) & RD_MASK; |
| 145 | inst |= (immed << IMM_LOW) & IMM_MASK; | 146 | inst |= (immed << IMM_LOW) & IMM_MASK; |
| @@ -147,7 +148,7 @@ index bfb3104720..532a26eaa5 100644 | |||
| 147 | break; | 148 | break; |
| 148 | 149 | ||
| 149 | case INST_TYPE_R2: | 150 | case INST_TYPE_R2: |
| 150 | @@ -3081,10 +3122,10 @@ cons_fix_new_microblaze (fragS * frag, | 151 | @@ -3090,10 +3131,10 @@ cons_fix_new_microblaze (fragS * frag, |
| 151 | r = BFD_RELOC_32; | 152 | r = BFD_RELOC_32; |
| 152 | break; | 153 | break; |
| 153 | case 8: | 154 | case 8: |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0022-fixing-the-.bss-relocation-issue.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0021-fixing-the-.bss-relocation-issue.patch index 6c144b8a..bf238389 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0022-fixing-the-.bss-relocation-issue.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0021-fixing-the-.bss-relocation-issue.patch | |||
| @@ -1,35 +1,51 @@ | |||
| 1 | From e7b6ab1b28fc3ca13ed25687d5e851795ed6e1a3 Mon Sep 17 00:00:00 2001 | 1 | From 1131a31133a45553259b3fdb930daae468709bda Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Wed, 24 Oct 2018 12:34:37 +0530 | 3 | Date: Wed, 24 Oct 2018 12:34:37 +0530 |
| 4 | Subject: [PATCH 22/52] fixing the .bss relocation issue | 4 | Subject: [PATCH 21/38] fixing the .bss relocation issue |
| 5 | 5 | ||
| 6 | Conflicts: | ||
| 7 | bfd/elf64-microblaze.c | ||
| 6 | --- | 8 | --- |
| 7 | bfd/elf64-microblaze.c | 18 ++++++++++++------ | 9 | bfd/elf64-microblaze.c | 32 +++++++++++++++++++------------- |
| 8 | 1 file changed, 12 insertions(+), 6 deletions(-) | 10 | 1 file changed, 19 insertions(+), 13 deletions(-) |
| 9 | 11 | ||
| 10 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 12 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 11 | index ddcb5baf74..861420789b 100644 | 13 | index 55c01b44d29..6fb88959357 100644 |
| 12 | --- a/bfd/elf64-microblaze.c | 14 | --- a/bfd/elf64-microblaze.c |
| 13 | +++ b/bfd/elf64-microblaze.c | 15 | +++ b/bfd/elf64-microblaze.c |
| 14 | @@ -1492,7 +1492,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 16 | @@ -1514,14 +1514,14 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 15 | + input_section->output_offset | 17 | bfd_put_16 (input_bfd, relocation & 0xffff, |
| 16 | + offset + INST_WORD_SIZE); | 18 | contents + offset + endian); |
| 17 | unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | 19 | |
| 18 | - if (insn == 0xb2000000 || insn == 0xb2ffffff) | 20 | - unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); |
| 21 | - if (insn == 0xb2000000 || insn == 0xb2ffffff) | ||
| 22 | - { | ||
| 23 | - insn &= ~0x00ffffff; | ||
| 24 | - insn |= (relocation >> 16) & 0xffffff; | ||
| 25 | - bfd_put_32 (input_bfd, insn, | ||
| 26 | - contents + offset + endian); | ||
| 27 | - } | ||
| 28 | + unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | ||
| 19 | + if ((insn & 0xff000000) == 0xb2000000) | 29 | + if ((insn & 0xff000000) == 0xb2000000) |
| 30 | + { | ||
| 31 | + insn &= ~0x00ffffff; | ||
| 32 | + insn |= (relocation >> 16) & 0xffffff; | ||
| 33 | + bfd_put_32 (input_bfd, insn, | ||
| 34 | + contents + offset + endian); | ||
| 35 | + } | ||
| 36 | else | ||
| 20 | { | 37 | { |
| 21 | insn &= ~0x00ffffff; | 38 | bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, |
| 22 | insn |= (relocation >> 16) & 0xffffff; | 39 | @@ -1632,7 +1632,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, |
| 23 | @@ -1606,7 +1606,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | 40 | contents + offset + endian); |
| 24 | + offset + INST_WORD_SIZE); | ||
| 25 | } | 41 | } |
| 26 | unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); | 42 | unsigned long insn = bfd_get_32 (input_bfd, contents + offset +endian); |
| 27 | - if (insn == 0xb2000000 || insn == 0xb2ffffff) | 43 | - if (insn == 0xb2000000 || insn == 0xb2ffffff) |
| 28 | + if ((insn & 0xff000000) == 0xb2000000) | 44 | + if ((insn & 0xff000000) == 0xb2000000) |
| 29 | { | 45 | { |
| 30 | insn &= ~0x00ffffff; | 46 | insn &= ~0x00ffffff; |
| 31 | insn |= (relocation >> 16) & 0xffffff; | 47 | insn |= (relocation >> 16) & 0xffffff; |
| 32 | @@ -1735,7 +1735,7 @@ microblaze_bfd_write_imm_value_32 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) | 48 | @@ -1749,7 +1749,7 @@ microblaze_bfd_write_imm_value_32 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) |
| 33 | { | 49 | { |
| 34 | unsigned long instr = bfd_get_32 (abfd, bfd_addr); | 50 | unsigned long instr = bfd_get_32 (abfd, bfd_addr); |
| 35 | 51 | ||
| @@ -38,7 +54,7 @@ index ddcb5baf74..861420789b 100644 | |||
| 38 | { | 54 | { |
| 39 | instr &= ~0x00ffffff; | 55 | instr &= ~0x00ffffff; |
| 40 | instr |= (val & 0xffffff); | 56 | instr |= (val & 0xffffff); |
| 41 | @@ -1758,7 +1758,7 @@ microblaze_bfd_write_imm_value_64 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) | 57 | @@ -1772,7 +1772,7 @@ microblaze_bfd_write_imm_value_64 (bfd *abfd, bfd_byte *bfd_addr, bfd_vma val) |
| 42 | unsigned long instr_lo; | 58 | unsigned long instr_lo; |
| 43 | 59 | ||
| 44 | instr_hi = bfd_get_32 (abfd, bfd_addr); | 60 | instr_hi = bfd_get_32 (abfd, bfd_addr); |
| @@ -47,7 +63,7 @@ index ddcb5baf74..861420789b 100644 | |||
| 47 | { | 63 | { |
| 48 | instr_hi &= ~0x00ffffff; | 64 | instr_hi &= ~0x00ffffff; |
| 49 | instr_hi |= (val >> 16) & 0xffffff; | 65 | instr_hi |= (val >> 16) & 0xffffff; |
| 50 | @@ -2251,7 +2251,10 @@ microblaze_elf_relax_section (bfd *abfd, | 66 | @@ -2276,7 +2276,10 @@ microblaze_elf_relax_section (bfd *abfd, |
| 51 | unsigned long instr_lo = bfd_get_32 (abfd, ocontents | 67 | unsigned long instr_lo = bfd_get_32 (abfd, ocontents |
| 52 | + irelscan->r_offset | 68 | + irelscan->r_offset |
| 53 | + INST_WORD_SIZE); | 69 | + INST_WORD_SIZE); |
| @@ -59,7 +75,7 @@ index ddcb5baf74..861420789b 100644 | |||
| 59 | immediate |= (instr_lo & 0x0000ffff); | 75 | immediate |= (instr_lo & 0x0000ffff); |
| 60 | offset = calc_fixup (irelscan->r_addend, 0, sec); | 76 | offset = calc_fixup (irelscan->r_addend, 0, sec); |
| 61 | immediate -= offset; | 77 | immediate -= offset; |
| 62 | @@ -2295,7 +2298,10 @@ microblaze_elf_relax_section (bfd *abfd, | 78 | @@ -2320,7 +2323,10 @@ microblaze_elf_relax_section (bfd *abfd, |
| 63 | unsigned long instr_lo = bfd_get_32 (abfd, ocontents | 79 | unsigned long instr_lo = bfd_get_32 (abfd, ocontents |
| 64 | + irelscan->r_offset | 80 | + irelscan->r_offset |
| 65 | + INST_WORD_SIZE); | 81 | + INST_WORD_SIZE); |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0023-Fixed-the-bug-in-the-R_MICROBLAZE_64_NONE-relocation.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0022-Fixed-the-bug-in-the-R_MICROBLAZE_64_NONE-relocation.patch index 98f05ac8..71098800 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0023-Fixed-the-bug-in-the-R_MICROBLAZE_64_NONE-relocation.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0022-Fixed-the-bug-in-the-R_MICROBLAZE_64_NONE-relocation.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 9b9f53c95e5b1fbccd4de2dd579c6cfae34c191d Mon Sep 17 00:00:00 2001 | 1 | From 70b208a66994ba60e36ca3eaa7c525e130b145af Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Wed, 28 Nov 2018 14:00:29 +0530 | 3 | Date: Wed, 28 Nov 2018 14:00:29 +0530 |
| 4 | Subject: [PATCH 23/52] Fixed the bug in the R_MICROBLAZE_64_NONE relocation. | 4 | Subject: [PATCH 22/38] Fixed the bug in the R_MICROBLAZE_64_NONE relocation. |
| 5 | It was adjusting only lower 16bits. | 5 | It was adjusting only lower 16bits. |
| 6 | 6 | ||
| 7 | --- | 7 | --- |
| @@ -10,10 +10,10 @@ Subject: [PATCH 23/52] Fixed the bug in the R_MICROBLAZE_64_NONE relocation. | |||
| 10 | 2 files changed, 4 insertions(+), 4 deletions(-) | 10 | 2 files changed, 4 insertions(+), 4 deletions(-) |
| 11 | 11 | ||
| 12 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 12 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
| 13 | index 14bb6de052..d77710b1f3 100644 | 13 | index 2f2e1ef7f41..2a976ecbe1d 100644 |
| 14 | --- a/bfd/elf32-microblaze.c | 14 | --- a/bfd/elf32-microblaze.c |
| 15 | +++ b/bfd/elf32-microblaze.c | 15 | +++ b/bfd/elf32-microblaze.c |
| 16 | @@ -2019,8 +2019,8 @@ microblaze_elf_relax_section (bfd *abfd, | 16 | @@ -2015,8 +2015,8 @@ microblaze_elf_relax_section (bfd *abfd, |
| 17 | sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); | 17 | sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); |
| 18 | efix = calc_fixup (target_address, 0, sec); | 18 | efix = calc_fixup (target_address, 0, sec); |
| 19 | irel->r_addend -= (efix - sfix); | 19 | irel->r_addend -= (efix - sfix); |
| @@ -25,10 +25,10 @@ index 14bb6de052..d77710b1f3 100644 | |||
| 25 | break; | 25 | break; |
| 26 | } | 26 | } |
| 27 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | 27 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c |
| 28 | index 861420789b..338f16eeee 100644 | 28 | index 6fb88959357..4d41ddbd953 100644 |
| 29 | --- a/bfd/elf64-microblaze.c | 29 | --- a/bfd/elf64-microblaze.c |
| 30 | +++ b/bfd/elf64-microblaze.c | 30 | +++ b/bfd/elf64-microblaze.c |
| 31 | @@ -2030,8 +2030,8 @@ microblaze_elf_relax_section (bfd *abfd, | 31 | @@ -2053,8 +2053,8 @@ microblaze_elf_relax_section (bfd *abfd, |
| 32 | sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); | 32 | sfix = calc_fixup (irel->r_offset + INST_WORD_SIZE, 0, sec); |
| 33 | efix = calc_fixup (target_address, 0, sec); | 33 | efix = calc_fixup (target_address, 0, sec); |
| 34 | irel->r_addend -= (efix - sfix); | 34 | irel->r_addend -= (efix - sfix); |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0024-Revert-ld-Remove-unused-expression-state.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0023-Revert-ld-Remove-unused-expression-state.patch index 25d0d7eb..945bad59 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0024-Revert-ld-Remove-unused-expression-state.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0023-Revert-ld-Remove-unused-expression-state.patch | |||
| @@ -1,30 +1,36 @@ | |||
| 1 | From 70fcc4fe0635bdc871bc2ec1087173e3f93cab86 Mon Sep 17 00:00:00 2001 | 1 | From 877ba3fffc2a542580ac95a091f3883d30b7797a Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Wed, 27 Feb 2019 15:12:32 +0530 | 3 | Date: Wed, 27 Feb 2019 15:12:32 +0530 |
| 4 | Subject: [PATCH 24/52] Revert "ld: Remove unused expression state" | 4 | Subject: [PATCH 23/38] Revert "ld: Remove unused expression state" --defsym |
| 5 | symbol=expression Create a global symbol in the output file, containing the | ||
| 6 | absolute address given by expression. | ||
| 5 | 7 | ||
| 6 | This reverts commit 65f14869fd3fbee8ed4c4ca49de8aaa86dbc66cb. | 8 | This reverts commit 65f14869fd3fbee8ed4c4ca49de8aaa86dbc66cb. |
| 7 | 9 | ||
| 8 | Conflicts: | 10 | Conflicts: |
| 9 | ld/ChangeLog | 11 | ld/ChangeLog |
| 12 | |||
| 13 | Conflicts: | ||
| 14 | ld/ldexp.c | ||
| 15 | ld/ldexp.h | ||
| 10 | --- | 16 | --- |
| 11 | ld/ldexp.c | 8 +++++--- | 17 | ld/ldexp.c | 8 +++++--- |
| 12 | ld/ldexp.h | 1 + | 18 | ld/ldexp.h | 1 + |
| 13 | 2 files changed, 6 insertions(+), 3 deletions(-) | 19 | 2 files changed, 6 insertions(+), 3 deletions(-) |
| 14 | 20 | ||
| 15 | diff --git a/ld/ldexp.c b/ld/ldexp.c | 21 | diff --git a/ld/ldexp.c b/ld/ldexp.c |
| 16 | index b4e7c41209..dd3b058110 100644 | 22 | index 02c76f8b33c..ec6450965c3 100644 |
| 17 | --- a/ld/ldexp.c | 23 | --- a/ld/ldexp.c |
| 18 | +++ b/ld/ldexp.c | 24 | +++ b/ld/ldexp.c |
| 19 | @@ -1360,6 +1360,7 @@ static etree_type * | 25 | @@ -1364,6 +1364,7 @@ static etree_type * |
| 20 | exp_assop (const char *dst, | 26 | exp_assop (const char *dst, |
| 21 | etree_type *src, | 27 | etree_type *src, |
| 22 | enum node_tree_enum class, | 28 | enum node_tree_enum class, |
| 23 | + bfd_boolean defsym, | 29 | + bool defsym, |
| 24 | bfd_boolean hidden) | 30 | bool hidden) |
| 25 | { | 31 | { |
| 26 | etree_type *n; | 32 | etree_type *n; |
| 27 | @@ -1371,6 +1372,7 @@ exp_assop (const char *dst, | 33 | @@ -1375,6 +1376,7 @@ exp_assop (const char *dst, |
| 28 | n->assign.type.node_class = class; | 34 | n->assign.type.node_class = class; |
| 29 | n->assign.src = src; | 35 | n->assign.src = src; |
| 30 | n->assign.dst = dst; | 36 | n->assign.dst = dst; |
| @@ -32,43 +38,43 @@ index b4e7c41209..dd3b058110 100644 | |||
| 32 | n->assign.hidden = hidden; | 38 | n->assign.hidden = hidden; |
| 33 | return n; | 39 | return n; |
| 34 | } | 40 | } |
| 35 | @@ -1380,7 +1382,7 @@ exp_assop (const char *dst, | 41 | @@ -1384,7 +1386,7 @@ exp_assop (const char *dst, |
| 36 | etree_type * | 42 | etree_type * |
| 37 | exp_assign (const char *dst, etree_type *src, bfd_boolean hidden) | 43 | exp_assign (const char *dst, etree_type *src, bool hidden) |
| 38 | { | 44 | { |
| 39 | - return exp_assop (dst, src, etree_assign, hidden); | 45 | - return exp_assop (dst, src, etree_assign, hidden); |
| 40 | + return exp_assop (dst, src, etree_assign, FALSE, hidden); | 46 | + return exp_assop (dst, src, etree_assign, false, hidden); |
| 41 | } | 47 | } |
| 42 | 48 | ||
| 43 | /* Handle --defsym command-line option. */ | 49 | /* Handle --defsym command-line option. */ |
| 44 | @@ -1388,7 +1390,7 @@ exp_assign (const char *dst, etree_type *src, bfd_boolean hidden) | 50 | @@ -1392,7 +1394,7 @@ exp_assign (const char *dst, etree_type *src, bool hidden) |
| 45 | etree_type * | 51 | etree_type * |
| 46 | exp_defsym (const char *dst, etree_type *src) | 52 | exp_defsym (const char *dst, etree_type *src) |
| 47 | { | 53 | { |
| 48 | - return exp_assop (dst, src, etree_assign, FALSE); | 54 | - return exp_assop (dst, src, etree_assign, false); |
| 49 | + return exp_assop (dst, src, etree_assign, TRUE, FALSE); | 55 | + return exp_assop (dst, src, etree_assign, true, false); |
| 50 | } | 56 | } |
| 51 | 57 | ||
| 52 | /* Handle PROVIDE. */ | 58 | /* Handle PROVIDE. */ |
| 53 | @@ -1396,7 +1398,7 @@ exp_defsym (const char *dst, etree_type *src) | 59 | @@ -1400,7 +1402,7 @@ exp_defsym (const char *dst, etree_type *src) |
| 54 | etree_type * | 60 | etree_type * |
| 55 | exp_provide (const char *dst, etree_type *src, bfd_boolean hidden) | 61 | exp_provide (const char *dst, etree_type *src, bool hidden) |
| 56 | { | 62 | { |
| 57 | - return exp_assop (dst, src, etree_provide, hidden); | 63 | - return exp_assop (dst, src, etree_provide, hidden); |
| 58 | + return exp_assop (dst, src, etree_provide, FALSE, hidden); | 64 | + return exp_assop (dst, src, etree_provide, false, hidden); |
| 59 | } | 65 | } |
| 60 | 66 | ||
| 61 | /* Handle ASSERT. */ | 67 | /* Handle ASSERT. */ |
| 62 | diff --git a/ld/ldexp.h b/ld/ldexp.h | 68 | diff --git a/ld/ldexp.h b/ld/ldexp.h |
| 63 | index 717e839bd4..852ac6c588 100644 | 69 | index ebe82f6088f..96ac1a8e558 100644 |
| 64 | --- a/ld/ldexp.h | 70 | --- a/ld/ldexp.h |
| 65 | +++ b/ld/ldexp.h | 71 | +++ b/ld/ldexp.h |
| 66 | @@ -66,6 +66,7 @@ typedef union etree_union { | 72 | @@ -66,6 +66,7 @@ typedef union etree_union { |
| 67 | node_type type; | 73 | node_type type; |
| 68 | const char *dst; | 74 | const char *dst; |
| 69 | union etree_union *src; | 75 | union etree_union *src; |
| 70 | + bfd_boolean defsym; | 76 | + bool defsym; |
| 71 | bfd_boolean hidden; | 77 | bool hidden; |
| 72 | } assign; | 78 | } assign; |
| 73 | struct { | 79 | struct { |
| 74 | -- | 80 | -- |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0025-fixing-the-long-long-long-mingw-toolchain-issue.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0024-fixing-the-long-long-long-mingw-toolchain-issue.patch index 9d1b1794..37783b08 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0025-fixing-the-long-long-long-mingw-toolchain-issue.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0024-fixing-the-long-long-long-mingw-toolchain-issue.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 49fdaa5a4f0ed7e20b82ccb8d0db53075777abe9 Mon Sep 17 00:00:00 2001 | 1 | From b5d57f6b3d8826400a4e106e08c9387dc3defb11 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Thu, 29 Nov 2018 17:59:25 +0530 | 3 | Date: Thu, 29 Nov 2018 17:59:25 +0530 |
| 4 | Subject: [PATCH 25/52] fixing the long & long long mingw toolchain issue | 4 | Subject: [PATCH 24/38] fixing the long & long long mingw toolchain issue |
| 5 | 5 | ||
| 6 | --- | 6 | --- |
| 7 | gas/config/tc-microblaze.c | 10 +++++----- | 7 | gas/config/tc-microblaze.c | 10 +++++----- |
| @@ -9,7 +9,7 @@ Subject: [PATCH 25/52] fixing the long & long long mingw toolchain issue | |||
| 9 | 2 files changed, 7 insertions(+), 7 deletions(-) | 9 | 2 files changed, 7 insertions(+), 7 deletions(-) |
| 10 | 10 | ||
| 11 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 11 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 12 | index 532a26eaa5..b00b759893 100644 | 12 | index 6902a1518a6..52058d94f98 100644 |
| 13 | --- a/gas/config/tc-microblaze.c | 13 | --- a/gas/config/tc-microblaze.c |
| 14 | +++ b/gas/config/tc-microblaze.c | 14 | +++ b/gas/config/tc-microblaze.c |
| 15 | @@ -783,7 +783,7 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) | 15 | @@ -783,7 +783,7 @@ parse_imm (char * s, expressionS * e, offsetT min, offsetT max) |
| @@ -38,7 +38,7 @@ index 532a26eaa5..b00b759893 100644 | |||
| 38 | 38 | ||
| 39 | if (atp) | 39 | if (atp) |
| 40 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 40 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 41 | index f970941209..77d74c17f3 100644 | 41 | index b1635f41529..fff7520ae81 100644 |
| 42 | --- a/opcodes/microblaze-opc.h | 42 | --- a/opcodes/microblaze-opc.h |
| 43 | +++ b/opcodes/microblaze-opc.h | 43 | +++ b/opcodes/microblaze-opc.h |
| 44 | @@ -585,8 +585,8 @@ char pvr_register_prefix[] = "rpvr"; | 44 | @@ -585,8 +585,8 @@ char pvr_register_prefix[] = "rpvr"; |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0026-Added-support-to-new-arithmetic-single-register-inst.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0025-Added-support-to-new-arithmetic-single-register-inst.patch index 6379a5c4..d0c23c91 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0026-Added-support-to-new-arithmetic-single-register-inst.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0025-Added-support-to-new-arithmetic-single-register-inst.patch | |||
| @@ -1,39 +1,43 @@ | |||
| 1 | From b29e6a15c9f65837dbb560aa6c41c49e591915e9 Mon Sep 17 00:00:00 2001 | 1 | From e6c2ad33d4a668107e4828feb174ee08053e8c7e Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju <nmekala@xilinx.com> | 2 | From: Nagaraju <nmekala@xilinx.com> |
| 3 | Date: Fri, 23 Aug 2019 16:18:43 +0530 | 3 | Date: Fri, 23 Aug 2019 16:18:43 +0530 |
| 4 | Subject: [PATCH 26/52] Added support to new arithmetic single register | 4 | Subject: [PATCH 25/38] Added support to new arithmetic single register |
| 5 | instructions | 5 | instructions |
| 6 | 6 | ||
| 7 | Conflicts: | 7 | Conflicts: |
| 8 | opcodes/microblaze-dis.c | 8 | opcodes/microblaze-dis.c |
| 9 | |||
| 10 | Conflicts: | ||
| 11 | gas/config/tc-microblaze.c | ||
| 12 | opcodes/microblaze-dis.c | ||
| 9 | --- | 13 | --- |
| 10 | gas/config/tc-microblaze.c | 147 ++++++++++++++++++++++++++++++++++++- | 14 | gas/config/tc-microblaze.c | 147 ++++++++++++++++++++++++++++++++++++- |
| 11 | opcodes/microblaze-dis.c | 13 +++- | 15 | opcodes/microblaze-dis.c | 11 +++ |
| 12 | opcodes/microblaze-opc.h | 43 ++++++++++- | 16 | opcodes/microblaze-opc.h | 43 ++++++++++- |
| 13 | opcodes/microblaze-opcm.h | 5 +- | 17 | opcodes/microblaze-opcm.h | 5 +- |
| 14 | 4 files changed, 201 insertions(+), 7 deletions(-) | 18 | 4 files changed, 200 insertions(+), 6 deletions(-) |
| 15 | 19 | ||
| 16 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 20 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 17 | index b00b759893..eca060b262 100644 | 21 | index 52058d94f98..1a543c328f2 100644 |
| 18 | --- a/gas/config/tc-microblaze.c | 22 | --- a/gas/config/tc-microblaze.c |
| 19 | +++ b/gas/config/tc-microblaze.c | 23 | +++ b/gas/config/tc-microblaze.c |
| 20 | @@ -423,12 +423,33 @@ void | 24 | @@ -423,12 +423,33 @@ void |
| 21 | md_begin (void) | 25 | md_begin (void) |
| 22 | { | 26 | { |
| 23 | struct op_code_struct * opcode; | 27 | const struct op_code_struct * opcode; |
| 24 | + const char *prev_name = ""; | 28 | + const char *prev_name = ""; |
| 25 | 29 | ||
| 26 | opcode_hash_control = hash_new (); | 30 | opcode_hash_control = str_htab_create (); |
| 27 | 31 | ||
| 28 | /* Insert unique names into hash table. */ | 32 | /* Insert unique names into hash table. */ |
| 29 | - for (opcode = opcodes; opcode->name; opcode ++) | 33 | - for (opcode = microblaze_opcodes; opcode->name; opcode ++) |
| 30 | - hash_insert (opcode_hash_control, opcode->name, (char *) opcode); | 34 | - str_hash_insert (opcode_hash_control, opcode->name, opcode, 0); |
| 31 | + for (opcode = (struct opcodes *)opcodes; opcode->name; opcode ++) | 35 | + for (opcode = (struct microblaze_opcodes *)microblaze_opcodes; opcode->name; opcode ++) |
| 32 | + { | 36 | + { |
| 33 | + if (strcmp (prev_name, opcode->name)) | 37 | + if (strcmp (prev_name, opcode->name)) |
| 34 | + { | 38 | + { |
| 35 | + prev_name = (char *) opcode->name; | 39 | + prev_name = (char *) opcode->name; |
| 36 | + hash_insert (opcode_hash_control, opcode->name, (char *) opcode); | 40 | + str_hash_insert (opcode_hash_control, opcode->name, opcode, 0); |
| 37 | + } | 41 | + } |
| 38 | + } | 42 | + } |
| 39 | +} | 43 | +} |
| @@ -153,7 +157,7 @@ index b00b759893..eca060b262 100644 | |||
| 153 | inst = opcode->bit_sequence; | 157 | inst = opcode->bit_sequence; |
| 154 | isize = 4; | 158 | isize = 4; |
| 155 | 159 | ||
| 156 | @@ -1480,6 +1574,51 @@ md_assemble (char * str) | 160 | @@ -1486,6 +1580,51 @@ md_assemble (char * str) |
| 157 | inst |= (immed << IMM_LOW) & IMM15_MASK; | 161 | inst |= (immed << IMM_LOW) & IMM15_MASK; |
| 158 | break; | 162 | break; |
| 159 | 163 | ||
| @@ -206,10 +210,10 @@ index b00b759893..eca060b262 100644 | |||
| 206 | if (strcmp (op_end, "")) | 210 | if (strcmp (op_end, "")) |
| 207 | op_end = parse_reg (op_end + 1, ®1); /* Get r1. */ | 211 | op_end = parse_reg (op_end + 1, ®1); /* Get r1. */ |
| 208 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | 212 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c |
| 209 | index 1dc11a2653..90d2328659 100644 | 213 | index 143a0a9d59e..d945d144c44 100644 |
| 210 | --- a/opcodes/microblaze-dis.c | 214 | --- a/opcodes/microblaze-dis.c |
| 211 | +++ b/opcodes/microblaze-dis.c | 215 | +++ b/opcodes/microblaze-dis.c |
| 212 | @@ -130,9 +130,17 @@ get_field_imm15 (struct string_buf *buf, long instr) | 216 | @@ -130,6 +130,14 @@ get_field_imm15 (struct string_buf *buf, long instr) |
| 213 | return p; | 217 | return p; |
| 214 | } | 218 | } |
| 215 | 219 | ||
| @@ -223,11 +227,7 @@ index 1dc11a2653..90d2328659 100644 | |||
| 223 | + | 227 | + |
| 224 | static char * | 228 | static char * |
| 225 | get_field_special (struct string_buf *buf, long instr, | 229 | get_field_special (struct string_buf *buf, long instr, |
| 226 | - struct op_code_struct *op) | 230 | const struct op_code_struct *op) |
| 227 | + struct op_code_struct *op) | ||
| 228 | { | ||
| 229 | char *p = strbuf (buf); | ||
| 230 | char *spr; | ||
| 231 | @@ -456,6 +464,9 @@ print_insn_microblaze (bfd_vma memaddr, struct disassemble_info * info) | 231 | @@ -456,6 +464,9 @@ print_insn_microblaze (bfd_vma memaddr, struct disassemble_info * info) |
| 232 | /* For mbar 16 or sleep insn. */ | 232 | /* For mbar 16 or sleep insn. */ |
| 233 | case INST_TYPE_NONE: | 233 | case INST_TYPE_NONE: |
| @@ -239,7 +239,7 @@ index 1dc11a2653..90d2328659 100644 | |||
| 239 | case INST_TYPE_RD_R1_IMMW_IMMS: | 239 | case INST_TYPE_RD_R1_IMMW_IMMS: |
| 240 | print_func (stream, "\t%s, %s, %s, %s", get_field_rd (&buf, inst),get_field_r1(&buf, inst),get_field_immw (&buf, inst), get_field_imms (&buf, inst)); | 240 | print_func (stream, "\t%s, %s, %s, %s", get_field_rd (&buf, inst),get_field_r1(&buf, inst),get_field_immw (&buf, inst), get_field_imms (&buf, inst)); |
| 241 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 241 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 242 | index 77d74c17f3..c1b453c95e 100644 | 242 | index fff7520ae81..c25383f2de9 100644 |
| 243 | --- a/opcodes/microblaze-opc.h | 243 | --- a/opcodes/microblaze-opc.h |
| 244 | +++ b/opcodes/microblaze-opc.h | 244 | +++ b/opcodes/microblaze-opc.h |
| 245 | @@ -69,6 +69,7 @@ | 245 | @@ -69,6 +69,7 @@ |
| @@ -299,9 +299,9 @@ index 77d74c17f3..c1b453c95e 100644 | |||
| 299 | -#define MAX_OPCODES 412 | 299 | -#define MAX_OPCODES 412 |
| 300 | +#define MAX_OPCODES 424 | 300 | +#define MAX_OPCODES 424 |
| 301 | 301 | ||
| 302 | struct op_code_struct | 302 | const struct op_code_struct |
| 303 | { | 303 | { |
| 304 | @@ -444,13 +473,21 @@ struct op_code_struct | 304 | @@ -444,13 +473,21 @@ const struct op_code_struct |
| 305 | {"cmpl", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000101, OPCODE_MASK_H4, cmpl, arithmetic_inst }, | 305 | {"cmpl", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000101, OPCODE_MASK_H4, cmpl, arithmetic_inst }, |
| 306 | {"cmplu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000103, OPCODE_MASK_H4, cmplu, arithmetic_inst }, | 306 | {"cmplu", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x14000103, OPCODE_MASK_H4, cmplu, arithmetic_inst }, |
| 307 | {"addli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x20000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* Identical to 32-bit */ | 307 | {"addli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x20000000, OPCODE_MASK_H, invalid_inst, arithmetic_inst }, /* Identical to 32-bit */ |
| @@ -323,7 +323,7 @@ index 77d74c17f3..c1b453c95e 100644 | |||
| 323 | {"mull", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000100, OPCODE_MASK_H4, mull, mult_inst }, | 323 | {"mull", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x40000100, OPCODE_MASK_H4, mull, mult_inst }, |
| 324 | {"bslll", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000500, OPCODE_MASK_H3, bslll, barrel_shift_inst }, | 324 | {"bslll", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000500, OPCODE_MASK_H3, bslll, barrel_shift_inst }, |
| 325 | {"bslra", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000300, OPCODE_MASK_H3, bslra, barrel_shift_inst }, | 325 | {"bslra", INST_TYPE_RD_R1_R2, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x44000300, OPCODE_MASK_H3, bslra, barrel_shift_inst }, |
| 326 | @@ -501,9 +538,13 @@ struct op_code_struct | 326 | @@ -501,9 +538,13 @@ const struct op_code_struct |
| 327 | {"beaged", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9FA00000, OPCODE_MASK_H14, beaged, branch_inst }, | 327 | {"beaged", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9FA00000, OPCODE_MASK_H14, beaged, branch_inst }, |
| 328 | {"bealged", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9FA00100, OPCODE_MASK_H14, bealged, branch_inst }, | 328 | {"bealged", INST_TYPE_R1_R2, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0x9FA00100, OPCODE_MASK_H14, bealged, branch_inst }, |
| 329 | {"orli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, invalid_inst, logical_inst }, /* Identical to 32-bit */ | 329 | {"orli", INST_TYPE_RD_R1_IMML, INST_NO_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xA0000000, OPCODE_MASK_H, invalid_inst, logical_inst }, /* Identical to 32-bit */ |
| @@ -338,7 +338,7 @@ index 77d74c17f3..c1b453c95e 100644 | |||
| 338 | {"breai", INST_TYPE_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8010000, OPCODE_MASK_H12, breai, branch_inst }, | 338 | {"breai", INST_TYPE_IMM, INST_PC_OFFSET, NO_DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8010000, OPCODE_MASK_H12, breai, branch_inst }, |
| 339 | {"breaid", INST_TYPE_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8110000, OPCODE_MASK_H12, breaid, branch_inst }, | 339 | {"breaid", INST_TYPE_IMM, INST_PC_OFFSET, DELAY_SLOT, IMMVAL_MASK_NON_SPECIAL, 0xB8110000, OPCODE_MASK_H12, breaid, branch_inst }, |
| 340 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h | 340 | diff --git a/opcodes/microblaze-opcm.h b/opcodes/microblaze-opcm.h |
| 341 | index fcf259a362..eca247c63b 100644 | 341 | index 70e351f6f4e..cf7512d6a87 100644 |
| 342 | --- a/opcodes/microblaze-opcm.h | 342 | --- a/opcodes/microblaze-opcm.h |
| 343 | +++ b/opcodes/microblaze-opcm.h | 343 | +++ b/opcodes/microblaze-opcm.h |
| 344 | @@ -61,7 +61,9 @@ enum microblaze_instr | 344 | @@ -61,7 +61,9 @@ enum microblaze_instr |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0027-Patch-MicroBlaze-double-imml-generation-for-64-bit-v.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0026-Patch-MicroBlaze-double-imml-generation-for-64-bit-v.patch index e3826d6f..cdf2854c 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0027-Patch-MicroBlaze-double-imml-generation-for-64-bit-v.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0026-Patch-MicroBlaze-double-imml-generation-for-64-bit-v.patch | |||
| @@ -1,16 +1,18 @@ | |||
| 1 | From 653712c23456574468c426aebbeb5ee8dae7237e Mon Sep 17 00:00:00 2001 | 1 | From 65677ff251b88389b3de4837f57215dc088dd716 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Mon, 26 Aug 2019 15:29:42 +0530 | 3 | Date: Mon, 26 Aug 2019 15:29:42 +0530 |
| 4 | Subject: [PATCH 27/52] [Patch,MicroBlaze] : double imml generation for 64 bit | 4 | Subject: [PATCH 26/38] [Patch,MicroBlaze] : double imml generation for 64 bit |
| 5 | values. | 5 | values. |
| 6 | 6 | ||
| 7 | Conflicts: | ||
| 8 | gas/config/tc-microblaze.c | ||
| 7 | --- | 9 | --- |
| 8 | gas/config/tc-microblaze.c | 322 ++++++++++++++++++++++++++++++------- | 10 | gas/config/tc-microblaze.c | 321 ++++++++++++++++++++++++++++++------- |
| 9 | opcodes/microblaze-opc.h | 4 +- | 11 | opcodes/microblaze-opc.h | 4 +- |
| 10 | 2 files changed, 263 insertions(+), 63 deletions(-) | 12 | 2 files changed, 262 insertions(+), 63 deletions(-) |
| 11 | 13 | ||
| 12 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 14 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 13 | index eca060b262..aef54ad83f 100644 | 15 | index 1a543c328f2..18dd8524949 100644 |
| 14 | --- a/gas/config/tc-microblaze.c | 16 | --- a/gas/config/tc-microblaze.c |
| 15 | +++ b/gas/config/tc-microblaze.c | 17 | +++ b/gas/config/tc-microblaze.c |
| 16 | @@ -1008,7 +1008,7 @@ md_assemble (char * str) | 18 | @@ -1008,7 +1008,7 @@ md_assemble (char * str) |
| @@ -35,7 +37,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 35 | else | 37 | else |
| 36 | as_fatal (_("Error in statement syntax")); | 38 | as_fatal (_("Error in statement syntax")); |
| 37 | 39 | ||
| 38 | @@ -1288,24 +1293,51 @@ md_assemble (char * str) | 40 | @@ -1292,26 +1297,51 @@ md_assemble (char * str) |
| 39 | || streq (name, "lwi") || streq (name, "sbi") | 41 | || streq (name, "lwi") || streq (name, "sbi") |
| 40 | || streq (name, "shi") || streq (name, "swi")))) | 42 | || streq (name, "shi") || streq (name, "swi")))) |
| 41 | { | 43 | { |
| @@ -45,61 +47,56 @@ index eca060b262..aef54ad83f 100644 | |||
| 45 | + if (temp != 0 && temp != 0xFFFFFFFFFFFF8000) | 47 | + if (temp != 0 && temp != 0xFFFFFFFFFFFF8000) |
| 46 | { | 48 | { |
| 47 | /* Needs an immediate inst. */ | 49 | /* Needs an immediate inst. */ |
| 48 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 50 | - opcode1 |
| 51 | - = (struct op_code_struct *) str_hash_find (opcode_hash_control, | ||
| 52 | - "imml"); | ||
| 49 | - if (opcode1 == NULL) | 53 | - if (opcode1 == NULL) |
| 50 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) | 54 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) |
| 51 | + { | 55 | + { |
| 52 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 56 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 53 | + if (opcode1 == NULL) | 57 | + if (opcode1 == NULL) |
| 58 | { | ||
| 59 | as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 60 | return; | ||
| 61 | } | ||
| 62 | inst1 = opcode1->bit_sequence; | ||
| 63 | - inst1 |= ((immed & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | ||
| 64 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | ||
| 65 | output[0] = INST_BYTE0 (inst1); | ||
| 66 | output[1] = INST_BYTE1 (inst1); | ||
| 67 | output[2] = INST_BYTE2 (inst1); | ||
| 68 | output[3] = INST_BYTE3 (inst1); | ||
| 69 | output = frag_more (isize); | ||
| 70 | } | ||
| 71 | + else | ||
| 72 | + { | ||
| 73 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 74 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 75 | + if (opcode1 == NULL || opcode2 == NULL) | ||
| 54 | + { | 76 | + { |
| 55 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 77 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| 56 | + return; | 78 | + return; |
| 57 | + } | 79 | + } |
| 58 | + inst1 = opcode1->bit_sequence; | 80 | + inst1 = opcode2->bit_sequence; |
| 59 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | 81 | + inst1 |= ((immed & 0xFFFFFF0000000000L) >> 40) & IMML_MASK; |
| 60 | + output[0] = INST_BYTE0 (inst1); | 82 | + output[0] = INST_BYTE0 (inst1); |
| 61 | + output[1] = INST_BYTE1 (inst1); | 83 | + output[1] = INST_BYTE1 (inst1); |
| 62 | + output[2] = INST_BYTE2 (inst1); | 84 | + output[2] = INST_BYTE2 (inst1); |
| 63 | + output[3] = INST_BYTE3 (inst1); | 85 | + output[3] = INST_BYTE3 (inst1); |
| 64 | + output = frag_more (isize); | 86 | + output = frag_more (isize); |
| 65 | + } | 87 | + inst1 = opcode1->bit_sequence; |
| 66 | + else | 88 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; |
| 67 | + { | ||
| 68 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 69 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 70 | + if (opcode1 == NULL || opcode2 == NULL) | ||
| 71 | { | ||
| 72 | as_bad (_("unknown opcode \"%s\""), "imml"); | ||
| 73 | return; | ||
| 74 | } | ||
| 75 | + inst1 = opcode2->bit_sequence; | ||
| 76 | + inst1 |= ((immed & 0xFFFFFF0000000000L) >> 40) & IMML_MASK; | ||
| 77 | + output[0] = INST_BYTE0 (inst1); | 89 | + output[0] = INST_BYTE0 (inst1); |
| 78 | + output[1] = INST_BYTE1 (inst1); | 90 | + output[1] = INST_BYTE1 (inst1); |
| 79 | + output[2] = INST_BYTE2 (inst1); | 91 | + output[2] = INST_BYTE2 (inst1); |
| 80 | + output[3] = INST_BYTE3 (inst1); | 92 | + output[3] = INST_BYTE3 (inst1); |
| 81 | + output = frag_more (isize); | 93 | + output = frag_more (isize); |
| 82 | inst1 = opcode1->bit_sequence; | 94 | + } |
| 83 | - inst1 |= ((immed & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | ||
| 84 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | ||
| 85 | output[0] = INST_BYTE0 (inst1); | ||
| 86 | output[1] = INST_BYTE1 (inst1); | ||
| 87 | output[2] = INST_BYTE2 (inst1); | ||
| 88 | output[3] = INST_BYTE3 (inst1); | ||
| 89 | output = frag_more (isize); | ||
| 90 | } | ||
| 91 | + } | 95 | + } |
| 92 | inst |= (reg1 << RD_LOW) & RD_MASK; | 96 | inst |= (reg1 << RD_LOW) & RD_MASK; |
| 93 | inst |= (reg2 << RA_LOW) & RA_MASK; | 97 | inst |= (reg2 << RA_LOW) & RA_MASK; |
| 94 | inst |= (immed << IMM_LOW) & IMM_MASK; | 98 | inst |= (immed << IMM_LOW) & IMM_MASK; |
| 95 | @@ -1316,14 +1348,13 @@ md_assemble (char * str) | 99 | @@ -1328,8 +1358,7 @@ md_assemble (char * str) |
| 96 | if ((temp != 0) && (temp != 0xFFFF8000)) | ||
| 97 | { | ||
| 98 | /* Needs an immediate inst. */ | ||
| 99 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 100 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | ||
| 101 | if (opcode1 == NULL) | ||
| 102 | { | ||
| 103 | as_bad (_("unknown opcode \"%s\""), "imm"); | 100 | as_bad (_("unknown opcode \"%s\""), "imm"); |
| 104 | return; | 101 | return; |
| 105 | } | 102 | } |
| @@ -109,7 +106,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 109 | inst1 |= ((immed & 0xFFFF0000) >> 16) & IMM_MASK; | 106 | inst1 |= ((immed & 0xFFFF0000) >> 16) & IMM_MASK; |
| 110 | output[0] = INST_BYTE0 (inst1); | 107 | output[0] = INST_BYTE0 (inst1); |
| 111 | output[1] = INST_BYTE1 (inst1); | 108 | output[1] = INST_BYTE1 (inst1); |
| 112 | @@ -1564,7 +1595,7 @@ md_assemble (char * str) | 109 | @@ -1570,7 +1599,7 @@ md_assemble (char * str) |
| 113 | as_fatal (_("Cannot use special register with this instruction")); | 110 | as_fatal (_("Cannot use special register with this instruction")); |
| 114 | 111 | ||
| 115 | if (exp.X_op != O_constant) | 112 | if (exp.X_op != O_constant) |
| @@ -118,18 +115,15 @@ index eca060b262..aef54ad83f 100644 | |||
| 118 | else | 115 | else |
| 119 | { | 116 | { |
| 120 | output = frag_more (isize); | 117 | output = frag_more (isize); |
| 121 | @@ -1898,8 +1929,9 @@ md_assemble (char * str) | 118 | @@ -1904,6 +1933,7 @@ md_assemble (char * str) |
| 122 | temp = immed & 0xFFFF8000; | 119 | temp = immed & 0xFFFF8000; |
| 123 | if ((temp != 0) && (temp != 0xFFFF8000)) | 120 | if ((temp != 0) && (temp != 0xFFFF8000)) |
| 124 | { | 121 | { |
| 125 | + | 122 | + |
| 126 | /* Needs an immediate inst. */ | 123 | /* Needs an immediate inst. */ |
| 127 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 124 | opcode1 |
| 128 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 125 | = (struct op_code_struct *) str_hash_find (opcode_hash_control, |
| 129 | if (opcode1 == NULL) | 126 | @@ -1936,7 +1966,12 @@ md_assemble (char * str) |
| 130 | { | ||
| 131 | as_bad (_("unknown opcode \"%s\""), "imm"); | ||
| 132 | @@ -1928,7 +1960,12 @@ md_assemble (char * str) | ||
| 133 | reg1 = 0; | 127 | reg1 = 0; |
| 134 | } | 128 | } |
| 135 | if (strcmp (op_end, "")) | 129 | if (strcmp (op_end, "")) |
| @@ -142,7 +136,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 142 | else | 136 | else |
| 143 | as_fatal (_("Error in statement syntax")); | 137 | as_fatal (_("Error in statement syntax")); |
| 144 | 138 | ||
| 145 | @@ -1967,30 +2004,55 @@ md_assemble (char * str) | 139 | @@ -1975,30 +2010,55 @@ md_assemble (char * str) |
| 146 | } | 140 | } |
| 147 | if (streq (name, "brealid") || streq (name, "breaid") || streq (name, "breai")) | 141 | if (streq (name, "brealid") || streq (name, "breaid") || streq (name, "breai")) |
| 148 | { | 142 | { |
| @@ -152,10 +146,10 @@ index eca060b262..aef54ad83f 100644 | |||
| 152 | + if (temp != 0 && temp != 0xFFFFFFFFFFFF8000) | 146 | + if (temp != 0 && temp != 0xFFFFFFFFFFFF8000) |
| 153 | { | 147 | { |
| 154 | /* Needs an immediate inst. */ | 148 | /* Needs an immediate inst. */ |
| 155 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 149 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 156 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) | 150 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) |
| 157 | + { | 151 | + { |
| 158 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 152 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 159 | if (opcode1 == NULL) | 153 | if (opcode1 == NULL) |
| 160 | { | 154 | { |
| 161 | as_bad (_("unknown opcode \"%s\""), "imml"); | 155 | as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -171,8 +165,8 @@ index eca060b262..aef54ad83f 100644 | |||
| 171 | output = frag_more (isize); | 165 | output = frag_more (isize); |
| 172 | } | 166 | } |
| 173 | + else { | 167 | + else { |
| 174 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 168 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 175 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 169 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 176 | + if (opcode1 == NULL || opcode2 == NULL) | 170 | + if (opcode1 == NULL || opcode2 == NULL) |
| 177 | + { | 171 | + { |
| 178 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 172 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -203,7 +197,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 203 | temp = immed & 0xFFFF8000; | 197 | temp = immed & 0xFFFF8000; |
| 204 | if ((temp != 0) && (temp != 0xFFFF8000)) | 198 | if ((temp != 0) && (temp != 0xFFFF8000)) |
| 205 | { | 199 | { |
| 206 | @@ -2076,25 +2138,50 @@ md_assemble (char * str) | 200 | @@ -2086,24 +2146,50 @@ md_assemble (char * str) |
| 207 | streq (name, "breaid") || | 201 | streq (name, "breaid") || |
| 208 | streq (name, "brai") || streq (name, "braid"))) | 202 | streq (name, "brai") || streq (name, "braid"))) |
| 209 | { | 203 | { |
| @@ -212,28 +206,27 @@ index eca060b262..aef54ad83f 100644 | |||
| 212 | if (temp != 0) | 206 | if (temp != 0) |
| 213 | { | 207 | { |
| 214 | /* Needs an immediate inst. */ | 208 | /* Needs an immediate inst. */ |
| 215 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 209 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 216 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) | 210 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) |
| 217 | + { | 211 | + { |
| 218 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 212 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 219 | if (opcode1 == NULL) | 213 | if (opcode1 == NULL) |
| 220 | { | 214 | { |
| 221 | as_bad (_("unknown opcode \"%s\""), "imml"); | 215 | as_bad (_("unknown opcode \"%s\""), "imml"); |
| 222 | return; | 216 | return; |
| 223 | } | 217 | } |
| 224 | - | ||
| 225 | inst1 = opcode1->bit_sequence; | 218 | inst1 = opcode1->bit_sequence; |
| 226 | - inst1 |= ((immed & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; | 219 | - inst1 |= ((immed & 0xFFFFFFFFFFFF0000L) >> 16) & IMML_MASK; |
| 227 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | 220 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; |
| 228 | + output[0] = INST_BYTE0 (inst1); | 221 | output[0] = INST_BYTE0 (inst1); |
| 229 | + output[1] = INST_BYTE1 (inst1); | 222 | output[1] = INST_BYTE1 (inst1); |
| 230 | + output[2] = INST_BYTE2 (inst1); | 223 | output[2] = INST_BYTE2 (inst1); |
| 231 | + output[3] = INST_BYTE3 (inst1); | 224 | output[3] = INST_BYTE3 (inst1); |
| 232 | + output = frag_more (isize); | 225 | output = frag_more (isize); |
| 233 | + } | 226 | } |
| 234 | + else { | 227 | + else { |
| 235 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 228 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 236 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 229 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 237 | + if (opcode1 == NULL || opcode2 == NULL) | 230 | + if (opcode1 == NULL || opcode2 == NULL) |
| 238 | + { | 231 | + { |
| 239 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 232 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -248,22 +241,22 @@ index eca060b262..aef54ad83f 100644 | |||
| 248 | + output = frag_more (isize); | 241 | + output = frag_more (isize); |
| 249 | + inst1 = opcode1->bit_sequence; | 242 | + inst1 = opcode1->bit_sequence; |
| 250 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | 243 | + inst1 |= ((immed & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; |
| 251 | output[0] = INST_BYTE0 (inst1); | 244 | + output[0] = INST_BYTE0 (inst1); |
| 252 | output[1] = INST_BYTE1 (inst1); | 245 | + output[1] = INST_BYTE1 (inst1); |
| 253 | output[2] = INST_BYTE2 (inst1); | 246 | + output[2] = INST_BYTE2 (inst1); |
| 254 | output[3] = INST_BYTE3 (inst1); | 247 | + output[3] = INST_BYTE3 (inst1); |
| 255 | output = frag_more (isize); | 248 | + output = frag_more (isize); |
| 256 | } | 249 | + } |
| 257 | + } | 250 | + } |
| 258 | inst |= (immed << IMM_LOW) & IMM_MASK; | 251 | inst |= (immed << IMM_LOW) & IMM_MASK; |
| 259 | } | 252 | } |
| 260 | else | 253 | else |
| 261 | @@ -2194,21 +2281,45 @@ md_assemble (char * str) | 254 | @@ -2203,21 +2289,45 @@ md_assemble (char * str) |
| 262 | { | 255 | { |
| 263 | output = frag_more (isize); | 256 | output = frag_more (isize); |
| 264 | immedl = exp.X_add_number; | 257 | immedl = exp.X_add_number; |
| 265 | - | 258 | - |
| 266 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 259 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 267 | - if (opcode1 == NULL) | 260 | - if (opcode1 == NULL) |
| 268 | - { | 261 | - { |
| 269 | - as_bad (_("unknown opcode \"%s\""), "imml"); | 262 | - as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -277,14 +270,14 @@ index eca060b262..aef54ad83f 100644 | |||
| 277 | - output[2] = INST_BYTE2 (inst1); | 270 | - output[2] = INST_BYTE2 (inst1); |
| 278 | - output[3] = INST_BYTE3 (inst1); | 271 | - output[3] = INST_BYTE3 (inst1); |
| 279 | - output = frag_more (isize); | 272 | - output = frag_more (isize); |
| 280 | + if (((long long)immedl) > (long long)-549755813888 && ((long long)immedl) < (long long)549755813887) | 273 | + if (((long long)immedl) > (long long)-549755813888 && ((long long)immedl) < (long long)549755813887) |
| 281 | + { | ||
| 282 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | ||
| 283 | + if (opcode1 == NULL) | ||
| 284 | + { | 274 | + { |
| 275 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 276 | + if (opcode1 == NULL) | ||
| 277 | + { | ||
| 285 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 278 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| 286 | + return; | 279 | + return; |
| 287 | + } | 280 | + } |
| 288 | + inst1 = opcode1->bit_sequence; | 281 | + inst1 = opcode1->bit_sequence; |
| 289 | + inst1 |= ((immedl & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | 282 | + inst1 |= ((immedl & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; |
| 290 | + output[0] = INST_BYTE0 (inst1); | 283 | + output[0] = INST_BYTE0 (inst1); |
| @@ -294,8 +287,8 @@ index eca060b262..aef54ad83f 100644 | |||
| 294 | + output = frag_more (isize); | 287 | + output = frag_more (isize); |
| 295 | + } | 288 | + } |
| 296 | + else { | 289 | + else { |
| 297 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 290 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 298 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 291 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 299 | + if (opcode2 == NULL || opcode1 == NULL) | 292 | + if (opcode2 == NULL || opcode1 == NULL) |
| 300 | + { | 293 | + { |
| 301 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 294 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -319,11 +312,11 @@ index eca060b262..aef54ad83f 100644 | |||
| 319 | } | 312 | } |
| 320 | 313 | ||
| 321 | inst |= (reg1 << RD_LOW) & RD_MASK; | 314 | inst |= (reg1 << RD_LOW) & RD_MASK; |
| 322 | @@ -2257,21 +2368,46 @@ md_assemble (char * str) | 315 | @@ -2266,21 +2376,46 @@ md_assemble (char * str) |
| 323 | { | 316 | { |
| 324 | output = frag_more (isize); | 317 | output = frag_more (isize); |
| 325 | immedl = exp.X_add_number; | 318 | immedl = exp.X_add_number; |
| 326 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 319 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 327 | - if (opcode1 == NULL) | 320 | - if (opcode1 == NULL) |
| 328 | - { | 321 | - { |
| 329 | - as_bad (_("unknown opcode \"%s\""), "imml"); | 322 | - as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -332,7 +325,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 332 | - | 325 | - |
| 333 | + if (((long long)immedl) > (long long)-549755813888 && ((long long)immedl) < (long long)549755813887) | 326 | + if (((long long)immedl) > (long long)-549755813888 && ((long long)immedl) < (long long)549755813887) |
| 334 | + { | 327 | + { |
| 335 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 328 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 336 | + if (opcode1 == NULL) | 329 | + if (opcode1 == NULL) |
| 337 | + { | 330 | + { |
| 338 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 331 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -347,8 +340,8 @@ index eca060b262..aef54ad83f 100644 | |||
| 347 | + output = frag_more (isize); | 340 | + output = frag_more (isize); |
| 348 | + } | 341 | + } |
| 349 | + else { | 342 | + else { |
| 350 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 343 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 351 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 344 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 352 | + if (opcode2 == NULL || opcode1 == NULL) | 345 | + if (opcode2 == NULL || opcode1 == NULL) |
| 353 | + { | 346 | + { |
| 354 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 347 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -374,7 +367,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 374 | 367 | ||
| 375 | inst |= (reg1 << RA_LOW) & RA_MASK; | 368 | inst |= (reg1 << RA_LOW) & RA_MASK; |
| 376 | inst |= (immedl << IMM_LOW) & IMM_MASK; | 369 | inst |= (immedl << IMM_LOW) & IMM_MASK; |
| 377 | @@ -2551,8 +2687,8 @@ md_apply_fix (fixS * fixP, | 370 | @@ -2560,8 +2695,8 @@ md_apply_fix (fixS * fixP, |
| 378 | /* Note: use offsetT because it is signed, valueT is unsigned. */ | 371 | /* Note: use offsetT because it is signed, valueT is unsigned. */ |
| 379 | offsetT val = (offsetT) * valp; | 372 | offsetT val = (offsetT) * valp; |
| 380 | int i; | 373 | int i; |
| @@ -385,7 +378,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 385 | 378 | ||
| 386 | symname = fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : _("<unknown>"); | 379 | symname = fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : _("<unknown>"); |
| 387 | 380 | ||
| 388 | @@ -2735,30 +2871,75 @@ md_apply_fix (fixS * fixP, | 381 | @@ -2743,30 +2878,75 @@ md_apply_fix (fixS * fixP, |
| 389 | case BFD_RELOC_MICROBLAZE_64_TEXTREL: | 382 | case BFD_RELOC_MICROBLAZE_64_TEXTREL: |
| 390 | case BFD_RELOC_MICROBLAZE_64: | 383 | case BFD_RELOC_MICROBLAZE_64: |
| 391 | case BFD_RELOC_MICROBLAZE_64_PCREL: | 384 | case BFD_RELOC_MICROBLAZE_64_PCREL: |
| @@ -396,12 +389,13 @@ index eca060b262..aef54ad83f 100644 | |||
| 396 | || fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) | 389 | || fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) |
| 397 | { | 390 | { |
| 398 | /* Generate the imm instruction. */ | 391 | /* Generate the imm instruction. */ |
| 392 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); | ||
| 399 | + if (((long long)val) > (long long)-549755813888 && ((long long)val) < (long long)549755813887) | 393 | + if (((long long)val) > (long long)-549755813888 && ((long long)val) < (long long)549755813887) |
| 400 | + { | 394 | + { |
| 401 | + /* Add an imm instruction. First save the current instruction. */ | 395 | + /* Add an imm instruction. First save the current instruction. */ |
| 402 | + for (i = 0; i < INST_WORD_SIZE; i++) | 396 | + for (i = 0; i < INST_WORD_SIZE; i++) |
| 403 | + buf[i + INST_WORD_SIZE] = buf[i]; | 397 | + buf[i + INST_WORD_SIZE] = buf[i]; |
| 404 | opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 398 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 405 | if (opcode1 == NULL) | 399 | if (opcode1 == NULL) |
| 406 | - { | 400 | - { |
| 407 | - as_bad (_("unknown opcode \"%s\""), "imml"); | 401 | - as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -416,9 +410,11 @@ index eca060b262..aef54ad83f 100644 | |||
| 416 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 410 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| 417 | - inst1 |= ((val & 0xFFFFFF0000L) >> 16) & IMML_MASK; | 411 | - inst1 |= ((val & 0xFFFFFF0000L) >> 16) & IMML_MASK; |
| 418 | + inst1 |= ((val & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | 412 | + inst1 |= ((val & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; |
| 419 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | 413 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) |
| 414 | - fixP->fx_r_type = BFD_RELOC_64; | ||
| 420 | + fixP->fx_r_type = BFD_RELOC_64; | 415 | + fixP->fx_r_type = BFD_RELOC_64; |
| 421 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) | 416 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) |
| 417 | - fixP->fx_r_type = BFD_RELOC_64_PCREL; | ||
| 422 | + fixP->fx_r_type = BFD_RELOC_64_PCREL; | 418 | + fixP->fx_r_type = BFD_RELOC_64_PCREL; |
| 423 | + buf[0] = INST_BYTE0 (inst1); | 419 | + buf[0] = INST_BYTE0 (inst1); |
| 424 | + buf[1] = INST_BYTE1 (inst1); | 420 | + buf[1] = INST_BYTE1 (inst1); |
| @@ -430,8 +426,8 @@ index eca060b262..aef54ad83f 100644 | |||
| 430 | + for (i = 0; i < INST_WORD_SIZE; i++) | 426 | + for (i = 0; i < INST_WORD_SIZE; i++) |
| 431 | + buf[i + INST_WORD_SIZE + 4] = buf[i]; | 427 | + buf[i + INST_WORD_SIZE + 4] = buf[i]; |
| 432 | + | 428 | + |
| 433 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 429 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 434 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 430 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 435 | + if (opcode1 == NULL || opcode2 ==NULL) | 431 | + if (opcode1 == NULL || opcode2 ==NULL) |
| 436 | + { | 432 | + { |
| 437 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 433 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -447,11 +443,9 @@ index eca060b262..aef54ad83f 100644 | |||
| 447 | + inst2 = opcode1->bit_sequence; | 443 | + inst2 = opcode1->bit_sequence; |
| 448 | + if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 444 | + if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| 449 | + inst1 |= ((val & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; | 445 | + inst1 |= ((val & 0x000000FFFFFF0000L) >> 16) & IMML_MASK; |
| 450 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) | 446 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64) |
| 451 | - fixP->fx_r_type = BFD_RELOC_64; | ||
| 452 | + fixP->fx_r_type = BFD_RELOC_64; | 447 | + fixP->fx_r_type = BFD_RELOC_64; |
| 453 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) | 448 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_PCREL) |
| 454 | - fixP->fx_r_type = BFD_RELOC_64_PCREL; | ||
| 455 | + fixP->fx_r_type = BFD_RELOC_64_PCREL; | 449 | + fixP->fx_r_type = BFD_RELOC_64_PCREL; |
| 456 | + buf[0] = INST_BYTE0 (inst1); | 450 | + buf[0] = INST_BYTE0 (inst1); |
| 457 | + buf[1] = INST_BYTE1 (inst1); | 451 | + buf[1] = INST_BYTE1 (inst1); |
| @@ -469,9 +463,9 @@ index eca060b262..aef54ad83f 100644 | |||
| 469 | + for (i = 0; i < INST_WORD_SIZE; i++) | 463 | + for (i = 0; i < INST_WORD_SIZE; i++) |
| 470 | + buf[i + INST_WORD_SIZE] = buf[i]; | 464 | + buf[i + INST_WORD_SIZE] = buf[i]; |
| 471 | /* Generate the imm instruction. */ | 465 | /* Generate the imm instruction. */ |
| 472 | opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 466 | opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); |
| 473 | if (opcode1 == NULL) | 467 | if (opcode1 == NULL) |
| 474 | @@ -2770,12 +2951,11 @@ md_apply_fix (fixS * fixP, | 468 | @@ -2778,12 +2958,11 @@ md_apply_fix (fixS * fixP, |
| 475 | inst1 = opcode1->bit_sequence; | 469 | inst1 = opcode1->bit_sequence; |
| 476 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 470 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| 477 | inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; | 471 | inst1 |= ((val & 0xFFFF0000) >> 16) & IMM_MASK; |
| @@ -485,24 +479,24 @@ index eca060b262..aef54ad83f 100644 | |||
| 485 | /* Add the value only if the symbol is defined. */ | 479 | /* Add the value only if the symbol is defined. */ |
| 486 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) | 480 | if (fixP->fx_addsy == NULL || S_IS_DEFINED (fixP->fx_addsy)) |
| 487 | { | 481 | { |
| 488 | @@ -2807,21 +2987,41 @@ md_apply_fix (fixS * fixP, | 482 | @@ -2816,21 +2995,41 @@ md_apply_fix (fixS * fixP, |
| 489 | /* Add an imm instruction. First save the current instruction. */ | ||
| 490 | for (i = 0; i < INST_WORD_SIZE; i++) | 483 | for (i = 0; i < INST_WORD_SIZE; i++) |
| 491 | buf[i + INST_WORD_SIZE] = buf[i]; | 484 | buf[i + INST_WORD_SIZE] = buf[i]; |
| 485 | /* Generate the imm instruction. */ | ||
| 492 | - if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) | 486 | - if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) |
| 493 | - opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 487 | - opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 494 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) { | 488 | + if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64_GPC) { |
| 495 | + if (((long long)val) > (long long)-549755813888 && ((long long)val) < (long long)549755813887) | 489 | + if (((long long)val) > (long long)-549755813888 && ((long long)val) < (long long)549755813887) |
| 496 | + { | 490 | + { |
| 497 | + for (i = 0; i < INST_WORD_SIZE; i++) | 491 | + for (i = 0; i < INST_WORD_SIZE; i++) |
| 498 | + buf[i + INST_WORD_SIZE] = buf[i]; | 492 | + buf[i + INST_WORD_SIZE] = buf[i]; |
| 499 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 493 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 500 | + } | 494 | + } |
| 501 | + else { | 495 | + else { |
| 502 | + for (i = 0; i < INST_WORD_SIZE; i++) | 496 | + for (i = 0; i < INST_WORD_SIZE; i++) |
| 503 | + buf[i + INST_WORD_SIZE + 4] = buf[i]; | 497 | + buf[i + INST_WORD_SIZE + 4] = buf[i]; |
| 504 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 498 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 505 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 499 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 506 | + inst2 = opcode2->bit_sequence; | 500 | + inst2 = opcode2->bit_sequence; |
| 507 | + | 501 | + |
| 508 | + /* We can fixup call to a defined non-global address | 502 | + /* We can fixup call to a defined non-global address |
| @@ -514,7 +508,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 514 | + } | 508 | + } |
| 515 | + } | 509 | + } |
| 516 | else | 510 | else |
| 517 | opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imm"); | 511 | opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imm"); |
| 518 | if (opcode1 == NULL) | 512 | if (opcode1 == NULL) |
| 519 | { | 513 | { |
| 520 | + for (i = 0; i < INST_WORD_SIZE; i++) | 514 | + for (i = 0; i < INST_WORD_SIZE; i++) |
| @@ -532,7 +526,7 @@ index eca060b262..aef54ad83f 100644 | |||
| 532 | within the same section only. */ | 526 | within the same section only. */ |
| 533 | buf[0] = INST_BYTE0 (inst1); | 527 | buf[0] = INST_BYTE0 (inst1); |
| 534 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | 528 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h |
| 535 | index c1b453c95e..ba0b3f8b62 100644 | 529 | index c25383f2de9..6f9a5a60dab 100644 |
| 536 | --- a/opcodes/microblaze-opc.h | 530 | --- a/opcodes/microblaze-opc.h |
| 537 | +++ b/opcodes/microblaze-opc.h | 531 | +++ b/opcodes/microblaze-opc.h |
| 538 | @@ -626,8 +626,8 @@ char pvr_register_prefix[] = "rpvr"; | 532 | @@ -626,8 +626,8 @@ char pvr_register_prefix[] = "rpvr"; |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0028-Fixed-bug-in-generation-of-IMML-instruction-for-the.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0027-Fixed-bug-in-generation-of-IMML-instruction-for-the.patch index e8c55106..02940730 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0028-Fixed-bug-in-generation-of-IMML-instruction-for-the.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0027-Fixed-bug-in-generation-of-IMML-instruction-for-the.patch | |||
| @@ -1,18 +1,18 @@ | |||
| 1 | From 2c051a6d5326e34cb4a3170073cda17e7269055d Mon Sep 17 00:00:00 2001 | 1 | From 6b6b0332aa2dcb4fa86911031cafd1cc5442b17f Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju <nmekala@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Wed, 22 Jan 2020 16:31:12 +0530 | 3 | Date: Wed, 3 Nov 2021 12:13:32 +0530 |
| 4 | Subject: [PATCH 28/52] Fixed bug in generation of IMML instruction for the new | 4 | Subject: [PATCH 27/38] Fixed bug in generation of IMML instruction for the |
| 5 | MB-64 instructions with single register. | ||
| 6 | 5 | ||
| 6 | new MB-64 instructions with single register. | ||
| 7 | --- | 7 | --- |
| 8 | gas/config/tc-microblaze.c | 50 +++++++++++++++++++++++++++++++++++--- | 8 | gas/config/tc-microblaze.c | 50 +++++++++++++++++++++++++++++++++++--- |
| 9 | 1 file changed, 47 insertions(+), 3 deletions(-) | 9 | 1 file changed, 47 insertions(+), 3 deletions(-) |
| 10 | 10 | ||
| 11 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 11 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 12 | index aef54ad83f..647cfb6869 100644 | 12 | index 18dd8524949..68f19c965ef 100644 |
| 13 | --- a/gas/config/tc-microblaze.c | 13 | --- a/gas/config/tc-microblaze.c |
| 14 | +++ b/gas/config/tc-microblaze.c | 14 | +++ b/gas/config/tc-microblaze.c |
| 15 | @@ -1639,12 +1639,56 @@ md_assemble (char * str) | 15 | @@ -1643,12 +1643,56 @@ md_assemble (char * str) |
| 16 | exp.X_add_symbol, | 16 | exp.X_add_symbol, |
| 17 | exp.X_add_number, | 17 | exp.X_add_number, |
| 18 | (char *) opc); | 18 | (char *) opc); |
| @@ -29,7 +29,7 @@ index aef54ad83f..647cfb6869 100644 | |||
| 29 | + /* Needs an immediate inst. */ | 29 | + /* Needs an immediate inst. */ |
| 30 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) | 30 | + if (((long long)immed) > (long long)-549755813888 && ((long long)immed) < (long long)549755813887) |
| 31 | + { | 31 | + { |
| 32 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 32 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 33 | + if (opcode1 == NULL) | 33 | + if (opcode1 == NULL) |
| 34 | + { | 34 | + { |
| 35 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 35 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -44,8 +44,8 @@ index aef54ad83f..647cfb6869 100644 | |||
| 44 | + output = frag_more (isize); | 44 | + output = frag_more (isize); |
| 45 | + } | 45 | + } |
| 46 | + else { | 46 | + else { |
| 47 | + opcode2 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 47 | + opcode2 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 48 | + opcode1 = (struct op_code_struct *) hash_find (opcode_hash_control, "imml"); | 48 | + opcode1 = (struct op_code_struct *) str_hash_find (opcode_hash_control, "imml"); |
| 49 | + if (opcode1 == NULL || opcode2 == NULL) | 49 | + if (opcode1 == NULL || opcode2 == NULL) |
| 50 | + { | 50 | + { |
| 51 | + as_bad (_("unknown opcode \"%s\""), "imml"); | 51 | + as_bad (_("unknown opcode \"%s\""), "imml"); |
| @@ -70,7 +70,7 @@ index aef54ad83f..647cfb6869 100644 | |||
| 70 | } | 70 | } |
| 71 | inst |= (reg1 << RD_LOW) & RD_MASK; | 71 | inst |= (reg1 << RD_LOW) & RD_MASK; |
| 72 | inst |= (immed << IMM_LOW) & IMM16_MASK; | 72 | inst |= (immed << IMM_LOW) & IMM16_MASK; |
| 73 | @@ -2138,8 +2182,8 @@ md_assemble (char * str) | 73 | @@ -2146,8 +2190,8 @@ md_assemble (char * str) |
| 74 | streq (name, "breaid") || | 74 | streq (name, "breaid") || |
| 75 | streq (name, "brai") || streq (name, "braid"))) | 75 | streq (name, "brai") || streq (name, "braid"))) |
| 76 | { | 76 | { |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0029-Patch-MicroBlaze-m64-This-patch-will-remove-imml-0-a.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0028-Patch-MicroBlaze-m64-This-patch-will-remove-imml-0-a.patch index abfcdabc..d738e930 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0029-Patch-MicroBlaze-m64-This-patch-will-remove-imml-0-a.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0028-Patch-MicroBlaze-m64-This-patch-will-remove-imml-0-a.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 77751e719ba1470f3dc869ae309485adb02819b6 Mon Sep 17 00:00:00 2001 | 1 | From 851a3d7218539c1a886edd92c57efe36b85e29be Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Thu, 16 Apr 2020 18:08:58 +0530 | 3 | Date: Thu, 16 Apr 2020 18:08:58 +0530 |
| 4 | Subject: [PATCH 29/52] [Patch,MicroBlaze m64] : This patch will remove imml 0 | 4 | Subject: [PATCH 28/38] [Patch,MicroBlaze m64] : This patch will remove imml 0 |
| 5 | and imml -1 instructions when the offset is less than 16 bit for Type A | 5 | and imml -1 instructions when the offset is less than 16 bit for Type A |
| 6 | branch EA instructions. | 6 | branch EA instructions. |
| 7 | 7 | ||
| @@ -10,10 +10,10 @@ Subject: [PATCH 29/52] [Patch,MicroBlaze m64] : This patch will remove imml 0 | |||
| 10 | 1 file changed, 2 insertions(+), 4 deletions(-) | 10 | 1 file changed, 2 insertions(+), 4 deletions(-) |
| 11 | 11 | ||
| 12 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 12 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 13 | index 647cfb6869..e565b2a99d 100644 | 13 | index 68f19c965ef..805d250b6ac 100644 |
| 14 | --- a/gas/config/tc-microblaze.c | 14 | --- a/gas/config/tc-microblaze.c |
| 15 | +++ b/gas/config/tc-microblaze.c | 15 | +++ b/gas/config/tc-microblaze.c |
| 16 | @@ -2150,9 +2150,7 @@ md_assemble (char * str) | 16 | @@ -2158,9 +2158,7 @@ md_assemble (char * str) |
| 17 | if (exp.X_op != O_constant) | 17 | if (exp.X_op != O_constant) |
| 18 | { | 18 | { |
| 19 | char *opc; | 19 | char *opc; |
| @@ -24,7 +24,7 @@ index 647cfb6869..e565b2a99d 100644 | |||
| 24 | opc = str_microblaze_64; | 24 | opc = str_microblaze_64; |
| 25 | else | 25 | else |
| 26 | opc = NULL; | 26 | opc = NULL; |
| 27 | @@ -2916,7 +2914,7 @@ md_apply_fix (fixS * fixP, | 27 | @@ -2923,7 +2921,7 @@ md_apply_fix (fixS * fixP, |
| 28 | case BFD_RELOC_MICROBLAZE_64: | 28 | case BFD_RELOC_MICROBLAZE_64: |
| 29 | case BFD_RELOC_MICROBLAZE_64_PCREL: | 29 | case BFD_RELOC_MICROBLAZE_64_PCREL: |
| 30 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64 | 30 | if (fixP->fx_r_type == BFD_RELOC_MICROBLAZE_64 |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0030-Patch-MicroBlaze-improper-address-mapping-of-PROVIDE.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0029-Patch-MicroBlaze-improper-address-mapping-of-PROVIDE.patch index b8f8b8bd..f220f611 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0030-Patch-MicroBlaze-improper-address-mapping-of-PROVIDE.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0029-Patch-MicroBlaze-improper-address-mapping-of-PROVIDE.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 2a43e06f14cac633d87f5b213a6bacd16085967f Mon Sep 17 00:00:00 2001 | 1 | From aa1705bc097efd5003e5d818e1e2d12ff5fc0c94 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Wed, 17 Jun 2020 21:20:26 +0530 | 3 | Date: Wed, 17 Jun 2020 21:20:26 +0530 |
| 4 | Subject: [PATCH 30/52] [Patch,MicroBlaze] : improper address mapping of | 4 | Subject: [PATCH 29/38] [Patch,MicroBlaze] : improper address mapping of |
| 5 | PROVIDE directive symbols[DTOR_END] are causing runtime loops and we don't | 5 | PROVIDE directive symbols[DTOR_END] are causing runtime loops and we don't |
| 6 | need to override PROVIDE symbols if symbols are defined in libraries and | 6 | need to override PROVIDE symbols if symbols are defined in libraries and |
| 7 | linker so I am disabling override for PROVIDE symbols. | 7 | linker so I am disabling override for PROVIDE symbols. |
| @@ -11,7 +11,7 @@ Subject: [PATCH 30/52] [Patch,MicroBlaze] : improper address mapping of | |||
| 11 | 1 file changed, 9 insertions(+), 3 deletions(-) | 11 | 1 file changed, 9 insertions(+), 3 deletions(-) |
| 12 | 12 | ||
| 13 | diff --git a/ld/ldlang.c b/ld/ldlang.c | 13 | diff --git a/ld/ldlang.c b/ld/ldlang.c |
| 14 | index 9977195074..a2c44cf719 100644 | 14 | index 37b64c89ee1..5b179daf8f1 100644 |
| 15 | --- a/ld/ldlang.c | 15 | --- a/ld/ldlang.c |
| 16 | +++ b/ld/ldlang.c | 16 | +++ b/ld/ldlang.c |
| 17 | @@ -3657,10 +3657,16 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode) | 17 | @@ -3657,10 +3657,16 @@ open_input_bfds (lang_statement_union_type *s, enum open_bfd_mode mode) |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0056-Patch-microblaze-Changing-the-long-to-long-long-as-i.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0030-Patch-microblaze-Changing-the-long-to-long-long-as-i.patch index b69b5a32..85f63b41 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0056-Patch-microblaze-Changing-the-long-to-long-long-as-i.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0030-Patch-microblaze-Changing-the-long-to-long-long-as-i.patch | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | From 9897f7ce32daafc2d9438820162df363f4b53274 Mon Sep 17 00:00:00 2001 | 1 | From 34c213ce7e7ef7e1f8fd91b686da655df43efca2 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilinx.com> | 2 | From: Nagaraju Mekala <nmekala@xilinx.com> |
| 3 | Date: Tue, 20 Apr 2021 21:22:06 +0530 | 3 | Date: Tue, 20 Apr 2021 21:22:06 +0530 |
| 4 | Subject: [PATCH 56] [Patch, microblaze]:Changing the long to long long as in | 4 | Subject: [PATCH 30/38] [Patch, microblaze]:Changing the long to long long as |
| 5 | Windows long is 32-bit but we need the variable to be 64-bit | 5 | in Windows long is 32-bit but we need the variable to be 64-bit |
| 6 | 6 | ||
| 7 | Signed-off-by :Nagaraju Mekala <nmekala@xilix.com> | 7 | Signed-off-by :Nagaraju Mekala <nmekala@xilix.com> |
| 8 | --- | 8 | --- |
| @@ -10,10 +10,10 @@ Signed-off-by :Nagaraju Mekala <nmekala@xilix.com> | |||
| 10 | 1 file changed, 1 insertion(+), 1 deletion(-) | 10 | 1 file changed, 1 insertion(+), 1 deletion(-) |
| 11 | 11 | ||
| 12 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 12 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 13 | index df7088d6c3..34222cc866 100644 | 13 | index 805d250b6ac..84f60c029c1 100644 |
| 14 | --- a/gas/config/tc-microblaze.c | 14 | --- a/gas/config/tc-microblaze.c |
| 15 | +++ b/gas/config/tc-microblaze.c | 15 | +++ b/gas/config/tc-microblaze.c |
| 16 | @@ -1033,7 +1033,7 @@ md_assemble (char * str) | 16 | @@ -1017,7 +1017,7 @@ md_assemble (char * str) |
| 17 | unsigned reg2; | 17 | unsigned reg2; |
| 18 | unsigned reg3; | 18 | unsigned reg3; |
| 19 | unsigned isize; | 19 | unsigned isize; |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0031-gas-revert-moving-of-md_pseudo_table-from-const.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0031-gas-revert-moving-of-md_pseudo_table-from-const.patch index 83b293f3..c96b5757 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0031-gas-revert-moving-of-md_pseudo_table-from-const.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0031-gas-revert-moving-of-md_pseudo_table-from-const.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From c45a69deeb210ebdb80cf055cef9e62bd0bda053 Mon Sep 17 00:00:00 2001 | 1 | From 2a8a925c35909543738ccacafcdc7000525a27c6 Mon Sep 17 00:00:00 2001 |
| 2 | From: Mark Hatle <mark.hatle@kernel.crashing.org> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Thu, 16 Jul 2020 12:38:11 -0500 | 3 | Date: Mon, 8 Nov 2021 21:57:13 +0530 |
| 4 | Subject: [PATCH 31/52] gas: revert moving of md_pseudo_table from const | 4 | Subject: [PATCH 31/38] gas: revert moving of md_pseudo_table from const |
| 5 | 5 | ||
| 6 | The base system expect md_pseudo_table to be constant, Changing the | 6 | The base system expect md_pseudo_table to be constant, Changing the |
| 7 | definition will break other architectures when compiled with a | 7 | definition will break other architectures when compiled with a |
| @@ -18,7 +18,7 @@ Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org> | |||
| 18 | 2 files changed, 14 insertions(+), 4 deletions(-) | 18 | 2 files changed, 14 insertions(+), 4 deletions(-) |
| 19 | 19 | ||
| 20 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | 20 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c |
| 21 | index e565b2a99d..c6ca913f8b 100644 | 21 | index 84f60c029c1..dfcd0ab1569 100644 |
| 22 | --- a/gas/config/tc-microblaze.c | 22 | --- a/gas/config/tc-microblaze.c |
| 23 | +++ b/gas/config/tc-microblaze.c | 23 | +++ b/gas/config/tc-microblaze.c |
| 24 | @@ -385,6 +385,17 @@ microblaze_s_weakext (int ignore ATTRIBUTE_UNUSED) | 24 | @@ -385,6 +385,17 @@ microblaze_s_weakext (int ignore ATTRIBUTE_UNUSED) |
| @@ -57,7 +57,7 @@ index e565b2a99d..c6ca913f8b 100644 | |||
| 57 | {"weakext", microblaze_s_weakext, 0}, | 57 | {"weakext", microblaze_s_weakext, 0}, |
| 58 | {"rodata", microblaze_s_rdata, 0}, | 58 | {"rodata", microblaze_s_rdata, 0}, |
| 59 | {"sdata2", microblaze_s_rdata, 1}, | 59 | {"sdata2", microblaze_s_rdata, 1}, |
| 60 | @@ -3448,7 +3459,6 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) | 60 | @@ -3456,7 +3467,6 @@ md_parse_option (int c, const char * arg ATTRIBUTE_UNUSED) |
| 61 | case OPTION_M64: | 61 | case OPTION_M64: |
| 62 | //if (arg != NULL && strcmp (arg, "64") == 0) | 62 | //if (arg != NULL && strcmp (arg, "64") == 0) |
| 63 | microblaze_arch_size = 64; | 63 | microblaze_arch_size = 64; |
| @@ -66,7 +66,7 @@ index e565b2a99d..c6ca913f8b 100644 | |||
| 66 | default: | 66 | default: |
| 67 | return 0; | 67 | return 0; |
| 68 | diff --git a/gas/tc.h b/gas/tc.h | 68 | diff --git a/gas/tc.h b/gas/tc.h |
| 69 | index 5bdfe5c347..da1738d67a 100644 | 69 | index f1fa7495e29..c9722307dea 100644 |
| 70 | --- a/gas/tc.h | 70 | --- a/gas/tc.h |
| 71 | +++ b/gas/tc.h | 71 | +++ b/gas/tc.h |
| 72 | @@ -22,7 +22,7 @@ | 72 | @@ -22,7 +22,7 @@ |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0032-ld-emulparams-elf64microblaze-Fix-emulation-generati.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0032-ld-emulparams-elf64microblaze-Fix-emulation-generati.patch index 8891a77f..83e5a42b 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0032-ld-emulparams-elf64microblaze-Fix-emulation-generati.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0032-ld-emulparams-elf64microblaze-Fix-emulation-generati.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 7b285c827edbc34cf79d4ed0f46cdfd4916b687c Mon Sep 17 00:00:00 2001 | 1 | From 231121a6d5ff51bcf578c06288181db5f800d66f Mon Sep 17 00:00:00 2001 |
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Mon, 30 Nov 2020 16:17:36 -0800 | 3 | Date: Mon, 8 Nov 2021 22:01:23 +0530 |
| 4 | Subject: [PATCH 32/52] ld/emulparams/elf64microblaze: Fix emulation generation | 4 | Subject: [PATCH 32/38] ld/emulparams/elf64microblaze: Fix emulation generation |
| 5 | 5 | ||
| 6 | Compilation fails when building ld-new with: | 6 | Compilation fails when building ld-new with: |
| 7 | 7 | ||
| @@ -17,7 +17,7 @@ Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | |||
| 17 | 2 files changed, 2 insertions(+), 2 deletions(-) | 17 | 2 files changed, 2 insertions(+), 2 deletions(-) |
| 18 | 18 | ||
| 19 | diff --git a/ld/emulparams/elf64microblaze.sh b/ld/emulparams/elf64microblaze.sh | 19 | diff --git a/ld/emulparams/elf64microblaze.sh b/ld/emulparams/elf64microblaze.sh |
| 20 | index 9c7b0eb708..7b4c7c411b 100644 | 20 | index 9c7b0eb7080..7b4c7c411bd 100644 |
| 21 | --- a/ld/emulparams/elf64microblaze.sh | 21 | --- a/ld/emulparams/elf64microblaze.sh |
| 22 | +++ b/ld/emulparams/elf64microblaze.sh | 22 | +++ b/ld/emulparams/elf64microblaze.sh |
| 23 | @@ -19,5 +19,5 @@ NOP=0x80000000 | 23 | @@ -19,5 +19,5 @@ NOP=0x80000000 |
| @@ -28,7 +28,7 @@ index 9c7b0eb708..7b4c7c411b 100644 | |||
| 28 | +TEMPLATE_NAME=elf | 28 | +TEMPLATE_NAME=elf |
| 29 | #GENERATE_SHLIB_SCRIPT=yes | 29 | #GENERATE_SHLIB_SCRIPT=yes |
| 30 | diff --git a/ld/emulparams/elf64microblazeel.sh b/ld/emulparams/elf64microblazeel.sh | 30 | diff --git a/ld/emulparams/elf64microblazeel.sh b/ld/emulparams/elf64microblazeel.sh |
| 31 | index 9c7b0eb708..7b4c7c411b 100644 | 31 | index 9c7b0eb7080..7b4c7c411bd 100644 |
| 32 | --- a/ld/emulparams/elf64microblazeel.sh | 32 | --- a/ld/emulparams/elf64microblazeel.sh |
| 33 | +++ b/ld/emulparams/elf64microblazeel.sh | 33 | +++ b/ld/emulparams/elf64microblazeel.sh |
| 34 | @@ -19,5 +19,5 @@ NOP=0x80000000 | 34 | @@ -19,5 +19,5 @@ NOP=0x80000000 |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0033-Add-initial-port-of-linux-gdbserver-add-gdb_proc_ser.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0033-Add-initial-port-of-linux-gdbserver-add-gdb_proc_ser.patch deleted file mode 100644 index b296e1b1..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0033-Add-initial-port-of-linux-gdbserver-add-gdb_proc_ser.patch +++ /dev/null | |||
| @@ -1,435 +0,0 @@ | |||
| 1 | From 3f506a7c6a8f7b746102276f3c41a7b11bd7ac3c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Mon, 23 Jan 2017 19:07:44 +0530 | ||
| 4 | Subject: [PATCH 33/52] Add initial port of linux gdbserver add | ||
| 5 | gdb_proc_service_h to gdbserver microblaze-linux | ||
| 6 | |||
| 7 | gdbserver needs to initialise the microblaze registers | ||
| 8 | |||
| 9 | other archs use this step to run a *_arch_setup() to carry out all | ||
| 10 | architecture specific setup - may need to add in future | ||
| 11 | |||
| 12 | * add linux-ptrace.o to gdbserver configure | ||
| 13 | * Update breakpoint opcode | ||
| 14 | * fix segfault on connecting gdbserver | ||
| 15 | * add microblaze_linux_memory_remove_breakpoint | ||
| 16 | * add set_solib_svr4_fetch_link_map_offsets | ||
| 17 | * add set_gdbarch_fetch_tls_load_module_address | ||
| 18 | * Force reading of r0 as 0, prevent stores | ||
| 19 | |||
| 20 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> | ||
| 21 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | ||
| 22 | --- | ||
| 23 | gdb/configure.host | 3 + | ||
| 24 | gdb/microblaze-linux-tdep.c | 29 ++++- | ||
| 25 | gdb/microblaze-tdep.c | 35 +++++- | ||
| 26 | gdb/microblaze-tdep.h | 4 +- | ||
| 27 | gdb/regformats/reg-microblaze.dat | 41 +++++++ | ||
| 28 | gdbserver/linux-microblaze-low.c | 189 ++++++++++++++++++++++++++++++ | ||
| 29 | 6 files changed, 298 insertions(+), 3 deletions(-) | ||
| 30 | create mode 100644 gdb/regformats/reg-microblaze.dat | ||
| 31 | create mode 100644 gdbserver/linux-microblaze-low.c | ||
| 32 | |||
| 33 | diff --git a/gdb/configure.host b/gdb/configure.host | ||
| 34 | index ce52823729..cf1a08e8b2 100644 | ||
| 35 | --- a/gdb/configure.host | ||
| 36 | +++ b/gdb/configure.host | ||
| 37 | @@ -65,6 +65,7 @@ hppa*) gdb_host_cpu=pa ;; | ||
| 38 | i[34567]86*) gdb_host_cpu=i386 ;; | ||
| 39 | m68*) gdb_host_cpu=m68k ;; | ||
| 40 | mips*) gdb_host_cpu=mips ;; | ||
| 41 | +microblaze*) gdb_host_cpu=microblaze ;; | ||
| 42 | powerpc* | rs6000) gdb_host_cpu=powerpc ;; | ||
| 43 | sparcv9 | sparc64) gdb_host_cpu=sparc ;; | ||
| 44 | s390*) gdb_host_cpu=s390 ;; | ||
| 45 | @@ -133,6 +134,8 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu) | ||
| 46 | mips*-*-freebsd*) gdb_host=fbsd ;; | ||
| 47 | mips64*-*-openbsd*) gdb_host=obsd64 ;; | ||
| 48 | |||
| 49 | +microblaze*-*linux*) gdb_host=linux ;; | ||
| 50 | + | ||
| 51 | powerpc-*-aix* | rs6000-*-* | powerpc64-*-aix*) | ||
| 52 | gdb_host=aix ;; | ||
| 53 | powerpc*-*-freebsd*) gdb_host=fbsd ;; | ||
| 54 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | ||
| 55 | index be710bedb6..fb8241884b 100644 | ||
| 56 | --- a/gdb/microblaze-linux-tdep.c | ||
| 57 | +++ b/gdb/microblaze-linux-tdep.c | ||
| 58 | @@ -37,6 +37,22 @@ | ||
| 59 | #include "tramp-frame.h" | ||
| 60 | #include "linux-tdep.h" | ||
| 61 | |||
| 62 | +static int microblaze_debug_flag = 0; | ||
| 63 | + | ||
| 64 | +static void | ||
| 65 | +microblaze_debug (const char *fmt, ...) | ||
| 66 | +{ | ||
| 67 | + if (microblaze_debug_flag) | ||
| 68 | + { | ||
| 69 | + va_list args; | ||
| 70 | + | ||
| 71 | + va_start (args, fmt); | ||
| 72 | + printf_unfiltered ("MICROBLAZE LINUX: "); | ||
| 73 | + vprintf_unfiltered (fmt, args); | ||
| 74 | + va_end (args); | ||
| 75 | + } | ||
| 76 | +} | ||
| 77 | + | ||
| 78 | static int | ||
| 79 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 80 | struct bp_target_info *bp_tgt) | ||
| 81 | @@ -46,18 +62,25 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 82 | int val; | ||
| 83 | int bplen; | ||
| 84 | gdb_byte old_contents[BREAKPOINT_MAX]; | ||
| 85 | + struct cleanup *cleanup; | ||
| 86 | |||
| 87 | /* Determine appropriate breakpoint contents and size for this address. */ | ||
| 88 | bp = gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen); | ||
| 89 | |||
| 90 | + /* Make sure we see the memory breakpoints. */ | ||
| 91 | + cleanup = make_show_memory_breakpoints_cleanup (1); | ||
| 92 | val = target_read_memory (addr, old_contents, bplen); | ||
| 93 | |||
| 94 | /* If our breakpoint is no longer at the address, this means that the | ||
| 95 | program modified the code on us, so it is wrong to put back the | ||
| 96 | old value. */ | ||
| 97 | if (val == 0 && memcmp (bp, old_contents, bplen) == 0) | ||
| 98 | - val = target_write_raw_memory (addr, bp_tgt->shadow_contents, bplen); | ||
| 99 | + { | ||
| 100 | + val = target_write_raw_memory (addr, bp_tgt->shadow_contents, bplen); | ||
| 101 | + microblaze_debug ("microblaze_linux_memory_remove_breakpoint writing back to memory at addr 0x%lx\n", addr); | ||
| 102 | + } | ||
| 103 | |||
| 104 | + do_cleanups (cleanup); | ||
| 105 | return val; | ||
| 106 | } | ||
| 107 | |||
| 108 | @@ -129,6 +152,10 @@ microblaze_linux_init_abi (struct gdbarch_info info, | ||
| 109 | /* Trampolines. */ | ||
| 110 | tramp_frame_prepend_unwinder (gdbarch, | ||
| 111 | µblaze_linux_sighandler_tramp_frame); | ||
| 112 | + | ||
| 113 | + /* Enable TLS support. */ | ||
| 114 | + set_gdbarch_fetch_tls_load_module_address (gdbarch, | ||
| 115 | + svr4_fetch_objfile_link_map); | ||
| 116 | } | ||
| 117 | |||
| 118 | void _initialize_microblaze_linux_tdep (); | ||
| 119 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | ||
| 120 | index 5c80413304..443adfb364 100644 | ||
| 121 | --- a/gdb/microblaze-tdep.c | ||
| 122 | +++ b/gdb/microblaze-tdep.c | ||
| 123 | @@ -137,7 +137,38 @@ microblaze_fetch_instruction (CORE_ADDR pc) | ||
| 124 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; | ||
| 125 | |||
| 126 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; | ||
| 127 | - | ||
| 128 | +static int | ||
| 129 | +microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 130 | + struct bp_target_info *bp_tgt) | ||
| 131 | +{ | ||
| 132 | + CORE_ADDR addr = bp_tgt->placed_address; | ||
| 133 | + const unsigned char *bp; | ||
| 134 | + int val; | ||
| 135 | + int bplen; | ||
| 136 | + gdb_byte old_contents[BREAKPOINT_MAX]; | ||
| 137 | + struct cleanup *cleanup; | ||
| 138 | + | ||
| 139 | + /* Determine appropriate breakpoint contents and size for this address. */ | ||
| 140 | + bp = gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen); | ||
| 141 | + if (bp == NULL) | ||
| 142 | + error (_("Software breakpoints not implemented for this target.")); | ||
| 143 | + | ||
| 144 | + /* Make sure we see the memory breakpoints. */ | ||
| 145 | + cleanup = make_show_memory_breakpoints_cleanup (1); | ||
| 146 | + val = target_read_memory (addr, old_contents, bplen); | ||
| 147 | + | ||
| 148 | + /* If our breakpoint is no longer at the address, this means that the | ||
| 149 | + program modified the code on us, so it is wrong to put back the | ||
| 150 | + old value. */ | ||
| 151 | + if (val == 0 && memcmp (bp, old_contents, bplen) == 0) | ||
| 152 | + { | ||
| 153 | + val = target_write_raw_memory (addr, bp_tgt->shadow_contents, bplen); | ||
| 154 | + microblaze_debug ("microblaze_linux_memory_remove_breakpoint writing back to memory at addr 0x%lx\n", addr); | ||
| 155 | + } | ||
| 156 | + | ||
| 157 | + do_cleanups (cleanup); | ||
| 158 | + return val; | ||
| 159 | +} | ||
| 160 | |||
| 161 | /* Allocate and initialize a frame cache. */ | ||
| 162 | |||
| 163 | @@ -731,6 +762,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 164 | microblaze_breakpoint::kind_from_pc); | ||
| 165 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, | ||
| 166 | microblaze_breakpoint::bp_from_kind); | ||
| 167 | + set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); | ||
| 168 | |||
| 169 | set_gdbarch_frame_args_skip (gdbarch, 8); | ||
| 170 | |||
| 171 | @@ -771,4 +803,5 @@ When non-zero, microblaze specific debugging is enabled."), | ||
| 172 | NULL, | ||
| 173 | &setdebuglist, &showdebuglist); | ||
| 174 | |||
| 175 | + | ||
| 176 | } | ||
| 177 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
| 178 | index 4fbdf9933f..db0772643d 100644 | ||
| 179 | --- a/gdb/microblaze-tdep.h | ||
| 180 | +++ b/gdb/microblaze-tdep.h | ||
| 181 | @@ -117,6 +117,8 @@ struct microblaze_frame_cache | ||
| 182 | |||
| 183 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. | ||
| 184 | Only used for native debugging. */ | ||
| 185 | -#define MICROBLAZE_BREAKPOINT {0xb9, 0xcc, 0x00, 0x60} | ||
| 186 | +#define MICROBLAZE_BREAKPOINT {0xba, 0x0c, 0x00, 0x18} | ||
| 187 | +#define MICROBLAZE_BREAKPOINT_LE {0x18, 0x00, 0x0c, 0xba} | ||
| 188 | + | ||
| 189 | |||
| 190 | #endif /* microblaze-tdep.h */ | ||
| 191 | diff --git a/gdb/regformats/reg-microblaze.dat b/gdb/regformats/reg-microblaze.dat | ||
| 192 | new file mode 100644 | ||
| 193 | index 0000000000..bd8a438442 | ||
| 194 | --- /dev/null | ||
| 195 | +++ b/gdb/regformats/reg-microblaze.dat | ||
| 196 | @@ -0,0 +1,41 @@ | ||
| 197 | +name:microblaze | ||
| 198 | +expedite:r1,pc | ||
| 199 | +32:r0 | ||
| 200 | +32:r1 | ||
| 201 | +32:r2 | ||
| 202 | +32:r3 | ||
| 203 | +32:r4 | ||
| 204 | +32:r5 | ||
| 205 | +32:r6 | ||
| 206 | +32:r7 | ||
| 207 | +32:r8 | ||
| 208 | +32:r9 | ||
| 209 | +32:r10 | ||
| 210 | +32:r11 | ||
| 211 | +32:r12 | ||
| 212 | +32:r13 | ||
| 213 | +32:r14 | ||
| 214 | +32:r15 | ||
| 215 | +32:r16 | ||
| 216 | +32:r17 | ||
| 217 | +32:r18 | ||
| 218 | +32:r19 | ||
| 219 | +32:r20 | ||
| 220 | +32:r21 | ||
| 221 | +32:r22 | ||
| 222 | +32:r23 | ||
| 223 | +32:r24 | ||
| 224 | +32:r25 | ||
| 225 | +32:r26 | ||
| 226 | +32:r27 | ||
| 227 | +32:r28 | ||
| 228 | +32:r29 | ||
| 229 | +32:r30 | ||
| 230 | +32:r31 | ||
| 231 | +32:pc | ||
| 232 | +32:msr | ||
| 233 | +32:ear | ||
| 234 | +32:esr | ||
| 235 | +32:fsr | ||
| 236 | +32:slr | ||
| 237 | +32:shr | ||
| 238 | diff --git a/gdbserver/linux-microblaze-low.c b/gdbserver/linux-microblaze-low.c | ||
| 239 | new file mode 100644 | ||
| 240 | index 0000000000..cba5d6fc58 | ||
| 241 | --- /dev/null | ||
| 242 | +++ b/gdbserver/linux-microblaze-low.c | ||
| 243 | @@ -0,0 +1,189 @@ | ||
| 244 | +/* GNU/Linux/Microblaze specific low level interface, for the remote server for | ||
| 245 | + GDB. | ||
| 246 | + Copyright (C) 1995-2013 Free Software Foundation, Inc. | ||
| 247 | + | ||
| 248 | + This file is part of GDB. | ||
| 249 | + | ||
| 250 | + This program is free software; you can redistribute it and/or modify | ||
| 251 | + it under the terms of the GNU General Public License as published by | ||
| 252 | + the Free Software Foundation; either version 3 of the License, or | ||
| 253 | + (at your option) any later version. | ||
| 254 | + | ||
| 255 | + This program is distributed in the hope that it will be useful, | ||
| 256 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 257 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 258 | + GNU General Public License for more details. | ||
| 259 | + | ||
| 260 | + You should have received a copy of the GNU General Public License | ||
| 261 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
| 262 | + | ||
| 263 | +#include "server.h" | ||
| 264 | +#include "linux-low.h" | ||
| 265 | + | ||
| 266 | +#include <asm/ptrace.h> | ||
| 267 | +#include <sys/procfs.h> | ||
| 268 | +#include <sys/ptrace.h> | ||
| 269 | + | ||
| 270 | +#include "gdb_proc_service.h" | ||
| 271 | + | ||
| 272 | +static int microblaze_regmap[] = | ||
| 273 | + {PT_GPR(0), PT_GPR(1), PT_GPR(2), PT_GPR(3), | ||
| 274 | + PT_GPR(4), PT_GPR(5), PT_GPR(6), PT_GPR(7), | ||
| 275 | + PT_GPR(8), PT_GPR(9), PT_GPR(10), PT_GPR(11), | ||
| 276 | + PT_GPR(12), PT_GPR(13), PT_GPR(14), PT_GPR(15), | ||
| 277 | + PT_GPR(16), PT_GPR(17), PT_GPR(18), PT_GPR(19), | ||
| 278 | + PT_GPR(20), PT_GPR(21), PT_GPR(22), PT_GPR(23), | ||
| 279 | + PT_GPR(24), PT_GPR(25), PT_GPR(26), PT_GPR(27), | ||
| 280 | + PT_GPR(28), PT_GPR(29), PT_GPR(30), PT_GPR(31), | ||
| 281 | + PT_PC, PT_MSR, PT_EAR, PT_ESR, | ||
| 282 | + PT_FSR | ||
| 283 | + }; | ||
| 284 | + | ||
| 285 | +#define microblaze_num_regs (sizeof microblaze_regmap / sizeof microblaze_regmap[0]) | ||
| 286 | + | ||
| 287 | +/* Defined in auto-generated file microblaze-linux.c. */ | ||
| 288 | +void init_registers_microblaze (void); | ||
| 289 | + | ||
| 290 | +static int | ||
| 291 | +microblaze_cannot_store_register (int regno) | ||
| 292 | +{ | ||
| 293 | + if (microblaze_regmap[regno] == -1 || regno == 0) | ||
| 294 | + return 1; | ||
| 295 | + | ||
| 296 | + return 0; | ||
| 297 | +} | ||
| 298 | + | ||
| 299 | +static int | ||
| 300 | +microblaze_cannot_fetch_register (int regno) | ||
| 301 | +{ | ||
| 302 | + return 0; | ||
| 303 | +} | ||
| 304 | + | ||
| 305 | +static CORE_ADDR | ||
| 306 | +microblaze_get_pc (struct regcache *regcache) | ||
| 307 | +{ | ||
| 308 | + unsigned long pc; | ||
| 309 | + | ||
| 310 | + collect_register_by_name (regcache, "pc", &pc); | ||
| 311 | + return (CORE_ADDR) pc; | ||
| 312 | +} | ||
| 313 | + | ||
| 314 | +static void | ||
| 315 | +microblaze_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
| 316 | +{ | ||
| 317 | + unsigned long newpc = pc; | ||
| 318 | + | ||
| 319 | + supply_register_by_name (regcache, "pc", &newpc); | ||
| 320 | +} | ||
| 321 | + | ||
| 322 | +/* dbtrap insn */ | ||
| 323 | +/* brki r16, 0x18; */ | ||
| 324 | +static const unsigned long microblaze_breakpoint = 0xba0c0018; | ||
| 325 | +#define microblaze_breakpoint_len 4 | ||
| 326 | + | ||
| 327 | +static int | ||
| 328 | +microblaze_breakpoint_at (CORE_ADDR where) | ||
| 329 | +{ | ||
| 330 | + unsigned long insn; | ||
| 331 | + | ||
| 332 | + (*the_target->read_memory) (where, (unsigned char *) &insn, 4); | ||
| 333 | + if (insn == microblaze_breakpoint) | ||
| 334 | + return 1; | ||
| 335 | + /* If necessary, recognize more trap instructions here. GDB only uses the | ||
| 336 | + one. */ | ||
| 337 | + return 0; | ||
| 338 | +} | ||
| 339 | + | ||
| 340 | +static CORE_ADDR | ||
| 341 | +microblaze_reinsert_addr (struct regcache *regcache) | ||
| 342 | +{ | ||
| 343 | + unsigned long pc; | ||
| 344 | + collect_register_by_name (regcache, "r15", &pc); | ||
| 345 | + return pc; | ||
| 346 | +} | ||
| 347 | + | ||
| 348 | +#ifdef HAVE_PTRACE_GETREGS | ||
| 349 | + | ||
| 350 | +static void | ||
| 351 | +microblaze_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) | ||
| 352 | +{ | ||
| 353 | + int size = register_size (regno); | ||
| 354 | + | ||
| 355 | + memset (buf, 0, sizeof (long)); | ||
| 356 | + | ||
| 357 | + if (size < sizeof (long)) | ||
| 358 | + collect_register (regcache, regno, buf + sizeof (long) - size); | ||
| 359 | + else | ||
| 360 | + collect_register (regcache, regno, buf); | ||
| 361 | +} | ||
| 362 | + | ||
| 363 | +static void | ||
| 364 | +microblaze_supply_ptrace_register (struct regcache *regcache, | ||
| 365 | + int regno, const char *buf) | ||
| 366 | +{ | ||
| 367 | + int size = register_size (regno); | ||
| 368 | + | ||
| 369 | + if (regno == 0) { | ||
| 370 | + unsigned long regbuf_0 = 0; | ||
| 371 | + /* clobbering r0 so that it is always 0 as enforced by hardware */ | ||
| 372 | + supply_register (regcache, regno, (const char*)®buf_0); | ||
| 373 | + } else { | ||
| 374 | + if (size < sizeof (long)) | ||
| 375 | + supply_register (regcache, regno, buf + sizeof (long) - size); | ||
| 376 | + else | ||
| 377 | + supply_register (regcache, regno, buf); | ||
| 378 | + } | ||
| 379 | +} | ||
| 380 | + | ||
| 381 | +/* Provide only a fill function for the general register set. ps_lgetregs | ||
| 382 | + will use this for NPTL support. */ | ||
| 383 | + | ||
| 384 | +static void microblaze_fill_gregset (struct regcache *regcache, void *buf) | ||
| 385 | +{ | ||
| 386 | + int i; | ||
| 387 | + | ||
| 388 | + for (i = 0; i < 32; i++) | ||
| 389 | + microblaze_collect_ptrace_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
| 390 | +} | ||
| 391 | + | ||
| 392 | +static void | ||
| 393 | +microblaze_store_gregset (struct regcache *regcache, const void *buf) | ||
| 394 | +{ | ||
| 395 | + int i; | ||
| 396 | + | ||
| 397 | + for (i = 0; i < 32; i++) | ||
| 398 | + supply_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
| 399 | +} | ||
| 400 | + | ||
| 401 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
| 402 | + | ||
| 403 | +struct regset_info target_regsets[] = { | ||
| 404 | +#ifdef HAVE_PTRACE_GETREGS | ||
| 405 | + { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, | ||
| 406 | + { 0, 0, 0, -1, -1, NULL, NULL }, | ||
| 407 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
| 408 | + { 0, 0, 0, -1, -1, NULL, NULL } | ||
| 409 | +}; | ||
| 410 | + | ||
| 411 | +struct linux_target_ops the_low_target = { | ||
| 412 | + init_registers_microblaze, | ||
| 413 | + microblaze_num_regs, | ||
| 414 | + microblaze_regmap, | ||
| 415 | + NULL, | ||
| 416 | + microblaze_cannot_fetch_register, | ||
| 417 | + microblaze_cannot_store_register, | ||
| 418 | + NULL, /* fetch_register */ | ||
| 419 | + microblaze_get_pc, | ||
| 420 | + microblaze_set_pc, | ||
| 421 | + (const unsigned char *) µblaze_breakpoint, | ||
| 422 | + microblaze_breakpoint_len, | ||
| 423 | + microblaze_reinsert_addr, | ||
| 424 | + 0, | ||
| 425 | + microblaze_breakpoint_at, | ||
| 426 | + NULL, | ||
| 427 | + NULL, | ||
| 428 | + NULL, | ||
| 429 | + NULL, | ||
| 430 | + microblaze_collect_ptrace_register, | ||
| 431 | + microblaze_supply_ptrace_register, | ||
| 432 | +}; | ||
| 433 | -- | ||
| 434 | 2.17.1 | ||
| 435 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0033-Add-initial-port-of-linux-gdbserver.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0033-Add-initial-port-of-linux-gdbserver.patch new file mode 100644 index 00000000..402566be --- /dev/null +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0033-Add-initial-port-of-linux-gdbserver.patch | |||
| @@ -0,0 +1,1580 @@ | |||
| 1 | From bf7c7531e54e2f1b995e7ba52213c1df585d7fcc Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Mon, 23 Jan 2017 19:07:44 +0530 | ||
| 4 | Subject: [PATCH 33/38] Add initial port of linux gdbserver add | ||
| 5 | gdb_proc_service_h to gdbserver microblaze-linux | ||
| 6 | |||
| 7 | gdbserver needs to initialise the microblaze registers | ||
| 8 | |||
| 9 | other archs use this step to run a *_arch_setup() to carry out all | ||
| 10 | architecture specific setup - may need to add in future | ||
| 11 | |||
| 12 | * add linux-ptrace.o to gdbserver configure | ||
| 13 | * Update breakpoint opcode | ||
| 14 | * fix segfault on connecting gdbserver | ||
| 15 | * add microblaze_linux_memory_remove_breakpoint | ||
| 16 | * add set_solib_svr4_fetch_link_map_offsets | ||
| 17 | * add set_gdbarch_fetch_tls_load_module_address | ||
| 18 | * Force reading of r0 as 0, prevent stores | ||
| 19 | |||
| 20 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> | ||
| 21 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | ||
| 22 | |||
| 23 | Conflicts: | ||
| 24 | gdb/gdbserver/Makefile.in | ||
| 25 | gdb/gdbserver/configure.srv | ||
| 26 | --- | ||
| 27 | gdb/configure.host | 3 + | ||
| 28 | gdb/features/microblaze-linux.xml | 12 + | ||
| 29 | gdb/gdbserver/Makefile.in | 712 +++++++++++++++++++++++++++ | ||
| 30 | gdb/gdbserver/configure.srv | 398 +++++++++++++++ | ||
| 31 | gdb/gdbserver/linux-microblaze-low.c | 189 +++++++ | ||
| 32 | gdb/microblaze-linux-tdep.c | 29 +- | ||
| 33 | gdb/microblaze-tdep.c | 35 +- | ||
| 34 | gdb/microblaze-tdep.h | 4 +- | ||
| 35 | gdb/regformats/reg-microblaze.dat | 41 ++ | ||
| 36 | 9 files changed, 1420 insertions(+), 3 deletions(-) | ||
| 37 | create mode 100644 gdb/features/microblaze-linux.xml | ||
| 38 | create mode 100644 gdb/gdbserver/Makefile.in | ||
| 39 | create mode 100644 gdb/gdbserver/configure.srv | ||
| 40 | create mode 100644 gdb/gdbserver/linux-microblaze-low.c | ||
| 41 | create mode 100644 gdb/regformats/reg-microblaze.dat | ||
| 42 | |||
| 43 | diff --git a/gdb/configure.host b/gdb/configure.host | ||
| 44 | index e94a19b0332..4d73af78bc3 100644 | ||
| 45 | --- a/gdb/configure.host | ||
| 46 | +++ b/gdb/configure.host | ||
| 47 | @@ -66,6 +66,7 @@ hppa*) gdb_host_cpu=pa ;; | ||
| 48 | i[34567]86*) gdb_host_cpu=i386 ;; | ||
| 49 | m68*) gdb_host_cpu=m68k ;; | ||
| 50 | mips*) gdb_host_cpu=mips ;; | ||
| 51 | +microblaze*) gdb_host_cpu=microblaze ;; | ||
| 52 | powerpc* | rs6000) gdb_host_cpu=powerpc ;; | ||
| 53 | sparcv9 | sparc64) gdb_host_cpu=sparc ;; | ||
| 54 | s390*) gdb_host_cpu=s390 ;; | ||
| 55 | @@ -136,6 +137,8 @@ mips*-*-netbsd* | mips*-*-knetbsd*-gnu) | ||
| 56 | mips*-*-freebsd*) gdb_host=fbsd ;; | ||
| 57 | mips64*-*-openbsd*) gdb_host=obsd64 ;; | ||
| 58 | |||
| 59 | +microblaze*-*linux*) gdb_host=linux ;; | ||
| 60 | + | ||
| 61 | powerpc-*-aix* | rs6000-*-* | powerpc64-*-aix*) | ||
| 62 | gdb_host=aix ;; | ||
| 63 | powerpc*-*-freebsd*) gdb_host=fbsd ;; | ||
| 64 | diff --git a/gdb/features/microblaze-linux.xml b/gdb/features/microblaze-linux.xml | ||
| 65 | new file mode 100644 | ||
| 66 | index 00000000000..8983e66eb3d | ||
| 67 | --- /dev/null | ||
| 68 | +++ b/gdb/features/microblaze-linux.xml | ||
| 69 | @@ -0,0 +1,12 @@ | ||
| 70 | +<?xml version="1.0"?> | ||
| 71 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | ||
| 72 | + | ||
| 73 | + Copying and distribution of this file, with or without modification, | ||
| 74 | + are permitted in any medium without royalty provided the copyright | ||
| 75 | + notice and this notice are preserved. --> | ||
| 76 | + | ||
| 77 | +<!DOCTYPE target SYSTEM "gdb-target.dtd"> | ||
| 78 | +<target> | ||
| 79 | + <osabi>GNU/Linux</osabi> | ||
| 80 | + <xi:include href="microblaze-core.xml"/> | ||
| 81 | +</target> | ||
| 82 | diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in | ||
| 83 | new file mode 100644 | ||
| 84 | index 00000000000..fb4762a22d5 | ||
| 85 | --- /dev/null | ||
| 86 | +++ b/gdb/gdbserver/Makefile.in | ||
| 87 | @@ -0,0 +1,712 @@ | ||
| 88 | +# Copyright (C) 1989-2020 Free Software Foundation, Inc. | ||
| 89 | + | ||
| 90 | +# This file is part of GDB. | ||
| 91 | + | ||
| 92 | +# This program is free software; you can redistribute it and/or modify | ||
| 93 | +# it under the terms of the GNU General Public License as published by | ||
| 94 | +# the Free Software Foundation; either version 3 of the License, or | ||
| 95 | +# (at your option) any later version. | ||
| 96 | +# | ||
| 97 | +# This program is distributed in the hope that it will be useful, | ||
| 98 | +# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 99 | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 100 | +# GNU General Public License for more details. | ||
| 101 | +# | ||
| 102 | +# You should have received a copy of the GNU General Public License | ||
| 103 | +# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| 104 | + | ||
| 105 | +# Please keep lists in this file sorted alphabetically, with one item per line. | ||
| 106 | +# See gdb/Makefile.in for guidelines on ordering files and directories. | ||
| 107 | + | ||
| 108 | +prefix = @prefix@ | ||
| 109 | +exec_prefix = @exec_prefix@ | ||
| 110 | + | ||
| 111 | +host_alias = @host_noncanonical@ | ||
| 112 | +target_alias = @target_noncanonical@ | ||
| 113 | +program_transform_name = @program_transform_name@ | ||
| 114 | +bindir = @bindir@ | ||
| 115 | +libdir = @libdir@ | ||
| 116 | +tooldir = $(libdir)/$(target_alias) | ||
| 117 | + | ||
| 118 | +datarootdir = @datarootdir@ | ||
| 119 | +datadir = @datadir@ | ||
| 120 | +mandir = @mandir@ | ||
| 121 | +man1dir = $(mandir)/man1 | ||
| 122 | +man2dir = $(mandir)/man2 | ||
| 123 | +man3dir = $(mandir)/man3 | ||
| 124 | +man4dir = $(mandir)/man4 | ||
| 125 | +man5dir = $(mandir)/man5 | ||
| 126 | +man6dir = $(mandir)/man6 | ||
| 127 | +man7dir = $(mandir)/man7 | ||
| 128 | +man8dir = $(mandir)/man8 | ||
| 129 | +man9dir = $(mandir)/man9 | ||
| 130 | +infodir = @infodir@ | ||
| 131 | +htmldir = $(prefix)/html | ||
| 132 | +includedir = @includedir@ | ||
| 133 | +CONFIG_SRC_SUBDIR = @CONFIG_SRC_SUBDIR@ | ||
| 134 | + | ||
| 135 | +SHELL = @SHELL@ | ||
| 136 | +EXEEXT = @EXEEXT@ | ||
| 137 | + | ||
| 138 | +INSTALL = @INSTALL@ | ||
| 139 | +INSTALL_PROGRAM = @INSTALL_PROGRAM@ | ||
| 140 | +INSTALL_DATA = @INSTALL_DATA@ | ||
| 141 | +RANLIB = @RANLIB@ | ||
| 142 | + | ||
| 143 | +CC = @CC@ | ||
| 144 | +CXX = @CXX@ | ||
| 145 | +CXX_DIALECT = @CXX_DIALECT@ | ||
| 146 | +AR = @AR@ | ||
| 147 | +AR_FLAGS = rc | ||
| 148 | + | ||
| 149 | +# Dependency tracking information. | ||
| 150 | +DEPMODE = @CCDEPMODE@ | ||
| 151 | +DEPDIR = @DEPDIR@ | ||
| 152 | +depcomp = $(SHELL) $(srcdir)/../../depcomp | ||
| 153 | + | ||
| 154 | +# Directory containing source files. Don't clean up the spacing, | ||
| 155 | +# this exact string is matched for by the "configure" script. | ||
| 156 | +srcdir = @srcdir@ | ||
| 157 | +abs_top_srcdir = @abs_top_srcdir@ | ||
| 158 | +abs_srcdir = @abs_srcdir@ | ||
| 159 | +VPATH = @srcdir@ | ||
| 160 | + | ||
| 161 | +include $(srcdir)/../silent-rules.mk | ||
| 162 | + | ||
| 163 | +# Note that these are overridden by GNU make-specific code below if | ||
| 164 | +# GNU make is used. The overrides implement dependency tracking. | ||
| 165 | +COMPILE.pre = $(CXX) -x c++ $(CXX_DIALECT) | ||
| 166 | +COMPILE.post = -c -o $@ | ||
| 167 | +COMPILE = $(ECHO_CXX) $(COMPILE.pre) $(INTERNAL_CFLAGS) $(COMPILE.post) | ||
| 168 | +POSTCOMPILE = @true | ||
| 169 | + | ||
| 170 | +# It is also possible that you will need to add -I/usr/include/sys to the | ||
| 171 | +# CFLAGS section if your system doesn't have fcntl.h in /usr/include (which | ||
| 172 | +# is where it should be according to Posix). | ||
| 173 | + | ||
| 174 | +# Set this up with gcc if you have gnu ld and the loader will print out | ||
| 175 | +# line numbers for undefinded refs. | ||
| 176 | +#CC_LD = g++ -static | ||
| 177 | +CC_LD = $(CXX) $(CXX_DIALECT) | ||
| 178 | + | ||
| 179 | +# Where is the "include" directory? Traditionally ../include or ./include | ||
| 180 | +INCLUDE_DIR = ${srcdir}/../../include | ||
| 181 | +INCLUDE_DEP = $$(INCLUDE_DIR) | ||
| 182 | + | ||
| 183 | +LIBIBERTY_BUILDDIR = build-libiberty-gdbserver | ||
| 184 | +LIBIBERTY = $(LIBIBERTY_BUILDDIR)/libiberty.a | ||
| 185 | + | ||
| 186 | +# Where is ust? These will be empty if ust was not available. | ||
| 187 | +ustlibs = @ustlibs@ | ||
| 188 | +ustinc = @ustinc@ | ||
| 189 | + | ||
| 190 | +# gnulib | ||
| 191 | +GNULIB_BUILDDIR = build-gnulib-gdbserver | ||
| 192 | +LIBGNU = $(GNULIB_BUILDDIR)/import/libgnu.a | ||
| 193 | +INCGNU = -I$(srcdir)/../../gnulib/import -I$(GNULIB_BUILDDIR)/import | ||
| 194 | + | ||
| 195 | +# Generated headers in the gnulib directory. These must be listed | ||
| 196 | +# so that they are generated before other files are compiled. | ||
| 197 | +GNULIB_H = $(GNULIB_BUILDDIR)/import/string.h @GNULIB_STDINT_H@ | ||
| 198 | + | ||
| 199 | +# All the includes used for CFLAGS and for lint. | ||
| 200 | +# -I. for config files. | ||
| 201 | +# -I${srcdir} for our headers. | ||
| 202 | +# -I$(srcdir)/../regformats for regdef.h. | ||
| 203 | +# | ||
| 204 | +# We do not include ../target or ../nat in here because headers | ||
| 205 | +# in those directories should be included with the subdirectory. | ||
| 206 | +# e.g.: "target/wait.h". | ||
| 207 | +# | ||
| 208 | +INCLUDE_CFLAGS = -I. -I${srcdir} \ | ||
| 209 | + -I$(srcdir)/../regformats -I$(srcdir)/.. -I$(INCLUDE_DIR) \ | ||
| 210 | + $(INCGNU) | ||
| 211 | + | ||
| 212 | +# M{H,T}_CFLAGS, if defined, has host- and target-dependent CFLAGS | ||
| 213 | +# from the config/ directory. | ||
| 214 | +GLOBAL_CFLAGS = ${MT_CFLAGS} ${MH_CFLAGS} | ||
| 215 | +#PROFILE_CFLAGS = -pg | ||
| 216 | + | ||
| 217 | +WARN_CFLAGS = @WARN_CFLAGS@ | ||
| 218 | +WERROR_CFLAGS = @WERROR_CFLAGS@ | ||
| 219 | + | ||
| 220 | +WARN_CFLAGS_NO_FORMAT = `echo " $(WARN_CFLAGS) " \ | ||
| 221 | + | sed "s/ -Wformat-nonliteral / -Wno-format-nonliteral /g"` | ||
| 222 | + | ||
| 223 | +# These are specifically reserved for setting from the command line | ||
| 224 | +# when running make. I.E. "make CFLAGS=-Wmissing-prototypes". | ||
| 225 | +CFLAGS = @CFLAGS@ | ||
| 226 | +CXXFLAGS = @CXXFLAGS@ | ||
| 227 | +CPPFLAGS = @CPPFLAGS@ | ||
| 228 | + | ||
| 229 | +PTHREAD_CFLAGS = @PTHREAD_CFLAGS@ | ||
| 230 | +PTHREAD_LIBS = @PTHREAD_LIBS@ | ||
| 231 | + | ||
| 232 | +# INTERNAL_CFLAGS is the aggregate of all other *CFLAGS macros. | ||
| 233 | +INTERNAL_CFLAGS_BASE = ${CXXFLAGS} ${GLOBAL_CFLAGS} \ | ||
| 234 | + ${PROFILE_CFLAGS} ${INCLUDE_CFLAGS} ${CPPFLAGS} $(PTHREAD_CFLAGS) | ||
| 235 | +INTERNAL_WARN_CFLAGS = ${INTERNAL_CFLAGS_BASE} $(WARN_CFLAGS) | ||
| 236 | +INTERNAL_CFLAGS = ${INTERNAL_WARN_CFLAGS} $(WERROR_CFLAGS) -DGDBSERVER | ||
| 237 | + | ||
| 238 | +# LDFLAGS is specifically reserved for setting from the command line | ||
| 239 | +# when running make. | ||
| 240 | +LDFLAGS = @LDFLAGS@ | ||
| 241 | +INTERNAL_LDFLAGS = $(LDFLAGS) @RDYNAMIC@ | ||
| 242 | + | ||
| 243 | +# All source files that go into linking GDB remote server. | ||
| 244 | + | ||
| 245 | +SFILES = \ | ||
| 246 | + $(srcdir)/debug.c \ | ||
| 247 | + $(srcdir)/dll.c \ | ||
| 248 | + $(srcdir)/gdbreplay.c \ | ||
| 249 | + $(srcdir)/hostio.c \ | ||
| 250 | + $(srcdir)/hostio-errno.c \ | ||
| 251 | + $(srcdir)/i387-fp.c \ | ||
| 252 | + $(srcdir)/inferiors.c \ | ||
| 253 | + $(srcdir)/linux-aarch64-low.c \ | ||
| 254 | + $(srcdir)/linux-arm-low.c \ | ||
| 255 | + $(srcdir)/linux-bfin-low.c \ | ||
| 256 | + $(srcdir)/linux-cris-low.c \ | ||
| 257 | + $(srcdir)/linux-crisv32-low.c \ | ||
| 258 | + $(srcdir)/linux-ia64-low.c \ | ||
| 259 | + $(srcdir)/linux-low.c \ | ||
| 260 | + $(srcdir)/linux-m32r-low.c \ | ||
| 261 | + $(srcdir)/linux-m68k-low.c \ | ||
| 262 | + $(srcdir)/linux-microblaze-low.c \ | ||
| 263 | + $(srcdir)/linux-mips-low.c \ | ||
| 264 | + $(srcdir)/linux-nios2-low.c \ | ||
| 265 | + $(srcdir)/linux-ppc-low.c \ | ||
| 266 | + $(srcdir)/linux-s390-low.c \ | ||
| 267 | + $(srcdir)/linux-sh-low.c \ | ||
| 268 | + $(srcdir)/linux-sparc-low.c \ | ||
| 269 | + $(srcdir)/linux-tile-low.c \ | ||
| 270 | + $(srcdir)/linux-x86-low.c \ | ||
| 271 | + $(srcdir)/linux-xtensa-low.c \ | ||
| 272 | + $(srcdir)/mem-break.c \ | ||
| 273 | + $(srcdir)/proc-service.c \ | ||
| 274 | + $(srcdir)/proc-service.list \ | ||
| 275 | + $(srcdir)/regcache.c \ | ||
| 276 | + $(srcdir)/remote-utils.c \ | ||
| 277 | + $(srcdir)/server.c \ | ||
| 278 | + $(srcdir)/symbol.c \ | ||
| 279 | + $(srcdir)/target.c \ | ||
| 280 | + $(srcdir)/thread-db.c \ | ||
| 281 | + $(srcdir)/utils.c \ | ||
| 282 | + $(srcdir)/win32-arm-low.c \ | ||
| 283 | + $(srcdir)/win32-i386-low.c \ | ||
| 284 | + $(srcdir)/win32-low.c \ | ||
| 285 | + $(srcdir)/wincecompat.c \ | ||
| 286 | + $(srcdir)/x86-low.c \ | ||
| 287 | + $(srcdir)/arch/arm.c \ | ||
| 288 | + $(srcdir)/arch/arm-get-next-pcs.c \ | ||
| 289 | + $(srcdir)/arch/arm-linux.c \ | ||
| 290 | + $(srcdir)/arch/ppc-linux-common.c \ | ||
| 291 | + $(srcdir)/../alloc.c \ | ||
| 292 | + $(srcdir)/gdbsupport/btrace-common.c \ | ||
| 293 | + $(srcdir)/gdbsupport/buffer.c \ | ||
| 294 | + $(srcdir)/gdbsupport/cleanups.c \ | ||
| 295 | + $(srcdir)/gdbsupport/common-debug.c \ | ||
| 296 | + $(srcdir)/gdbsupport/common-exceptions.c \ | ||
| 297 | + $(srcdir)/gdbsupport/common-inferior.c \ | ||
| 298 | + $(srcdir)/gdbsupport/common-regcache.c \ | ||
| 299 | + $(srcdir)/gdbsupport/common-utils.c \ | ||
| 300 | + $(srcdir)/gdbsupport/errors.c \ | ||
| 301 | + $(srcdir)/gdbsupport/environ.c \ | ||
| 302 | + $(srcdir)/gdbsupport/fileio.c \ | ||
| 303 | + $(srcdir)/gdbsupport/filestuff.c \ | ||
| 304 | + $(srcdir)/gdbsupport/job-control.c \ | ||
| 305 | + $(srcdir)/gdbsupport/gdb-dlfcn.c \ | ||
| 306 | + $(srcdir)/gdbsupport/gdb_tilde_expand.c \ | ||
| 307 | + $(srcdir)/gdbsupport/gdb_vecs.c \ | ||
| 308 | + $(srcdir)/gdbsupport/netstuff.c \ | ||
| 309 | + $(srcdir)/gdbsupport/new-op.c \ | ||
| 310 | + $(srcdir)/gdbsupport/pathstuff.c \ | ||
| 311 | + $(srcdir)/gdbsupport/print-utils.c \ | ||
| 312 | + $(srcdir)/gdbsupport/ptid.c \ | ||
| 313 | + $(srcdir)/gdbsupport/rsp-low.c \ | ||
| 314 | + $(srcdir)/gdbsupport/safe-strerror.c \ | ||
| 315 | + $(srcdir)/gdbsupport/tdesc.c \ | ||
| 316 | + $(srcdir)/gdbsupport/xml-utils.c \ | ||
| 317 | + $(srcdir)/nat/aarch64-sve-linux-ptrace.c \ | ||
| 318 | + $(srcdir)/nat/linux-btrace.c \ | ||
| 319 | + $(srcdir)/nat/linux-namespaces.c \ | ||
| 320 | + $(srcdir)/nat/linux-osdata.c \ | ||
| 321 | + $(srcdir)/nat/linux-personality.c \ | ||
| 322 | + $(srcdir)/nat/microblaze-linux.c \ | ||
| 323 | + $(srcdir)/nat/mips-linux-watch.c \ | ||
| 324 | + $(srcdir)/nat/ppc-linux.c \ | ||
| 325 | + $(srcdir)/nat/fork-inferior.c \ | ||
| 326 | + $(srcdir)/target/waitstatus.c | ||
| 327 | + | ||
| 328 | +DEPFILES = @GDBSERVER_DEPFILES@ | ||
| 329 | + | ||
| 330 | +LIBOBJS = @LIBOBJS@ | ||
| 331 | + | ||
| 332 | +SOURCES = $(SFILES) | ||
| 333 | +TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS} | ||
| 334 | + | ||
| 335 | +OBS = \ | ||
| 336 | + alloc.o \ | ||
| 337 | + ax.o \ | ||
| 338 | + gdbsupport/agent.o \ | ||
| 339 | + gdbsupport/btrace-common.o \ | ||
| 340 | + gdbsupport/buffer.o \ | ||
| 341 | + gdbsupport/cleanups.o \ | ||
| 342 | + gdbsupport/common-debug.o \ | ||
| 343 | + gdbsupport/common-exceptions.o \ | ||
| 344 | + gdbsupport/common-inferior.o \ | ||
| 345 | + gdbsupport/job-control.o \ | ||
| 346 | + gdbsupport/common-regcache.o \ | ||
| 347 | + gdbsupport/common-utils.o \ | ||
| 348 | + gdbsupport/errors.o \ | ||
| 349 | + gdbsupport/environ.o \ | ||
| 350 | + gdbsupport/fileio.o \ | ||
| 351 | + gdbsupport/filestuff.o \ | ||
| 352 | + gdbsupport/format.o \ | ||
| 353 | + gdbsupport/gdb-dlfcn.o \ | ||
| 354 | + gdbsupport/gdb_tilde_expand.o \ | ||
| 355 | + gdbsupport/gdb_vecs.o \ | ||
| 356 | + gdbsupport/netstuff.o \ | ||
| 357 | + gdbsupport/new-op.o \ | ||
| 358 | + gdbsupport/pathstuff.o \ | ||
| 359 | + gdbsupport/print-utils.o \ | ||
| 360 | + gdbsupport/ptid.o \ | ||
| 361 | + gdbsupport/rsp-low.o \ | ||
| 362 | + gdbsupport/safe-strerror.o \ | ||
| 363 | + gdbsupport/signals.o \ | ||
| 364 | + gdbsupport/signals-state-save-restore.o \ | ||
| 365 | + gdbsupport/tdesc.o \ | ||
| 366 | + gdbsupport/xml-utils.o \ | ||
| 367 | + debug.o \ | ||
| 368 | + dll.o \ | ||
| 369 | + event-loop.o \ | ||
| 370 | + hostio.o \ | ||
| 371 | + inferiors.o \ | ||
| 372 | + mem-break.o \ | ||
| 373 | + notif.o \ | ||
| 374 | + regcache.o \ | ||
| 375 | + remote-utils.o \ | ||
| 376 | + server.o \ | ||
| 377 | + symbol.o \ | ||
| 378 | + target.o \ | ||
| 379 | + tdesc.o \ | ||
| 380 | + tracepoint.o \ | ||
| 381 | + utils.o \ | ||
| 382 | + version.o \ | ||
| 383 | + waitstatus.o \ | ||
| 384 | + $(DEPFILES) \ | ||
| 385 | + $(LIBOBJS) \ | ||
| 386 | + $(XML_BUILTIN) | ||
| 387 | + | ||
| 388 | +GDBREPLAY_OBS = \ | ||
| 389 | + gdbsupport/cleanups.o \ | ||
| 390 | + gdbsupport/common-exceptions.o \ | ||
| 391 | + gdbsupport/common-utils.o \ | ||
| 392 | + gdbsupport/rsp-low.o \ | ||
| 393 | + gdbsupport/errors.o \ | ||
| 394 | + gdbsupport/netstuff.o \ | ||
| 395 | + gdbsupport/print-utils.o \ | ||
| 396 | + gdbsupport/safe-strerror.o \ | ||
| 397 | + gdbreplay.o \ | ||
| 398 | + utils.o \ | ||
| 399 | + version.o | ||
| 400 | + | ||
| 401 | +GDBSERVER_LIBS = @GDBSERVER_LIBS@ $(PTHREAD_LIBS) | ||
| 402 | +XM_CLIBS = @LIBS@ | ||
| 403 | +CDEPS = $(srcdir)/proc-service.list | ||
| 404 | + | ||
| 405 | +# XML files to compile in to gdbserver, if any. | ||
| 406 | +XML_DIR = $(srcdir)/../features | ||
| 407 | +XML_FILES = @srv_xmlfiles@ | ||
| 408 | +XML_BUILTIN = @srv_xmlbuiltin@ | ||
| 409 | + | ||
| 410 | +IPA_DEPFILES = @IPA_DEPFILES@ | ||
| 411 | +extra_libraries = @extra_libraries@ | ||
| 412 | + | ||
| 413 | +SUBDIRS = $(GNULIB_BUILDDIR) $(LIBIBERTY_BUILDDIR) | ||
| 414 | +CLEANDIRS = $(SUBDIRS) | ||
| 415 | + | ||
| 416 | +# List of subdirectories in the build tree that must exist. | ||
| 417 | +# This is used to force build failures in existing trees when | ||
| 418 | +# a new directory is added. | ||
| 419 | +# The format here is for the `case' shell command. | ||
| 420 | +REQUIRED_SUBDIRS = $(GNULIB_BUILDDIR) | $(LIBIBERTY_BUILDDIR) | ||
| 421 | + | ||
| 422 | +FLAGS_TO_PASS = \ | ||
| 423 | + "prefix=$(prefix)" \ | ||
| 424 | + "exec_prefix=$(exec_prefix)" \ | ||
| 425 | + "infodir=$(infodir)" \ | ||
| 426 | + "datarootdir=$(datarootdir)" \ | ||
| 427 | + "docdir=$(docdir)" \ | ||
| 428 | + "htmldir=$(htmldir)" \ | ||
| 429 | + "pdfdir=$(pdfdir)" \ | ||
| 430 | + "libdir=$(libdir)" \ | ||
| 431 | + "mandir=$(mandir)" \ | ||
| 432 | + "datadir=$(datadir)" \ | ||
| 433 | + "includedir=$(includedir)" \ | ||
| 434 | + "against=$(against)" \ | ||
| 435 | + "DESTDIR=$(DESTDIR)" \ | ||
| 436 | + "AR=$(AR)" \ | ||
| 437 | + "AR_FLAGS=$(AR_FLAGS)" \ | ||
| 438 | + "CC=$(CC)" \ | ||
| 439 | + "CFLAGS=$(CFLAGS)" \ | ||
| 440 | + "CXX=$(CXX)" \ | ||
| 441 | + "CXXFLAGS=$(CXXFLAGS)" \ | ||
| 442 | + "DLLTOOL=$(DLLTOOL)" \ | ||
| 443 | + "LDFLAGS=$(LDFLAGS)" \ | ||
| 444 | + "RANLIB=$(RANLIB)" \ | ||
| 445 | + "MAKEINFO=$(MAKEINFO)" \ | ||
| 446 | + "MAKEHTML=$(MAKEHTML)" \ | ||
| 447 | + "MAKEHTMLFLAGS=$(MAKEHTMLFLAGS)" \ | ||
| 448 | + "INSTALL=$(INSTALL)" \ | ||
| 449 | + "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \ | ||
| 450 | + "INSTALL_DATA=$(INSTALL_DATA)" \ | ||
| 451 | + "RUNTEST=$(RUNTEST)" \ | ||
| 452 | + "RUNTESTFLAGS=$(RUNTESTFLAGS)" | ||
| 453 | + | ||
| 454 | +# All generated files which can be included by another file. | ||
| 455 | +generated_files = config.h $(GNULIB_H) | ||
| 456 | + | ||
| 457 | +all: gdbserver$(EXEEXT) gdbreplay$(EXEEXT) $(extra_libraries) | ||
| 458 | + @$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do | ||
| 459 | + | ||
| 460 | +# Traditionally "install" depends on "all". But it may be useful | ||
| 461 | +# not to; for example, if the user has made some trivial change to a | ||
| 462 | +# source file and doesn't care about rebuilding or just wants to save the | ||
| 463 | +# time it takes for make to check that all is up to date. | ||
| 464 | +# install-only is intended to address that need. | ||
| 465 | +install: all | ||
| 466 | + @$(MAKE) $(FLAGS_TO_PASS) install-only | ||
| 467 | + | ||
| 468 | +install-only: | ||
| 469 | + n=`echo gdbserver | sed '$(program_transform_name)'`; \ | ||
| 470 | + if [ x$$n = x ]; then n=gdbserver; else true; fi; \ | ||
| 471 | + if [ x"$(IPA_DEPFILES)" != x ]; then \ | ||
| 472 | + $(SHELL) $(srcdir)/../../mkinstalldirs $(DESTDIR)$(libdir); \ | ||
| 473 | + $(INSTALL_PROGRAM) $(IPA_LIB) $(DESTDIR)$(libdir)/$(IPA_LIB); \ | ||
| 474 | + fi; \ | ||
| 475 | + $(SHELL) $(srcdir)/../../mkinstalldirs $(DESTDIR)$(bindir); \ | ||
| 476 | + $(INSTALL_PROGRAM) gdbserver$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT) | ||
| 477 | + # Note that we run install and not install-only, as the latter | ||
| 478 | + # is not part of GNU standards and in particular not provided | ||
| 479 | + # in libiberty. | ||
| 480 | + @$(MAKE) $(FLAGS_TO_PASS) DO=install "DODIRS=$(SUBDIRS)" subdir_do | ||
| 481 | + | ||
| 482 | +uninstall: force | ||
| 483 | + n=`echo gdbserver | sed '$(program_transform_name)'`; \ | ||
| 484 | + if [ x$$n = x ]; then n=gdbserver; else true; fi; \ | ||
| 485 | + rm -f $(DESTDIR)/$(bindir)/$$n$(EXEEXT) $(DESTDIR)$(man1dir)/$$n.1 | ||
| 486 | + @$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do | ||
| 487 | + | ||
| 488 | +installcheck: | ||
| 489 | +check: | ||
| 490 | +info dvi pdf: | ||
| 491 | +install-info: | ||
| 492 | +install-pdf: | ||
| 493 | +html: | ||
| 494 | +install-html: | ||
| 495 | +clean-info: force | ||
| 496 | + @$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do | ||
| 497 | + | ||
| 498 | +gdbserver$(EXEEXT): $(sort $(OBS)) ${CDEPS} $(LIBGNU) $(LIBIBERTY) | ||
| 499 | + $(SILENCE) rm -f gdbserver$(EXEEXT) | ||
| 500 | + $(ECHO_CXXLD) $(CC_LD) $(INTERNAL_CFLAGS) $(INTERNAL_LDFLAGS) \ | ||
| 501 | + -o gdbserver$(EXEEXT) $(OBS) $(LIBGNU) $(LIBIBERTY) \ | ||
| 502 | + $(GDBSERVER_LIBS) $(XM_CLIBS) | ||
| 503 | + | ||
| 504 | +$(LIBGNU) $(LIBIBERTY) $(GNULIB_H): all-lib | ||
| 505 | +all-lib: $(GNULIB_BUILDDIR)/Makefile $(LIBIBERTY_BUILDDIR)/Makefile | ||
| 506 | + @$(MAKE) $(FLAGS_TO_PASS) DO=all DODIRS="$(SUBDIRS)" subdir_do | ||
| 507 | +.PHONY: all-lib | ||
| 508 | + | ||
| 509 | +gdbreplay$(EXEEXT): $(sort $(GDBREPLAY_OBS)) $(LIBGNU) $(LIBIBERTY) | ||
| 510 | + $(SILENCE) rm -f gdbreplay$(EXEEXT) | ||
| 511 | + $(ECHO_CXXLD) $(CC_LD) $(INTERNAL_CFLAGS) $(INTERNAL_LDFLAGS) \ | ||
| 512 | + -o gdbreplay$(EXEEXT) $(GDBREPLAY_OBS) $(XM_CLIBS) $(LIBGNU) \ | ||
| 513 | + $(LIBIBERTY) | ||
| 514 | + | ||
| 515 | +IPA_OBJS = \ | ||
| 516 | + alloc-ipa.o \ | ||
| 517 | + ax-ipa.o \ | ||
| 518 | + gdbsupport/common-utils-ipa.o \ | ||
| 519 | + gdbsupport/errors-ipa.o \ | ||
| 520 | + gdbsupport/format-ipa.o \ | ||
| 521 | + gdbsupport/print-utils-ipa.o \ | ||
| 522 | + gdbsupport/rsp-low-ipa.o \ | ||
| 523 | + gdbsupport/safe-strerror-ipa.o \ | ||
| 524 | + gdbsupport/tdesc-ipa.o \ | ||
| 525 | + regcache-ipa.o \ | ||
| 526 | + remote-utils-ipa.o \ | ||
| 527 | + tdesc-ipa.o \ | ||
| 528 | + tracepoint-ipa.o \ | ||
| 529 | + utils-ipa.o \ | ||
| 530 | + ${IPA_DEPFILES} | ||
| 531 | + | ||
| 532 | +IPA_LIB = libinproctrace.so | ||
| 533 | + | ||
| 534 | +$(IPA_LIB): $(sort $(IPA_OBJS)) ${CDEPS} | ||
| 535 | + $(SILENCE) rm -f $(IPA_LIB) | ||
| 536 | + $(ECHO_CXXLD) $(CC_LD) -shared -fPIC -Wl,--soname=$(IPA_LIB) \ | ||
| 537 | + -Wl,--no-undefined $(INTERNAL_CFLAGS) $(INTERNAL_LDFLAGS) \ | ||
| 538 | + -o $(IPA_LIB) ${IPA_OBJS} -ldl -pthread | ||
| 539 | + | ||
| 540 | +# Put the proper machine-specific files first, so M-. on a machine | ||
| 541 | +# specific routine gets the one for the correct machine. | ||
| 542 | +# The xyzzy stuff below deals with empty DEPFILES | ||
| 543 | +TAGS: ${TAGFILES} | ||
| 544 | + etags `find ${srcdir}/../config -name $(DEPRECATED_TM_FILE) -print` \ | ||
| 545 | + `find ${srcdir}/../config -name ${XM_FILE} -print` \ | ||
| 546 | + `find ${srcdir}/../config -name ${NAT_FILE} -print` \ | ||
| 547 | + `for i in yzzy ${DEPFILES}; do \ | ||
| 548 | + if [ x$$i != xyzzy ]; then \ | ||
| 549 | + echo ${srcdir}/$$i | sed -e 's/\.o$$/\.c/' ; \ | ||
| 550 | + fi; \ | ||
| 551 | + done` \ | ||
| 552 | + ${TAGFILES} | ||
| 553 | +tags: TAGS | ||
| 554 | + | ||
| 555 | +clean: | ||
| 556 | + rm -f *.o ${ADD_FILES} *~ | ||
| 557 | + rm -f gdbserver$(EXEEXT) gdbreplay$(EXEEXT) core make.log | ||
| 558 | + rm -f $(IPA_LIB) | ||
| 559 | + rm -f *-generated.c | ||
| 560 | + rm -f stamp-xml | ||
| 561 | + rm -f $(DEPDIR)/*.Po | ||
| 562 | + for i in $(CONFIG_SRC_SUBDIR); do \ | ||
| 563 | + rm -f $$i/*.o; \ | ||
| 564 | + rm -f $$i/$(DEPDIR)/*; \ | ||
| 565 | + done | ||
| 566 | + @$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do | ||
| 567 | + | ||
| 568 | +maintainer-clean realclean distclean: clean | ||
| 569 | + @$(MAKE) $(FLAGS_TO_PASS) DO=$@ "DODIRS=$(SUBDIRS)" subdir_do | ||
| 570 | + rm -rf $(GNULIB_BUILDDIR) | ||
| 571 | + rm -f Makefile config.status config.h stamp-h config.log | ||
| 572 | + rm -f Makefile | ||
| 573 | + for i in $(CONFIG_SRC_SUBDIR); do \ | ||
| 574 | + rmdir $$i/$(DEPDIR); \ | ||
| 575 | + done | ||
| 576 | + | ||
| 577 | +subdir_do: force | ||
| 578 | + @for i in $(DODIRS); do \ | ||
| 579 | + case $$i in \ | ||
| 580 | + $(REQUIRED_SUBDIRS)) \ | ||
| 581 | + if [ ! -f ./$$i/Makefile ] ; then \ | ||
| 582 | + echo "Missing $$i/Makefile" >&2 ; \ | ||
| 583 | + exit 1 ; \ | ||
| 584 | + fi ;; \ | ||
| 585 | + esac ; \ | ||
| 586 | + if [ -f ./$$i/Makefile ] ; then \ | ||
| 587 | + if (cd ./$$i; \ | ||
| 588 | + $(MAKE) $(FLAGS_TO_PASS) $(DO)) ; then true ; \ | ||
| 589 | + else exit 1 ; fi ; \ | ||
| 590 | + else true ; fi ; \ | ||
| 591 | + done | ||
| 592 | + | ||
| 593 | +config.h: stamp-h ; @true | ||
| 594 | +stamp-h: config.in config.status | ||
| 595 | + $(SHELL) ./config.status config.h | ||
| 596 | + | ||
| 597 | +Makefile: Makefile.in config.status | ||
| 598 | + $(SHELL) ./config.status $@ | ||
| 599 | + | ||
| 600 | +$(GNULIB_BUILDDIR)/Makefile: $(srcdir)/../../gnulib/Makefile.in config.status | ||
| 601 | + @cd $(GNULIB_BUILDDIR); CONFIG_FILES="Makefile" \ | ||
| 602 | + CONFIG_COMMANDS="depfiles" \ | ||
| 603 | + CONFIG_HEADERS= \ | ||
| 604 | + CONFIG_LINKS= \ | ||
| 605 | + $(SHELL) config.status | ||
| 606 | + | ||
| 607 | +config.status: configure configure.srv $(srcdir)/../../bfd/development.sh | ||
| 608 | + $(SHELL) ./config.status --recheck | ||
| 609 | + | ||
| 610 | +# automatic rebuilding in automake-generated Makefiles requires | ||
| 611 | +# this rule in the toplevel Makefile, which, with GNU make, causes | ||
| 612 | +# the desired updates through the implicit regeneration of the Makefile | ||
| 613 | +# and all of its prerequisites. | ||
| 614 | +am--refresh: | ||
| 615 | + @: | ||
| 616 | + | ||
| 617 | +force: | ||
| 618 | + | ||
| 619 | +version-generated.c: Makefile $(srcdir)/../version.in $(srcdir)/../../bfd/version.h $(srcdir)/../gdbsupport/create-version.sh | ||
| 620 | + $(ECHO_GEN) $(SHELL) $(srcdir)/../gdbsupport/create-version.sh $(srcdir)/.. \ | ||
| 621 | + $(host_alias) $(target_alias) $@ | ||
| 622 | + | ||
| 623 | +xml-builtin-generated.c: stamp-xml; @true | ||
| 624 | +stamp-xml: $(XML_DIR)/feature_to_c.sh Makefile $(XML_FILES) | ||
| 625 | + $(SILENCE) rm -f xml-builtin.tmp | ||
| 626 | + $(ECHO_GEN_XML_BUILTIN_GENERATED) $(SHELL) $(XML_DIR)/feature_to_c.sh \ | ||
| 627 | + xml-builtin.tmp $(XML_FILES) | ||
| 628 | + $(SILENCE) $(SHELL) $(srcdir)/../../move-if-change xml-builtin.tmp xml-builtin-generated.c | ||
| 629 | + $(SILENCE) echo stamp > stamp-xml | ||
| 630 | + | ||
| 631 | +.PRECIOUS: xml-builtin.c | ||
| 632 | + | ||
| 633 | +# GNU Make has an annoying habit of putting *all* the Makefile variables | ||
| 634 | +# into the environment, unless you include this target as a circumvention. | ||
| 635 | +# Rumor is that this will be fixed (and this target can be removed) | ||
| 636 | +# in GNU Make 4.0. | ||
| 637 | +.NOEXPORT: | ||
| 638 | + | ||
| 639 | +# GNU Make 3.63 has a different problem: it keeps tacking command line | ||
| 640 | +# overrides onto the definition of $(MAKE). This variable setting | ||
| 641 | +# will remove them. | ||
| 642 | +MAKEOVERRIDES = | ||
| 643 | + | ||
| 644 | +regdat_sh = $(srcdir)/../regformats/regdat.sh | ||
| 645 | + | ||
| 646 | +UST_CFLAGS = $(ustinc) -DCONFIG_UST_GDB_INTEGRATION | ||
| 647 | + | ||
| 648 | +# Undo gnulib replacements for the IPA shared library build. | ||
| 649 | +# The gnulib headers are still needed, but gnulib is not linked | ||
| 650 | +# into the IPA lib so replacement apis don't work. | ||
| 651 | +UNDO_GNULIB_CFLAGS = -Drpl_strerror_r=strerror_r | ||
| 652 | + | ||
| 653 | +# Note, we only build the IPA if -fvisibility=hidden is supported in | ||
| 654 | +# the first place. | ||
| 655 | +IPAGENT_CFLAGS = $(INTERNAL_CFLAGS) $(UST_CFLAGS) \ | ||
| 656 | + $(UNDO_GNULIB_CFLAGS) \ | ||
| 657 | + -fPIC -DIN_PROCESS_AGENT \ | ||
| 658 | + -fvisibility=hidden | ||
| 659 | + | ||
| 660 | +IPAGENT_COMPILE = $(ECHO_CXX) $(COMPILE.pre) $(IPAGENT_CFLAGS) $(COMPILE.post) | ||
| 661 | + | ||
| 662 | +# Rules for special cases. | ||
| 663 | + | ||
| 664 | +ax-ipa.o: ax.c | ||
| 665 | + $(IPAGENT_COMPILE) $(WARN_CFLAGS_NO_FORMAT) $< | ||
| 666 | + $(POSTCOMPILE) | ||
| 667 | + | ||
| 668 | +ax.o: ax.c | ||
| 669 | + $(COMPILE) $(WARN_CFLAGS_NO_FORMAT) $< | ||
| 670 | + $(POSTCOMPILE) | ||
| 671 | + | ||
| 672 | +alloc-ipa.o: ../alloc.c | ||
| 673 | + $(IPAGENT_COMPILE) $(WARN_CFLAGS_NO_FORMAT) $< | ||
| 674 | + $(POSTCOMPILE) | ||
| 675 | + | ||
| 676 | +# Rules for objects that go in the in-process agent. | ||
| 677 | + | ||
| 678 | +arch/%-ipa.o: ../arch/%.c | ||
| 679 | + $(IPAGENT_COMPILE) $< | ||
| 680 | + $(POSTCOMPILE) | ||
| 681 | + | ||
| 682 | +gdbsupport/%-ipa.o: ../gdbsupport/%.c | ||
| 683 | + $(IPAGENT_COMPILE) $< | ||
| 684 | + $(POSTCOMPILE) | ||
| 685 | + | ||
| 686 | +%-ipa.o: %-generated.c | ||
| 687 | + $(IPAGENT_COMPILE) $< | ||
| 688 | + $(POSTCOMPILE) | ||
| 689 | + | ||
| 690 | +%-ipa.o: %.c | ||
| 691 | + $(IPAGENT_COMPILE) $< | ||
| 692 | + $(POSTCOMPILE) | ||
| 693 | + | ||
| 694 | +# Note: Between two matching pattern rules, GNU Make 3.81 chooses the first one. | ||
| 695 | +# Therefore, this one needs to be before "%.o: %.c" for it to be considered for | ||
| 696 | +# files such as linux-amd64-ipa.o generated from linux-amd64-ipa.c. | ||
| 697 | +# | ||
| 698 | +# Later versions of GNU Make choose the rule with the shortest stem, so it would | ||
| 699 | +# work in any order. | ||
| 700 | + | ||
| 701 | +%-ipa.o: %-ipa.c | ||
| 702 | + $(IPAGENT_COMPILE) $< | ||
| 703 | + $(POSTCOMPILE) | ||
| 704 | + | ||
| 705 | +# Rules for objects that go in the gdbserver binary. | ||
| 706 | + | ||
| 707 | +arch/%.o: ../arch/%.c | ||
| 708 | + $(COMPILE) $< | ||
| 709 | + $(POSTCOMPILE) | ||
| 710 | + | ||
| 711 | +gdbsupport/%.o: ../gdbsupport/%.c | ||
| 712 | + $(COMPILE) $< | ||
| 713 | + $(POSTCOMPILE) | ||
| 714 | + | ||
| 715 | +%.o: %-generated.c | ||
| 716 | + $(COMPILE) $< | ||
| 717 | + $(POSTCOMPILE) | ||
| 718 | + | ||
| 719 | +%.o: %.c | ||
| 720 | + $(COMPILE) $< | ||
| 721 | + $(POSTCOMPILE) | ||
| 722 | + | ||
| 723 | +%.o: ../nat/%.c | ||
| 724 | + $(COMPILE) $< | ||
| 725 | + $(POSTCOMPILE) | ||
| 726 | + | ||
| 727 | +%.o: ../target/%.c | ||
| 728 | + $(COMPILE) $< | ||
| 729 | + $(POSTCOMPILE) | ||
| 730 | + | ||
| 731 | +%.o: ../%.c | ||
| 732 | + $(COMPILE) $< | ||
| 733 | + $(POSTCOMPILE) | ||
| 734 | + | ||
| 735 | +# Rules for register format descriptions. Suffix destination files with | ||
| 736 | +# -generated to identify and clean them easily. | ||
| 737 | + | ||
| 738 | +%-generated.c: ../regformats/%.dat | $(regdat_sh) | ||
| 739 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
| 740 | + | ||
| 741 | +%-generated.c: ../regformats/arm/%.dat | $(regdat_sh) | ||
| 742 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
| 743 | + | ||
| 744 | +%-generated.c: ../regformats/i386/%.dat | $(regdat_sh) | ||
| 745 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
| 746 | + | ||
| 747 | +%-generated.c: ../regformats/rs6000/%.dat | $(regdat_sh) | ||
| 748 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
| 749 | +microblaze-linux.c : $(srcdir)/../regformats/reg-microblaze.dat $(regdat_sh) | ||
| 750 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-microblaze.dat microblaze-linux.c | ||
| 751 | + | ||
| 752 | +# | ||
| 753 | +# Dependency tracking. | ||
| 754 | +# | ||
| 755 | + | ||
| 756 | +ifeq ($(DEPMODE),depmode=gcc3) | ||
| 757 | +# Note that we put the dependencies into a .Tpo file, then move them | ||
| 758 | +# into place if the compile succeeds. We need this because gcc does | ||
| 759 | +# not atomically write the dependency output file. | ||
| 760 | +override COMPILE.post = -c -o $@ -MT $@ -MMD -MP \ | ||
| 761 | + -MF $(@D)/$(DEPDIR)/$(basename $(@F)).Tpo | ||
| 762 | +override POSTCOMPILE = @mv $(@D)/$(DEPDIR)/$(basename $(@F)).Tpo \ | ||
| 763 | + $(@D)/$(DEPDIR)/$(basename $(@F)).Po | ||
| 764 | +else | ||
| 765 | +override COMPILE.pre = source='$<' object='$@' libtool=no \ | ||
| 766 | + DEPDIR=$(DEPDIR) $(DEPMODE) $(depcomp) \ | ||
| 767 | + $(CXX) -x c++ $(CXX_DIALECT) | ||
| 768 | +# depcomp handles atomicity for us, so we don't need a postcompile | ||
| 769 | +# step. | ||
| 770 | +override POSTCOMPILE = | ||
| 771 | +endif | ||
| 772 | + | ||
| 773 | +# A list of all the objects we might care about in this build, for | ||
| 774 | +# dependency tracking. | ||
| 775 | +all_object_files = $(OBS) $(GDBREPLAY_OBS) $(IPA_OBJS) | ||
| 776 | + | ||
| 777 | +# Ensure that generated files are created early. Use order-only | ||
| 778 | +# dependencies if available. They require GNU make 3.80 or newer, | ||
| 779 | +# and the .VARIABLES variable was introduced at the same time. | ||
| 780 | +ifdef .VARIABLES | ||
| 781 | +$(all_object_files): | $(generated_files) | ||
| 782 | +else | ||
| 783 | +$(all_object_files) : $(generated_files) | ||
| 784 | +endif | ||
| 785 | + | ||
| 786 | +# All the .deps files to include. | ||
| 787 | +all_deps_files = $(foreach dep,$(patsubst %.o,%.Po,$(all_object_files)),\ | ||
| 788 | + $(dir $(dep))/$(DEPDIR)/$(notdir $(dep))) | ||
| 789 | + | ||
| 790 | +# Dependencies. | ||
| 791 | +-include $(all_deps_files) | ||
| 792 | + | ||
| 793 | +# Disable implicit make rules. | ||
| 794 | +include $(srcdir)/../disable-implicit-rules.mk | ||
| 795 | + | ||
| 796 | +# Do not delete intermediate files (e.g. *-generated.c). | ||
| 797 | +.SECONDARY: | ||
| 798 | + | ||
| 799 | +# This is the end of "Makefile.in". | ||
| 800 | diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv | ||
| 801 | new file mode 100644 | ||
| 802 | index 00000000000..e0d2b2fe04a | ||
| 803 | --- /dev/null | ||
| 804 | +++ b/gdb/gdbserver/configure.srv | ||
| 805 | @@ -0,0 +1,398 @@ | ||
| 806 | +# Mappings from configuration triplets to gdbserver build options. | ||
| 807 | +# This is invoked from the autoconf-generated configure script, to | ||
| 808 | +# produce the appropriate Makefile substitutions. | ||
| 809 | + | ||
| 810 | +# This file sets the following shell variables: | ||
| 811 | +# srv_regobj The register protocol appropriate for this target. | ||
| 812 | +# srv_tgtobj Any other target-specific modules appropriate | ||
| 813 | +# for this target. | ||
| 814 | +# srv_hostio_err The object implementing the hostio_last_error | ||
| 815 | +# target method. | ||
| 816 | +# srv_xmlfiles All XML files which should be available for | ||
| 817 | +# gdbserver in this configuration. | ||
| 818 | +# ipa_obj Any other target-specific modules appropriate | ||
| 819 | +# for this target's in-process agent. | ||
| 820 | +# | ||
| 821 | +# In addition, on GNU/Linux the following shell variables will be set: | ||
| 822 | +# srv_linux_regsets Set to "yes" if ptrace(PTRACE_GETREGS) and friends | ||
| 823 | +# may be available on this platform; unset otherwise. | ||
| 824 | +# They will only be used if <sys/ptrace.h> defines | ||
| 825 | +# PTRACE_GETREGS. | ||
| 826 | +# srv_linux_usrregs Set to "yes" if we can get at registers via | ||
| 827 | +# PTRACE_PEEKUSR / PTRACE_POKEUSR. | ||
| 828 | + | ||
| 829 | +# Default hostio_last_error implementation | ||
| 830 | +srv_hostio_err_objs="hostio-errno.o" | ||
| 831 | + | ||
| 832 | +ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-isa207-htm-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o powerpc-isa207-htm-vsx64l-ipa.o" | ||
| 833 | + | ||
| 834 | +# Linux object files. This is so we don't have to repeat | ||
| 835 | +# these files over and over again. | ||
| 836 | +srv_linux_obj="linux-low.o linux-osdata.o linux-procfs.o linux-ptrace.o linux-waitpid.o linux-personality.o linux-namespaces.o fork-child.o fork-inferior.o" | ||
| 837 | + | ||
| 838 | +# Input is taken from the "${target}" variable. | ||
| 839 | + | ||
| 840 | +case "${target}" in | ||
| 841 | + aarch64*-*-linux*) srv_tgtobj="linux-aarch64-low.o aarch64-linux-hw-point.o" | ||
| 842 | + srv_tgtobj="$srv_tgtobj linux-aarch32-low.o" | ||
| 843 | + srv_tgtobj="$srv_tgtobj linux-aarch32-tdesc.o" | ||
| 844 | + srv_tgtobj="${srv_tgtobj} arch/aarch32.o" | ||
| 845 | + srv_tgtobj="${srv_tgtobj} arch/arm.o" | ||
| 846 | + srv_tgtobj="$srv_tgtobj aarch64-linux.o" | ||
| 847 | + srv_tgtobj="$srv_tgtobj arch/aarch64-insn.o" | ||
| 848 | + srv_tgtobj="$srv_tgtobj arch/aarch64.o" | ||
| 849 | + srv_tgtobj="$srv_tgtobj linux-aarch64-tdesc.o" | ||
| 850 | + srv_tgtobj="$srv_tgtobj aarch64-sve-linux-ptrace.o" | ||
| 851 | + srv_tgtobj="${srv_tgtobj} $srv_linux_obj" | ||
| 852 | + srv_linux_regsets=yes | ||
| 853 | + srv_linux_thread_db=yes | ||
| 854 | + ipa_obj="linux-aarch64-ipa.o" | ||
| 855 | + ipa_obj="${ipa_obj} linux-aarch64-tdesc-ipa.o" | ||
| 856 | + ipa_obj="${ipa_obj} arch/aarch64-ipa.o" | ||
| 857 | + ;; | ||
| 858 | + arm*-*-linux*) srv_tgtobj="$srv_linux_obj linux-arm-low.o" | ||
| 859 | + srv_tgtobj="$srv_tgtobj linux-arm-tdesc.o" | ||
| 860 | + srv_tgtobj="$srv_tgtobj linux-aarch32-low.o" | ||
| 861 | + srv_tgtobj="$srv_tgtobj linux-aarch32-tdesc.o" | ||
| 862 | + srv_tgtobj="${srv_tgtobj} arch/aarch32.o" | ||
| 863 | + srv_tgtobj="${srv_tgtobj} arch/arm.o" | ||
| 864 | + srv_tgtobj="${srv_tgtobj} arch/arm-linux.o" | ||
| 865 | + srv_tgtobj="${srv_tgtobj} arch/arm-get-next-pcs.o" | ||
| 866 | + srv_linux_usrregs=yes | ||
| 867 | + srv_linux_regsets=yes | ||
| 868 | + srv_linux_thread_db=yes | ||
| 869 | + ;; | ||
| 870 | + arm*-*-mingw32ce*) srv_regobj=reg-arm.o | ||
| 871 | + srv_tgtobj="win32-low.o win32-arm-low.o" | ||
| 872 | + srv_tgtobj="${srv_tgtobj} wincecompat.o" | ||
| 873 | + # hostio_last_error implementation is in win32-low.c | ||
| 874 | + srv_hostio_err_objs="" | ||
| 875 | + srv_mingw=yes | ||
| 876 | + srv_mingwce=yes | ||
| 877 | + ;; | ||
| 878 | + bfin-*-*linux*) srv_regobj=reg-bfin.o | ||
| 879 | + srv_tgtobj="$srv_linux_obj linux-bfin-low.o" | ||
| 880 | + srv_linux_usrregs=yes | ||
| 881 | + srv_linux_thread_db=yes | ||
| 882 | + ;; | ||
| 883 | + crisv32-*-linux*) srv_regobj=reg-crisv32.o | ||
| 884 | + srv_tgtobj="$srv_linux_obj linux-crisv32-low.o" | ||
| 885 | + srv_linux_regsets=yes | ||
| 886 | + srv_linux_thread_db=yes | ||
| 887 | + ;; | ||
| 888 | + cris-*-linux*) srv_regobj=reg-cris.o | ||
| 889 | + srv_tgtobj="$srv_linux_obj linux-cris-low.o" | ||
| 890 | + srv_linux_usrregs=yes | ||
| 891 | + srv_linux_thread_db=yes | ||
| 892 | + ;; | ||
| 893 | + i[34567]86-*-cygwin*) srv_regobj="" | ||
| 894 | + srv_tgtobj="x86-low.o x86-dregs.o win32-low.o win32-i386-low.o" | ||
| 895 | + srv_tgtobj="${srv_tgtobj} arch/i386.o" | ||
| 896 | + ;; | ||
| 897 | + i[34567]86-*-linux*) srv_tgtobj="${srv_tgtobj} arch/i386.o" | ||
| 898 | + srv_tgtobj="${srv_tgtobj} $srv_linux_obj linux-x86-low.o x86-low.o x86-dregs.o i387-fp.o" | ||
| 899 | + srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o" | ||
| 900 | + srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o" | ||
| 901 | + srv_tgtobj="${srv_tgtobj} x86-linux-dregs.o" | ||
| 902 | + srv_linux_usrregs=yes | ||
| 903 | + srv_linux_regsets=yes | ||
| 904 | + srv_linux_thread_db=yes | ||
| 905 | + srv_linux_btrace=yes | ||
| 906 | + ipa_obj="linux-i386-ipa.o linux-x86-tdesc-ipa.o" | ||
| 907 | + ipa_obj="${ipa_obj} arch/i386-ipa.o" | ||
| 908 | + ;; | ||
| 909 | + i[34567]86-*-lynxos*) srv_regobj="" | ||
| 910 | + srv_tgtobj="lynx-low.o lynx-i386-low.o fork-child.o fork-inferior.o" | ||
| 911 | + srv_tgtobj="${srv_tgtobj} arch/i386.o" | ||
| 912 | + srv_lynxos=yes | ||
| 913 | + ;; | ||
| 914 | + i[34567]86-*-mingw32ce*) | ||
| 915 | + srv_regobj="" | ||
| 916 | + srv_tgtobj="x86-low.o x86-dregs.o win32-low.o win32-i386-low.o" | ||
| 917 | + srv_tgtobj="${srv_tgtobj} arch/i386.o" | ||
| 918 | + srv_tgtobj="${srv_tgtobj} wincecompat.o" | ||
| 919 | + # hostio_last_error implementation is in win32-low.c | ||
| 920 | + srv_hostio_err_objs="" | ||
| 921 | + srv_mingw=yes | ||
| 922 | + srv_mingwce=yes | ||
| 923 | + ;; | ||
| 924 | + i[34567]86-*-mingw*) srv_regobj="" | ||
| 925 | + srv_tgtobj="x86-low.o x86-dregs.o win32-low.o win32-i386-low.o" | ||
| 926 | + srv_tgtobj="${srv_tgtobj} arch/i386.o" | ||
| 927 | + srv_mingw=yes | ||
| 928 | + ;; | ||
| 929 | + i[34567]86-*-nto*) srv_regobj="" | ||
| 930 | + srv_tgtobj="nto-low.o nto-x86-low.o arch/i386.o" | ||
| 931 | + srv_qnx="yes" | ||
| 932 | + ;; | ||
| 933 | + ia64-*-linux*) srv_regobj=reg-ia64.o | ||
| 934 | + srv_tgtobj="$srv_linux_obj linux-ia64-low.o" | ||
| 935 | + srv_linux_usrregs=yes | ||
| 936 | + ;; | ||
| 937 | + m32r*-*-linux*) srv_regobj=reg-m32r.o | ||
| 938 | + srv_tgtobj="$srv_linux_obj linux-m32r-low.o" | ||
| 939 | + srv_linux_usrregs=yes | ||
| 940 | + srv_linux_thread_db=yes | ||
| 941 | + ;; | ||
| 942 | + m68*-*-linux*) if test "$gdb_cv_m68k_is_coldfire" = yes; then | ||
| 943 | + srv_regobj=reg-cf.o | ||
| 944 | + else | ||
| 945 | + srv_regobj=reg-m68k.o | ||
| 946 | + fi | ||
| 947 | + srv_tgtobj="$srv_linux_obj linux-m68k-low.o" | ||
| 948 | + srv_linux_usrregs=yes | ||
| 949 | + srv_linux_regsets=yes | ||
| 950 | + srv_linux_thread_db=yes | ||
| 951 | + ;; | ||
| 952 | + m68*-*-uclinux*) if test "$gdb_cv_m68k_is_coldfire" = yes; then | ||
| 953 | + srv_regobj=reg-cf.o | ||
| 954 | + else | ||
| 955 | + srv_regobj=reg-m68k.o | ||
| 956 | + fi | ||
| 957 | + srv_tgtobj="$srv_linux_obj linux-m68k-low.o" | ||
| 958 | + srv_linux_usrregs=yes | ||
| 959 | + srv_linux_regsets=yes | ||
| 960 | + srv_linux_thread_db=yes | ||
| 961 | + ;; | ||
| 962 | + mips*-*-linux*) srv_regobj="mips-linux.o" | ||
| 963 | + srv_regobj="${srv_regobj} mips-dsp-linux.o" | ||
| 964 | + srv_regobj="${srv_regobj} mips64-linux.o" | ||
| 965 | + srv_regobj="${srv_regobj} mips64-dsp-linux.o" | ||
| 966 | + srv_tgtobj="$srv_linux_obj linux-mips-low.o" | ||
| 967 | + srv_tgtobj="${srv_tgtobj} mips-linux-watch.o" | ||
| 968 | + srv_xmlfiles="mips-linux.xml" | ||
| 969 | + srv_xmlfiles="${srv_xmlfiles} mips-dsp-linux.xml" | ||
| 970 | + srv_xmlfiles="${srv_xmlfiles} mips-cpu.xml" | ||
| 971 | + srv_xmlfiles="${srv_xmlfiles} mips-cp0.xml" | ||
| 972 | + srv_xmlfiles="${srv_xmlfiles} mips-fpu.xml" | ||
| 973 | + srv_xmlfiles="${srv_xmlfiles} mips-dsp.xml" | ||
| 974 | + srv_xmlfiles="${srv_xmlfiles} mips64-linux.xml" | ||
| 975 | + srv_xmlfiles="${srv_xmlfiles} mips64-dsp-linux.xml" | ||
| 976 | + srv_xmlfiles="${srv_xmlfiles} mips64-cpu.xml" | ||
| 977 | + srv_xmlfiles="${srv_xmlfiles} mips64-cp0.xml" | ||
| 978 | + srv_xmlfiles="${srv_xmlfiles} mips64-fpu.xml" | ||
| 979 | + srv_xmlfiles="${srv_xmlfiles} mips64-dsp.xml" | ||
| 980 | + srv_linux_regsets=yes | ||
| 981 | + srv_linux_usrregs=yes | ||
| 982 | + srv_linux_thread_db=yes | ||
| 983 | + ;; | ||
| 984 | + nios2*-*-linux*) srv_regobj="nios2-linux.o" | ||
| 985 | + srv_tgtobj="$srv_linux_obj linux-nios2-low.o" | ||
| 986 | + srv_xmlfiles="nios2-linux.xml" | ||
| 987 | + srv_xmlfiles="${srv_xmlfiles} nios2-cpu.xml" | ||
| 988 | + srv_linux_regsets=yes | ||
| 989 | + srv_linux_usrregs=yes | ||
| 990 | + srv_linux_thread_db=yes | ||
| 991 | + ;; | ||
| 992 | + microblaze*-*-linux*) srv_regobj="microblaze-linux.o" | ||
| 993 | + srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " | ||
| 994 | + srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" | ||
| 995 | + srv_xmlfiles="microblaze-linux.xml" | ||
| 996 | + srv_linux_regsets=yes | ||
| 997 | + srv_linux_usrregs=yes | ||
| 998 | + srv_linux_thread_db=yes | ||
| 999 | + ;; | ||
| 1000 | + powerpc*-*-linux*) srv_regobj="powerpc-32l.o" | ||
| 1001 | + srv_regobj="${srv_regobj} powerpc-altivec32l.o" | ||
| 1002 | + srv_regobj="${srv_regobj} powerpc-vsx32l.o" | ||
| 1003 | + srv_regobj="${srv_regobj} powerpc-isa205-32l.o" | ||
| 1004 | + srv_regobj="${srv_regobj} powerpc-isa205-altivec32l.o" | ||
| 1005 | + srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o" | ||
| 1006 | + srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o" | ||
| 1007 | + srv_regobj="${srv_regobj} powerpc-isa207-vsx32l.o" | ||
| 1008 | + srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx32l.o" | ||
| 1009 | + srv_regobj="${srv_regobj} powerpc-e500l.o" | ||
| 1010 | + srv_regobj="${srv_regobj} powerpc-64l.o" | ||
| 1011 | + srv_regobj="${srv_regobj} powerpc-altivec64l.o" | ||
| 1012 | + srv_regobj="${srv_regobj} powerpc-vsx64l.o" | ||
| 1013 | + srv_regobj="${srv_regobj} powerpc-isa205-64l.o" | ||
| 1014 | + srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o" | ||
| 1015 | + srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o" | ||
| 1016 | + srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o" | ||
| 1017 | + srv_regobj="${srv_regobj} powerpc-isa207-vsx64l.o" | ||
| 1018 | + srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx64l.o" | ||
| 1019 | + srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o" | ||
| 1020 | + srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o" | ||
| 1021 | + srv_xmlfiles="rs6000/powerpc-32l.xml" | ||
| 1022 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-altivec32l.xml" | ||
| 1023 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-vsx32l.xml" | ||
| 1024 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-32l.xml" | ||
| 1025 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec32l.xml" | ||
| 1026 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml" | ||
| 1027 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml" | ||
| 1028 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx32l.xml" | ||
| 1029 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx32l.xml" | ||
| 1030 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml" | ||
| 1031 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml" | ||
| 1032 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" | ||
| 1033 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux.xml" | ||
| 1034 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml" | ||
| 1035 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu-isa205.xml" | ||
| 1036 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml" | ||
| 1037 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml" | ||
| 1038 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml" | ||
| 1039 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-ebb.xml" | ||
| 1040 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux-pmu.xml" | ||
| 1041 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-spr.xml" | ||
| 1042 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-core.xml" | ||
| 1043 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-fpu.xml" | ||
| 1044 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-altivec.xml" | ||
| 1045 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-vsx.xml" | ||
| 1046 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-ppr.xml" | ||
| 1047 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-dscr.xml" | ||
| 1048 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-tar.xml" | ||
| 1049 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml" | ||
| 1050 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml" | ||
| 1051 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml" | ||
| 1052 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-altivec64l.xml" | ||
| 1053 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-vsx64l.xml" | ||
| 1054 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-64l.xml" | ||
| 1055 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec64l.xml" | ||
| 1056 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml" | ||
| 1057 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml" | ||
| 1058 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx64l.xml" | ||
| 1059 | + srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx64l.xml" | ||
| 1060 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" | ||
| 1061 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml" | ||
| 1062 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power64-htm-core.xml" | ||
| 1063 | + srv_linux_usrregs=yes | ||
| 1064 | + srv_linux_regsets=yes | ||
| 1065 | + srv_linux_thread_db=yes | ||
| 1066 | + ipa_obj="${ipa_ppc_linux_regobj} linux-ppc-ipa.o" | ||
| 1067 | + ;; | ||
| 1068 | + powerpc-*-lynxos*) srv_regobj="powerpc-32.o" | ||
| 1069 | + srv_tgtobj="lynx-low.o lynx-ppc-low.o" | ||
| 1070 | + srv_xmlfiles="rs6000/powerpc-32.xml" | ||
| 1071 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" | ||
| 1072 | + srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml" | ||
| 1073 | + srv_lynxos=yes | ||
| 1074 | + ;; | ||
| 1075 | + s390*-*-linux*) srv_regobj="s390-linux32.o" | ||
| 1076 | + srv_regobj="${srv_regobj} s390-linux32v1.o" | ||
| 1077 | + srv_regobj="${srv_regobj} s390-linux32v2.o" | ||
| 1078 | + srv_regobj="${srv_regobj} s390-linux64.o" | ||
| 1079 | + srv_regobj="${srv_regobj} s390-linux64v1.o" | ||
| 1080 | + srv_regobj="${srv_regobj} s390-linux64v2.o" | ||
| 1081 | + srv_regobj="${srv_regobj} s390-te-linux64.o" | ||
| 1082 | + srv_regobj="${srv_regobj} s390-vx-linux64.o" | ||
| 1083 | + srv_regobj="${srv_regobj} s390-tevx-linux64.o" | ||
| 1084 | + srv_regobj="${srv_regobj} s390-gs-linux64.o" | ||
| 1085 | + srv_regobj="${srv_regobj} s390x-linux64.o" | ||
| 1086 | + srv_regobj="${srv_regobj} s390x-linux64v1.o" | ||
| 1087 | + srv_regobj="${srv_regobj} s390x-linux64v2.o" | ||
| 1088 | + srv_regobj="${srv_regobj} s390x-te-linux64.o" | ||
| 1089 | + srv_regobj="${srv_regobj} s390x-vx-linux64.o" | ||
| 1090 | + srv_regobj="${srv_regobj} s390x-tevx-linux64.o" | ||
| 1091 | + srv_regobj="${srv_regobj} s390x-gs-linux64.o" | ||
| 1092 | + srv_tgtobj="$srv_linux_obj linux-s390-low.o" | ||
| 1093 | + srv_xmlfiles="s390-linux32.xml" | ||
| 1094 | + srv_xmlfiles="${srv_xmlfiles} s390-linux32v1.xml" | ||
| 1095 | + srv_xmlfiles="${srv_xmlfiles} s390-linux32v2.xml" | ||
| 1096 | + srv_xmlfiles="${srv_xmlfiles} s390-linux64.xml" | ||
| 1097 | + srv_xmlfiles="${srv_xmlfiles} s390-linux64v1.xml" | ||
| 1098 | + srv_xmlfiles="${srv_xmlfiles} s390-linux64v2.xml" | ||
| 1099 | + srv_xmlfiles="${srv_xmlfiles} s390-te-linux64.xml" | ||
| 1100 | + srv_xmlfiles="${srv_xmlfiles} s390-vx-linux64.xml" | ||
| 1101 | + srv_xmlfiles="${srv_xmlfiles} s390-tevx-linux64.xml" | ||
| 1102 | + srv_xmlfiles="${srv_xmlfiles} s390-gs-linux64.xml" | ||
| 1103 | + srv_xmlfiles="${srv_xmlfiles} s390x-linux64.xml" | ||
| 1104 | + srv_xmlfiles="${srv_xmlfiles} s390x-linux64v1.xml" | ||
| 1105 | + srv_xmlfiles="${srv_xmlfiles} s390x-linux64v2.xml" | ||
| 1106 | + srv_xmlfiles="${srv_xmlfiles} s390x-te-linux64.xml" | ||
| 1107 | + srv_xmlfiles="${srv_xmlfiles} s390x-vx-linux64.xml" | ||
| 1108 | + srv_xmlfiles="${srv_xmlfiles} s390x-tevx-linux64.xml" | ||
| 1109 | + srv_xmlfiles="${srv_xmlfiles} s390x-gs-linux64.xml" | ||
| 1110 | + srv_xmlfiles="${srv_xmlfiles} s390-core32.xml" | ||
| 1111 | + srv_xmlfiles="${srv_xmlfiles} s390-core64.xml" | ||
| 1112 | + srv_xmlfiles="${srv_xmlfiles} s390x-core64.xml" | ||
| 1113 | + srv_xmlfiles="${srv_xmlfiles} s390-acr.xml" | ||
| 1114 | + srv_xmlfiles="${srv_xmlfiles} s390-fpr.xml" | ||
| 1115 | + srv_xmlfiles="${srv_xmlfiles} s390-tdb.xml" | ||
| 1116 | + srv_xmlfiles="${srv_xmlfiles} s390-vx.xml" | ||
| 1117 | + srv_xmlfiles="${srv_xmlfiles} s390-gs.xml" | ||
| 1118 | + srv_xmlfiles="${srv_xmlfiles} s390-gsbc.xml" | ||
| 1119 | + srv_linux_usrregs=yes | ||
| 1120 | + srv_linux_regsets=yes | ||
| 1121 | + srv_linux_thread_db=yes | ||
| 1122 | + ipa_obj="linux-s390-ipa.o" | ||
| 1123 | + ipa_obj="${ipa_obj} s390-linux32-ipa.o" | ||
| 1124 | + ipa_obj="${ipa_obj} s390-linux32v1-ipa.o" | ||
| 1125 | + ipa_obj="${ipa_obj} s390-linux32v2-ipa.o" | ||
| 1126 | + ipa_obj="${ipa_obj} s390-linux64-ipa.o" | ||
| 1127 | + ipa_obj="${ipa_obj} s390-linux64v1-ipa.o" | ||
| 1128 | + ipa_obj="${ipa_obj} s390-linux64v2-ipa.o" | ||
| 1129 | + ipa_obj="${ipa_obj} s390-vx-linux64-ipa.o" | ||
| 1130 | + ipa_obj="${ipa_obj} s390-te-linux64-ipa.o" | ||
| 1131 | + ipa_obj="${ipa_obj} s390-tevx-linux64-ipa.o" | ||
| 1132 | + ipa_obj="${ipa_obj} s390-gs-linux64-ipa.o" | ||
| 1133 | + ipa_obj="${ipa_obj} s390x-linux64-ipa.o" | ||
| 1134 | + ipa_obj="${ipa_obj} s390x-linux64v1-ipa.o" | ||
| 1135 | + ipa_obj="${ipa_obj} s390x-linux64v2-ipa.o" | ||
| 1136 | + ipa_obj="${ipa_obj} s390x-vx-linux64-ipa.o" | ||
| 1137 | + ipa_obj="${ipa_obj} s390x-te-linux64-ipa.o" | ||
| 1138 | + ipa_obj="${ipa_obj} s390x-tevx-linux64-ipa.o" | ||
| 1139 | + ipa_obj="${ipa_obj} s390x-gs-linux64-ipa.o" | ||
| 1140 | + ;; | ||
| 1141 | + sh*-*-linux*) srv_regobj=reg-sh.o | ||
| 1142 | + srv_tgtobj="$srv_linux_obj linux-sh-low.o" | ||
| 1143 | + srv_linux_usrregs=yes | ||
| 1144 | + srv_linux_regsets=yes | ||
| 1145 | + srv_linux_thread_db=yes | ||
| 1146 | + ;; | ||
| 1147 | + sparc*-*-linux*) srv_regobj=reg-sparc64.o | ||
| 1148 | + srv_tgtobj="$srv_linux_obj linux-sparc-low.o" | ||
| 1149 | + srv_linux_regsets=yes | ||
| 1150 | + srv_linux_thread_db=yes | ||
| 1151 | + ;; | ||
| 1152 | + tic6x-*-uclinux) if $development; then | ||
| 1153 | + srv_regobj="tic6x-c64xp-linux.o" | ||
| 1154 | + srv_regobj="${srv_regobj} tic6x-c64x-linux.o" | ||
| 1155 | + srv_regobj="${srv_regobj} tic6x-c62x-linux.o" | ||
| 1156 | + else | ||
| 1157 | + srv_regobj="" | ||
| 1158 | + fi | ||
| 1159 | + srv_tgtobj="$srv_linux_obj linux-tic6x-low.o" | ||
| 1160 | + srv_tgtobj="${srv_tgtobj} arch/tic6x.o" | ||
| 1161 | + srv_linux_regsets=yes | ||
| 1162 | + srv_linux_usrregs=yes | ||
| 1163 | + srv_linux_thread_db=yes | ||
| 1164 | + ;; | ||
| 1165 | + x86_64-*-linux*) srv_tgtobj="$srv_linux_obj linux-x86-low.o x86-low.o" | ||
| 1166 | + srv_tgtobj="${srv_tgtobj} x86-dregs.o i387-fp.o" | ||
| 1167 | + srv_tgtobj="${srv_tgtobj} arch/i386.o arch/amd64.o" | ||
| 1168 | + srv_tgtobj="${srv_tgtobj} linux-x86-tdesc.o" | ||
| 1169 | + srv_tgtobj="${srv_tgtobj} linux-btrace.o x86-linux.o" | ||
| 1170 | + srv_tgtobj="${srv_tgtobj} x86-linux-dregs.o" | ||
| 1171 | + srv_tgtobj="${srv_tgtobj} amd64-linux-siginfo.o" | ||
| 1172 | + srv_linux_usrregs=yes # This is for i386 progs. | ||
| 1173 | + srv_linux_regsets=yes | ||
| 1174 | + srv_linux_thread_db=yes | ||
| 1175 | + srv_linux_btrace=yes | ||
| 1176 | + ipa_obj="linux-amd64-ipa.o linux-x86-tdesc-ipa.o" | ||
| 1177 | + ipa_obj="${ipa_obj} arch/amd64-ipa.o" | ||
| 1178 | + ;; | ||
| 1179 | + x86_64-*-mingw*) srv_regobj="" | ||
| 1180 | + srv_tgtobj="x86-low.o x86-dregs.o i387-fp.o win32-low.o win32-i386-low.o" | ||
| 1181 | + srv_tgtobj="${srv_tgtobj} arch/amd64.o" | ||
| 1182 | + srv_mingw=yes | ||
| 1183 | + ;; | ||
| 1184 | + x86_64-*-cygwin*) srv_regobj="" | ||
| 1185 | + srv_tgtobj="x86-low.o x86-dregs.o i387-fp.o win32-low.o win32-i386-low.o" | ||
| 1186 | + srv_tgtobj="${srv_tgtobj} arch/amd64.o" | ||
| 1187 | + ;; | ||
| 1188 | + | ||
| 1189 | + xtensa*-*-linux*) srv_regobj=reg-xtensa.o | ||
| 1190 | + srv_tgtobj="$srv_linux_obj linux-xtensa-low.o" | ||
| 1191 | + srv_linux_regsets=yes | ||
| 1192 | + srv_linux_thread_db=yes | ||
| 1193 | + ;; | ||
| 1194 | + tilegx-*-linux*) srv_regobj=reg-tilegx.o | ||
| 1195 | + srv_regobj="${srv_regobj} reg-tilegx32.o" | ||
| 1196 | + srv_tgtobj="$srv_linux_obj linux-tile-low.o" | ||
| 1197 | + srv_linux_regsets=yes | ||
| 1198 | + srv_linux_thread_db=yes | ||
| 1199 | + ;; | ||
| 1200 | + *) echo "Error: target not supported by gdbserver." | ||
| 1201 | + exit 1 | ||
| 1202 | + ;; | ||
| 1203 | +esac | ||
| 1204 | diff --git a/gdb/gdbserver/linux-microblaze-low.c b/gdb/gdbserver/linux-microblaze-low.c | ||
| 1205 | new file mode 100644 | ||
| 1206 | index 00000000000..cba5d6fc585 | ||
| 1207 | --- /dev/null | ||
| 1208 | +++ b/gdb/gdbserver/linux-microblaze-low.c | ||
| 1209 | @@ -0,0 +1,189 @@ | ||
| 1210 | +/* GNU/Linux/Microblaze specific low level interface, for the remote server for | ||
| 1211 | + GDB. | ||
| 1212 | + Copyright (C) 1995-2013 Free Software Foundation, Inc. | ||
| 1213 | + | ||
| 1214 | + This file is part of GDB. | ||
| 1215 | + | ||
| 1216 | + This program is free software; you can redistribute it and/or modify | ||
| 1217 | + it under the terms of the GNU General Public License as published by | ||
| 1218 | + the Free Software Foundation; either version 3 of the License, or | ||
| 1219 | + (at your option) any later version. | ||
| 1220 | + | ||
| 1221 | + This program is distributed in the hope that it will be useful, | ||
| 1222 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 1223 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 1224 | + GNU General Public License for more details. | ||
| 1225 | + | ||
| 1226 | + You should have received a copy of the GNU General Public License | ||
| 1227 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
| 1228 | + | ||
| 1229 | +#include "server.h" | ||
| 1230 | +#include "linux-low.h" | ||
| 1231 | + | ||
| 1232 | +#include <asm/ptrace.h> | ||
| 1233 | +#include <sys/procfs.h> | ||
| 1234 | +#include <sys/ptrace.h> | ||
| 1235 | + | ||
| 1236 | +#include "gdb_proc_service.h" | ||
| 1237 | + | ||
| 1238 | +static int microblaze_regmap[] = | ||
| 1239 | + {PT_GPR(0), PT_GPR(1), PT_GPR(2), PT_GPR(3), | ||
| 1240 | + PT_GPR(4), PT_GPR(5), PT_GPR(6), PT_GPR(7), | ||
| 1241 | + PT_GPR(8), PT_GPR(9), PT_GPR(10), PT_GPR(11), | ||
| 1242 | + PT_GPR(12), PT_GPR(13), PT_GPR(14), PT_GPR(15), | ||
| 1243 | + PT_GPR(16), PT_GPR(17), PT_GPR(18), PT_GPR(19), | ||
| 1244 | + PT_GPR(20), PT_GPR(21), PT_GPR(22), PT_GPR(23), | ||
| 1245 | + PT_GPR(24), PT_GPR(25), PT_GPR(26), PT_GPR(27), | ||
| 1246 | + PT_GPR(28), PT_GPR(29), PT_GPR(30), PT_GPR(31), | ||
| 1247 | + PT_PC, PT_MSR, PT_EAR, PT_ESR, | ||
| 1248 | + PT_FSR | ||
| 1249 | + }; | ||
| 1250 | + | ||
| 1251 | +#define microblaze_num_regs (sizeof microblaze_regmap / sizeof microblaze_regmap[0]) | ||
| 1252 | + | ||
| 1253 | +/* Defined in auto-generated file microblaze-linux.c. */ | ||
| 1254 | +void init_registers_microblaze (void); | ||
| 1255 | + | ||
| 1256 | +static int | ||
| 1257 | +microblaze_cannot_store_register (int regno) | ||
| 1258 | +{ | ||
| 1259 | + if (microblaze_regmap[regno] == -1 || regno == 0) | ||
| 1260 | + return 1; | ||
| 1261 | + | ||
| 1262 | + return 0; | ||
| 1263 | +} | ||
| 1264 | + | ||
| 1265 | +static int | ||
| 1266 | +microblaze_cannot_fetch_register (int regno) | ||
| 1267 | +{ | ||
| 1268 | + return 0; | ||
| 1269 | +} | ||
| 1270 | + | ||
| 1271 | +static CORE_ADDR | ||
| 1272 | +microblaze_get_pc (struct regcache *regcache) | ||
| 1273 | +{ | ||
| 1274 | + unsigned long pc; | ||
| 1275 | + | ||
| 1276 | + collect_register_by_name (regcache, "pc", &pc); | ||
| 1277 | + return (CORE_ADDR) pc; | ||
| 1278 | +} | ||
| 1279 | + | ||
| 1280 | +static void | ||
| 1281 | +microblaze_set_pc (struct regcache *regcache, CORE_ADDR pc) | ||
| 1282 | +{ | ||
| 1283 | + unsigned long newpc = pc; | ||
| 1284 | + | ||
| 1285 | + supply_register_by_name (regcache, "pc", &newpc); | ||
| 1286 | +} | ||
| 1287 | + | ||
| 1288 | +/* dbtrap insn */ | ||
| 1289 | +/* brki r16, 0x18; */ | ||
| 1290 | +static const unsigned long microblaze_breakpoint = 0xba0c0018; | ||
| 1291 | +#define microblaze_breakpoint_len 4 | ||
| 1292 | + | ||
| 1293 | +static int | ||
| 1294 | +microblaze_breakpoint_at (CORE_ADDR where) | ||
| 1295 | +{ | ||
| 1296 | + unsigned long insn; | ||
| 1297 | + | ||
| 1298 | + (*the_target->read_memory) (where, (unsigned char *) &insn, 4); | ||
| 1299 | + if (insn == microblaze_breakpoint) | ||
| 1300 | + return 1; | ||
| 1301 | + /* If necessary, recognize more trap instructions here. GDB only uses the | ||
| 1302 | + one. */ | ||
| 1303 | + return 0; | ||
| 1304 | +} | ||
| 1305 | + | ||
| 1306 | +static CORE_ADDR | ||
| 1307 | +microblaze_reinsert_addr (struct regcache *regcache) | ||
| 1308 | +{ | ||
| 1309 | + unsigned long pc; | ||
| 1310 | + collect_register_by_name (regcache, "r15", &pc); | ||
| 1311 | + return pc; | ||
| 1312 | +} | ||
| 1313 | + | ||
| 1314 | +#ifdef HAVE_PTRACE_GETREGS | ||
| 1315 | + | ||
| 1316 | +static void | ||
| 1317 | +microblaze_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) | ||
| 1318 | +{ | ||
| 1319 | + int size = register_size (regno); | ||
| 1320 | + | ||
| 1321 | + memset (buf, 0, sizeof (long)); | ||
| 1322 | + | ||
| 1323 | + if (size < sizeof (long)) | ||
| 1324 | + collect_register (regcache, regno, buf + sizeof (long) - size); | ||
| 1325 | + else | ||
| 1326 | + collect_register (regcache, regno, buf); | ||
| 1327 | +} | ||
| 1328 | + | ||
| 1329 | +static void | ||
| 1330 | +microblaze_supply_ptrace_register (struct regcache *regcache, | ||
| 1331 | + int regno, const char *buf) | ||
| 1332 | +{ | ||
| 1333 | + int size = register_size (regno); | ||
| 1334 | + | ||
| 1335 | + if (regno == 0) { | ||
| 1336 | + unsigned long regbuf_0 = 0; | ||
| 1337 | + /* clobbering r0 so that it is always 0 as enforced by hardware */ | ||
| 1338 | + supply_register (regcache, regno, (const char*)®buf_0); | ||
| 1339 | + } else { | ||
| 1340 | + if (size < sizeof (long)) | ||
| 1341 | + supply_register (regcache, regno, buf + sizeof (long) - size); | ||
| 1342 | + else | ||
| 1343 | + supply_register (regcache, regno, buf); | ||
| 1344 | + } | ||
| 1345 | +} | ||
| 1346 | + | ||
| 1347 | +/* Provide only a fill function for the general register set. ps_lgetregs | ||
| 1348 | + will use this for NPTL support. */ | ||
| 1349 | + | ||
| 1350 | +static void microblaze_fill_gregset (struct regcache *regcache, void *buf) | ||
| 1351 | +{ | ||
| 1352 | + int i; | ||
| 1353 | + | ||
| 1354 | + for (i = 0; i < 32; i++) | ||
| 1355 | + microblaze_collect_ptrace_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
| 1356 | +} | ||
| 1357 | + | ||
| 1358 | +static void | ||
| 1359 | +microblaze_store_gregset (struct regcache *regcache, const void *buf) | ||
| 1360 | +{ | ||
| 1361 | + int i; | ||
| 1362 | + | ||
| 1363 | + for (i = 0; i < 32; i++) | ||
| 1364 | + supply_register (regcache, i, (char *) buf + microblaze_regmap[i]); | ||
| 1365 | +} | ||
| 1366 | + | ||
| 1367 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
| 1368 | + | ||
| 1369 | +struct regset_info target_regsets[] = { | ||
| 1370 | +#ifdef HAVE_PTRACE_GETREGS | ||
| 1371 | + { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, microblaze_fill_gregset, microblaze_store_gregset }, | ||
| 1372 | + { 0, 0, 0, -1, -1, NULL, NULL }, | ||
| 1373 | +#endif /* HAVE_PTRACE_GETREGS */ | ||
| 1374 | + { 0, 0, 0, -1, -1, NULL, NULL } | ||
| 1375 | +}; | ||
| 1376 | + | ||
| 1377 | +struct linux_target_ops the_low_target = { | ||
| 1378 | + init_registers_microblaze, | ||
| 1379 | + microblaze_num_regs, | ||
| 1380 | + microblaze_regmap, | ||
| 1381 | + NULL, | ||
| 1382 | + microblaze_cannot_fetch_register, | ||
| 1383 | + microblaze_cannot_store_register, | ||
| 1384 | + NULL, /* fetch_register */ | ||
| 1385 | + microblaze_get_pc, | ||
| 1386 | + microblaze_set_pc, | ||
| 1387 | + (const unsigned char *) µblaze_breakpoint, | ||
| 1388 | + microblaze_breakpoint_len, | ||
| 1389 | + microblaze_reinsert_addr, | ||
| 1390 | + 0, | ||
| 1391 | + microblaze_breakpoint_at, | ||
| 1392 | + NULL, | ||
| 1393 | + NULL, | ||
| 1394 | + NULL, | ||
| 1395 | + NULL, | ||
| 1396 | + microblaze_collect_ptrace_register, | ||
| 1397 | + microblaze_supply_ptrace_register, | ||
| 1398 | +}; | ||
| 1399 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | ||
| 1400 | index 17cdc2516d4..7d488d12b52 100644 | ||
| 1401 | --- a/gdb/microblaze-linux-tdep.c | ||
| 1402 | +++ b/gdb/microblaze-linux-tdep.c | ||
| 1403 | @@ -37,6 +37,22 @@ | ||
| 1404 | #include "tramp-frame.h" | ||
| 1405 | #include "linux-tdep.h" | ||
| 1406 | |||
| 1407 | +static int microblaze_debug_flag = 0; | ||
| 1408 | + | ||
| 1409 | +static void | ||
| 1410 | +microblaze_debug (const char *fmt, ...) | ||
| 1411 | +{ | ||
| 1412 | + if (microblaze_debug_flag) | ||
| 1413 | + { | ||
| 1414 | + va_list args; | ||
| 1415 | + | ||
| 1416 | + va_start (args, fmt); | ||
| 1417 | + printf_unfiltered ("MICROBLAZE LINUX: "); | ||
| 1418 | + vprintf_unfiltered (fmt, args); | ||
| 1419 | + va_end (args); | ||
| 1420 | + } | ||
| 1421 | +} | ||
| 1422 | + | ||
| 1423 | static int | ||
| 1424 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 1425 | struct bp_target_info *bp_tgt) | ||
| 1426 | @@ -50,13 +66,20 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 1427 | /* Determine appropriate breakpoint contents and size for this address. */ | ||
| 1428 | bp = gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen); | ||
| 1429 | |||
| 1430 | + /* Make sure we see the memory breakpoints. */ | ||
| 1431 | + scoped_restore restore_memory | ||
| 1432 | + = make_scoped_restore_show_memory_breakpoints (1); | ||
| 1433 | + | ||
| 1434 | val = target_read_memory (addr, old_contents, bplen); | ||
| 1435 | |||
| 1436 | /* If our breakpoint is no longer at the address, this means that the | ||
| 1437 | program modified the code on us, so it is wrong to put back the | ||
| 1438 | old value. */ | ||
| 1439 | if (val == 0 && memcmp (bp, old_contents, bplen) == 0) | ||
| 1440 | - val = target_write_raw_memory (addr, bp_tgt->shadow_contents, bplen); | ||
| 1441 | + { | ||
| 1442 | + val = target_write_raw_memory (addr, bp_tgt->shadow_contents, bplen); | ||
| 1443 | + microblaze_debug ("microblaze_linux_memory_remove_breakpoint writing back to memory at addr 0x%lx\n", addr); | ||
| 1444 | + } | ||
| 1445 | |||
| 1446 | return val; | ||
| 1447 | } | ||
| 1448 | @@ -129,6 +152,10 @@ microblaze_linux_init_abi (struct gdbarch_info info, | ||
| 1449 | /* Trampolines. */ | ||
| 1450 | tramp_frame_prepend_unwinder (gdbarch, | ||
| 1451 | µblaze_linux_sighandler_tramp_frame); | ||
| 1452 | + | ||
| 1453 | + /* Enable TLS support. */ | ||
| 1454 | + set_gdbarch_fetch_tls_load_module_address (gdbarch, | ||
| 1455 | + svr4_fetch_objfile_link_map); | ||
| 1456 | } | ||
| 1457 | |||
| 1458 | void _initialize_microblaze_linux_tdep (); | ||
| 1459 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | ||
| 1460 | index 0c3316dece1..2d6eb8ce94e 100644 | ||
| 1461 | --- a/gdb/microblaze-tdep.c | ||
| 1462 | +++ b/gdb/microblaze-tdep.c | ||
| 1463 | @@ -137,7 +137,38 @@ microblaze_fetch_instruction (CORE_ADDR pc) | ||
| 1464 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; | ||
| 1465 | |||
| 1466 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; | ||
| 1467 | - | ||
| 1468 | +static int | ||
| 1469 | +microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 1470 | + struct bp_target_info *bp_tgt) | ||
| 1471 | +{ | ||
| 1472 | + CORE_ADDR addr = bp_tgt->placed_address; | ||
| 1473 | + const unsigned char *bp; | ||
| 1474 | + int val; | ||
| 1475 | + int bplen; | ||
| 1476 | + gdb_byte old_contents[BREAKPOINT_MAX]; | ||
| 1477 | + | ||
| 1478 | + /* Determine appropriate breakpoint contents and size for this address. */ | ||
| 1479 | + bp = gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen); | ||
| 1480 | + if (bp == NULL) | ||
| 1481 | + error (_("Software breakpoints not implemented for this target.")); | ||
| 1482 | + | ||
| 1483 | + /* Make sure we see the memory breakpoints. */ | ||
| 1484 | + scoped_restore restore_memory | ||
| 1485 | + = make_scoped_restore_show_memory_breakpoints (1); | ||
| 1486 | + | ||
| 1487 | + val = target_read_memory (addr, old_contents, bplen); | ||
| 1488 | + | ||
| 1489 | + /* If our breakpoint is no longer at the address, this means that the | ||
| 1490 | + program modified the code on us, so it is wrong to put back the | ||
| 1491 | + old value. */ | ||
| 1492 | + if (val == 0 && memcmp (bp, old_contents, bplen) == 0) | ||
| 1493 | + { | ||
| 1494 | + val = target_write_raw_memory (addr, bp_tgt->shadow_contents, bplen); | ||
| 1495 | + microblaze_debug ("microblaze_linux_memory_remove_breakpoint writing back to memory at addr 0x%lx\n", addr); | ||
| 1496 | + } | ||
| 1497 | + | ||
| 1498 | + return val; | ||
| 1499 | +} | ||
| 1500 | |||
| 1501 | /* Allocate and initialize a frame cache. */ | ||
| 1502 | |||
| 1503 | @@ -729,6 +760,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 1504 | microblaze_breakpoint::kind_from_pc); | ||
| 1505 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, | ||
| 1506 | microblaze_breakpoint::bp_from_kind); | ||
| 1507 | + set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); | ||
| 1508 | |||
| 1509 | set_gdbarch_frame_args_skip (gdbarch, 8); | ||
| 1510 | |||
| 1511 | @@ -769,4 +801,5 @@ When non-zero, microblaze specific debugging is enabled."), | ||
| 1512 | NULL, | ||
| 1513 | &setdebuglist, &showdebuglist); | ||
| 1514 | |||
| 1515 | + | ||
| 1516 | } | ||
| 1517 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
| 1518 | index 08af0d191c5..8a429cbf001 100644 | ||
| 1519 | --- a/gdb/microblaze-tdep.h | ||
| 1520 | +++ b/gdb/microblaze-tdep.h | ||
| 1521 | @@ -117,6 +117,8 @@ struct microblaze_frame_cache | ||
| 1522 | |||
| 1523 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. | ||
| 1524 | Only used for native debugging. */ | ||
| 1525 | -#define MICROBLAZE_BREAKPOINT {0xb9, 0xcc, 0x00, 0x60} | ||
| 1526 | +#define MICROBLAZE_BREAKPOINT {0xba, 0x0c, 0x00, 0x18} | ||
| 1527 | +#define MICROBLAZE_BREAKPOINT_LE {0x18, 0x00, 0x0c, 0xba} | ||
| 1528 | + | ||
| 1529 | |||
| 1530 | #endif /* microblaze-tdep.h */ | ||
| 1531 | diff --git a/gdb/regformats/reg-microblaze.dat b/gdb/regformats/reg-microblaze.dat | ||
| 1532 | new file mode 100644 | ||
| 1533 | index 00000000000..bd8a4384424 | ||
| 1534 | --- /dev/null | ||
| 1535 | +++ b/gdb/regformats/reg-microblaze.dat | ||
| 1536 | @@ -0,0 +1,41 @@ | ||
| 1537 | +name:microblaze | ||
| 1538 | +expedite:r1,pc | ||
| 1539 | +32:r0 | ||
| 1540 | +32:r1 | ||
| 1541 | +32:r2 | ||
| 1542 | +32:r3 | ||
| 1543 | +32:r4 | ||
| 1544 | +32:r5 | ||
| 1545 | +32:r6 | ||
| 1546 | +32:r7 | ||
| 1547 | +32:r8 | ||
| 1548 | +32:r9 | ||
| 1549 | +32:r10 | ||
| 1550 | +32:r11 | ||
| 1551 | +32:r12 | ||
| 1552 | +32:r13 | ||
| 1553 | +32:r14 | ||
| 1554 | +32:r15 | ||
| 1555 | +32:r16 | ||
| 1556 | +32:r17 | ||
| 1557 | +32:r18 | ||
| 1558 | +32:r19 | ||
| 1559 | +32:r20 | ||
| 1560 | +32:r21 | ||
| 1561 | +32:r22 | ||
| 1562 | +32:r23 | ||
| 1563 | +32:r24 | ||
| 1564 | +32:r25 | ||
| 1565 | +32:r26 | ||
| 1566 | +32:r27 | ||
| 1567 | +32:r28 | ||
| 1568 | +32:r29 | ||
| 1569 | +32:r30 | ||
| 1570 | +32:r31 | ||
| 1571 | +32:pc | ||
| 1572 | +32:msr | ||
| 1573 | +32:ear | ||
| 1574 | +32:esr | ||
| 1575 | +32:fsr | ||
| 1576 | +32:slr | ||
| 1577 | +32:shr | ||
| 1578 | -- | ||
| 1579 | 2.17.1 | ||
| 1580 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0034-Initial-port-of-core-reading-support-Added-support-f.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0034-Initial-port-of-core-reading-support.patch index 3d5f7ae2..876fc5c8 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0034-Initial-port-of-core-reading-support-Added-support-f.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0034-Initial-port-of-core-reading-support.patch | |||
| @@ -1,30 +1,34 @@ | |||
| 1 | From bcb8a5479a617eea7b4da869bee5e00d4b750c73 Mon Sep 17 00:00:00 2001 | 1 | From 9b17875cc7584d41953d9a6f46558482e691881b Mon Sep 17 00:00:00 2001 |
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> |
| 3 | Date: Tue, 24 Jan 2017 14:55:56 +0530 | 3 | Date: Tue, 24 Jan 2017 14:55:56 +0530 |
| 4 | Subject: [PATCH 34/52] Initial port of core reading support Added support for | 4 | Subject: [PATCH 34/38] Initial port of core reading support Added support for |
| 5 | reading notes in linux core dumps Support for reading of PRSTATUS and PSINFO | 5 | reading notes in linux core dumps Support for reading of PRSTATUS and PSINFO |
| 6 | information for rebuilding ".reg" sections of core dumps at run time. | 6 | information for rebuilding ".reg" sections of core dumps at run time. |
| 7 | 7 | ||
| 8 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> | 8 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> |
| 9 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | 9 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> |
| 10 | |||
| 11 | Conflicts: | ||
| 12 | gdb/microblaze-linux-tdep.c | ||
| 13 | gdb/microblaze-tdep.c | ||
| 10 | --- | 14 | --- |
| 11 | bfd/elf32-microblaze.c | 84 ++++++++++++++++++++++++++++++++++ | 15 | bfd/elf32-microblaze.c | 84 +++++++++++++++++++++++++++++++++++++ |
| 12 | gdb/configure.tgt | 2 +- | 16 | gdb/configure.tgt | 2 +- |
| 13 | gdb/microblaze-linux-tdep.c | 57 +++++++++++++++++++++++ | 17 | gdb/microblaze-linux-tdep.c | 17 +++++++- |
| 14 | gdb/microblaze-tdep.c | 90 +++++++++++++++++++++++++++++++++++++ | 18 | gdb/microblaze-tdep.c | 48 +++++++++++++++++++++ |
| 15 | gdb/microblaze-tdep.h | 27 +++++++++++ | 19 | gdb/microblaze-tdep.h | 27 ++++++++++++ |
| 16 | 5 files changed, 259 insertions(+), 1 deletion(-) | 20 | 5 files changed, 176 insertions(+), 2 deletions(-) |
| 17 | 21 | ||
| 18 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c | 22 | diff --git a/bfd/elf32-microblaze.c b/bfd/elf32-microblaze.c |
| 19 | index d77710b1f3..7a27e50111 100644 | 23 | index 2a976ecbe1d..713f5e8e506 100644 |
| 20 | --- a/bfd/elf32-microblaze.c | 24 | --- a/bfd/elf32-microblaze.c |
| 21 | +++ b/bfd/elf32-microblaze.c | 25 | +++ b/bfd/elf32-microblaze.c |
| 22 | @@ -767,6 +767,87 @@ microblaze_elf_is_local_label_name (bfd *abfd, const char *name) | 26 | @@ -765,6 +765,87 @@ microblaze_elf_is_local_label_name (bfd *abfd, const char *name) |
| 23 | return _bfd_elf_is_local_label_name (abfd, name); | 27 | return _bfd_elf_is_local_label_name (abfd, name); |
| 24 | } | 28 | } |
| 25 | 29 | ||
| 26 | +/* Support for core dump NOTE sections. */ | 30 | +/* Support for core dump NOTE sections. */ |
| 27 | +static bfd_boolean | 31 | +static bool |
| 28 | +microblaze_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) | 32 | +microblaze_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note) |
| 29 | +{ | 33 | +{ |
| 30 | + int offset; | 34 | + int offset; |
| @@ -33,7 +37,7 @@ index d77710b1f3..7a27e50111 100644 | |||
| 33 | + switch (note->descsz) | 37 | + switch (note->descsz) |
| 34 | + { | 38 | + { |
| 35 | + default: | 39 | + default: |
| 36 | + return FALSE; | 40 | + return false; |
| 37 | + | 41 | + |
| 38 | + case 228: /* Linux/MicroBlaze */ | 42 | + case 228: /* Linux/MicroBlaze */ |
| 39 | + /* pr_cursig */ | 43 | + /* pr_cursig */ |
| @@ -54,13 +58,13 @@ index d77710b1f3..7a27e50111 100644 | |||
| 54 | + size, note->descpos + offset); | 58 | + size, note->descpos + offset); |
| 55 | +} | 59 | +} |
| 56 | + | 60 | + |
| 57 | +static bfd_boolean | 61 | +static bool |
| 58 | +microblaze_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) | 62 | +microblaze_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note) |
| 59 | +{ | 63 | +{ |
| 60 | + switch (note->descsz) | 64 | + switch (note->descsz) |
| 61 | + { | 65 | + { |
| 62 | + default: | 66 | + default: |
| 63 | + return FALSE; | 67 | + return false; |
| 64 | + | 68 | + |
| 65 | + case 128: /* Linux/MicroBlaze elf_prpsinfo */ | 69 | + case 128: /* Linux/MicroBlaze elf_prpsinfo */ |
| 66 | + elf_tdata (abfd)->core->program | 70 | + elf_tdata (abfd)->core->program |
| @@ -81,7 +85,7 @@ index d77710b1f3..7a27e50111 100644 | |||
| 81 | + command[n - 1] = '\0'; | 85 | + command[n - 1] = '\0'; |
| 82 | + } | 86 | + } |
| 83 | + | 87 | + |
| 84 | + return TRUE; | 88 | + return true; |
| 85 | +} | 89 | +} |
| 86 | + | 90 | + |
| 87 | +/* The microblaze linker (like many others) needs to keep track of | 91 | +/* The microblaze linker (like many others) needs to keep track of |
| @@ -107,7 +111,7 @@ index d77710b1f3..7a27e50111 100644 | |||
| 107 | /* ELF linker hash entry. */ | 111 | /* ELF linker hash entry. */ |
| 108 | 112 | ||
| 109 | struct elf32_mb_link_hash_entry | 113 | struct elf32_mb_link_hash_entry |
| 110 | @@ -3576,4 +3657,7 @@ microblaze_elf_add_symbol_hook (bfd *abfd, | 114 | @@ -3572,4 +3653,7 @@ microblaze_elf_add_symbol_hook (bfd *abfd, |
| 111 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | 115 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections |
| 112 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | 116 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook |
| 113 | 117 | ||
| @@ -116,10 +120,10 @@ index d77710b1f3..7a27e50111 100644 | |||
| 116 | + | 120 | + |
| 117 | #include "elf32-target.h" | 121 | #include "elf32-target.h" |
| 118 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt | 122 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt |
| 119 | index d66f01bb9f..2938fddfe8 100644 | 123 | index a928c0227a0..95095e98706 100644 |
| 120 | --- a/gdb/configure.tgt | 124 | --- a/gdb/configure.tgt |
| 121 | +++ b/gdb/configure.tgt | 125 | +++ b/gdb/configure.tgt |
| 122 | @@ -389,7 +389,7 @@ mep-*-*) | 126 | @@ -399,7 +399,7 @@ mep-*-*) |
| 123 | 127 | ||
| 124 | microblaze*-linux-*|microblaze*-*-linux*) | 128 | microblaze*-linux-*|microblaze*-*-linux*) |
| 125 | # Target: Xilinx MicroBlaze running Linux | 129 | # Target: Xilinx MicroBlaze running Linux |
| @@ -129,65 +133,36 @@ index d66f01bb9f..2938fddfe8 100644 | |||
| 129 | gdb_sim=../sim/microblaze/libsim.a | 133 | gdb_sim=../sim/microblaze/libsim.a |
| 130 | ;; | 134 | ;; |
| 131 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | 135 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c |
| 132 | index fb8241884b..2725ce1789 100644 | 136 | index 7d488d12b52..6ea43dd0d3c 100644 |
| 133 | --- a/gdb/microblaze-linux-tdep.c | 137 | --- a/gdb/microblaze-linux-tdep.c |
| 134 | +++ b/gdb/microblaze-linux-tdep.c | 138 | +++ b/gdb/microblaze-linux-tdep.c |
| 135 | @@ -135,11 +135,54 @@ static struct tramp_frame microblaze_linux_sighandler_tramp_frame = | 139 | @@ -36,6 +36,7 @@ |
| 140 | #include "frame-unwind.h" | ||
| 141 | #include "tramp-frame.h" | ||
| 142 | #include "linux-tdep.h" | ||
| 143 | +#include "glibc-tdep.h" | ||
| 144 | |||
| 145 | static int microblaze_debug_flag = 0; | ||
| 146 | |||
| 147 | @@ -135,13 +136,16 @@ static struct tramp_frame microblaze_linux_sighandler_tramp_frame = | ||
| 136 | microblaze_linux_sighandler_cache_init | 148 | microblaze_linux_sighandler_cache_init |
| 137 | }; | 149 | }; |
| 138 | 150 | ||
| 139 | +const struct microblaze_gregset microblaze_linux_core_gregset; | 151 | - |
| 140 | + | ||
| 141 | +static void | ||
| 142 | +microblaze_linux_supply_core_gregset (const struct regset *regset, | ||
| 143 | + struct regcache *regcache, | ||
| 144 | + int regnum, const void *gregs, size_t len) | ||
| 145 | +{ | ||
| 146 | + microblaze_supply_gregset (µblaze_linux_core_gregset, regcache, | ||
| 147 | + regnum, gregs); | ||
| 148 | +} | ||
| 149 | + | ||
| 150 | +static void | ||
| 151 | +microblaze_linux_collect_core_gregset (const struct regset *regset, | ||
| 152 | + const struct regcache *regcache, | ||
| 153 | + int regnum, void *gregs, size_t len) | ||
| 154 | +{ | ||
| 155 | + microblaze_collect_gregset (µblaze_linux_core_gregset, regcache, | ||
| 156 | + regnum, gregs); | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +static void | ||
| 160 | +microblaze_linux_supply_core_fpregset (const struct regset *regset, | ||
| 161 | + struct regcache *regcache, | ||
| 162 | + int regnum, const void *fpregs, size_t len) | ||
| 163 | +{ | ||
| 164 | + /* FIXME. */ | ||
| 165 | + microblaze_supply_fpregset (regcache, regnum, fpregs); | ||
| 166 | +} | ||
| 167 | + | ||
| 168 | +static void | ||
| 169 | +microblaze_linux_collect_core_fpregset (const struct regset *regset, | ||
| 170 | + const struct regcache *regcache, | ||
| 171 | + int regnum, void *fpregs, size_t len) | ||
| 172 | +{ | ||
| 173 | + /* FIXME. */ | ||
| 174 | + microblaze_collect_fpregset (regcache, regnum, fpregs); | ||
| 175 | +} | ||
| 176 | |||
| 177 | static void | 152 | static void |
| 178 | microblaze_linux_init_abi (struct gdbarch_info info, | 153 | microblaze_linux_init_abi (struct gdbarch_info info, |
| 179 | struct gdbarch *gdbarch) | 154 | struct gdbarch *gdbarch) |
| 180 | { | 155 | { |
| 181 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | 156 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); |
| 182 | + | 157 | + |
| 183 | + tdep->gregset = regset_alloc (gdbarch, microblaze_linux_supply_core_gregset, | ||
| 184 | + microblaze_linux_collect_core_gregset); | ||
| 185 | + tdep->sizeof_gregset = 200; | 158 | + tdep->sizeof_gregset = 200; |
| 186 | + | 159 | linux_init_abi (info, gdbarch, 0); |
| 187 | linux_init_abi (info, gdbarch); | ||
| 188 | 160 | ||
| 161 | + | ||
| 189 | set_gdbarch_memory_remove_breakpoint (gdbarch, | 162 | set_gdbarch_memory_remove_breakpoint (gdbarch, |
| 190 | @@ -153,6 +196,20 @@ microblaze_linux_init_abi (struct gdbarch_info info, | 163 | microblaze_linux_memory_remove_breakpoint); |
| 164 | |||
| 165 | @@ -153,6 +157,17 @@ microblaze_linux_init_abi (struct gdbarch_info info, | ||
| 191 | tramp_frame_prepend_unwinder (gdbarch, | 166 | tramp_frame_prepend_unwinder (gdbarch, |
| 192 | µblaze_linux_sighandler_tramp_frame); | 167 | µblaze_linux_sighandler_tramp_frame); |
| 193 | 168 | ||
| @@ -202,109 +177,50 @@ index fb8241884b..2725ce1789 100644 | |||
| 202 | + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); | 177 | + set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); |
| 203 | + set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); | 178 | + set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); |
| 204 | + | 179 | + |
| 205 | + set_gdbarch_regset_from_core_section (gdbarch, | ||
| 206 | + microblaze_regset_from_core_section); | ||
| 207 | + | ||
| 208 | /* Enable TLS support. */ | 180 | /* Enable TLS support. */ |
| 209 | set_gdbarch_fetch_tls_load_module_address (gdbarch, | 181 | set_gdbarch_fetch_tls_load_module_address (gdbarch, |
| 210 | svr4_fetch_objfile_link_map); | 182 | svr4_fetch_objfile_link_map); |
| 211 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | 183 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c |
| 212 | index 443adfb364..1b5cf38e45 100644 | 184 | index 2d6eb8ce94e..ceeee26007f 100644 |
| 213 | --- a/gdb/microblaze-tdep.c | 185 | --- a/gdb/microblaze-tdep.c |
| 214 | +++ b/gdb/microblaze-tdep.c | 186 | +++ b/gdb/microblaze-tdep.c |
| 215 | @@ -137,6 +137,14 @@ microblaze_fetch_instruction (CORE_ADDR pc) | 187 | @@ -678,6 +678,43 @@ microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) |
| 216 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; | 188 | tdesc_microblaze_with_stack_protect); |
| 217 | |||
| 218 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; | ||
| 219 | +static CORE_ADDR | ||
| 220 | +microblaze_store_arguments (struct regcache *regcache, int nargs, | ||
| 221 | + struct value **args, CORE_ADDR sp, | ||
| 222 | + int struct_return, CORE_ADDR struct_addr) | ||
| 223 | +{ | ||
| 224 | + error (_("store_arguments not implemented")); | ||
| 225 | + return sp; | ||
| 226 | +} | ||
| 227 | static int | ||
| 228 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 229 | struct bp_target_info *bp_tgt) | ||
| 230 | @@ -541,6 +549,12 @@ microblaze_frame_base_address (struct frame_info *next_frame, | ||
| 231 | return cache->base; | ||
| 232 | } | ||
| 233 | |||
| 234 | +static const struct frame_unwind * | ||
| 235 | +microblaze_frame_sniffer (struct frame_info *next_frame) | ||
| 236 | +{ | ||
| 237 | + return µblaze_frame_unwind; | ||
| 238 | +} | ||
| 239 | + | ||
| 240 | static const struct frame_base microblaze_frame_base = | ||
| 241 | { | ||
| 242 | µblaze_frame_unwind, | ||
| 243 | @@ -677,6 +691,71 @@ microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) | ||
| 244 | tdesc_microblaze_with_stack_protect); | ||
| 245 | } | 189 | } |
| 246 | 190 | ||
| 247 | +void | 191 | +void |
| 248 | +microblaze_supply_gregset (const struct microblaze_gregset *gregset, | 192 | +microblaze_supply_gregset (const struct regset *regset, |
| 249 | + struct regcache *regcache, | 193 | + struct regcache *regcache, |
| 250 | + int regnum, const void *gregs) | 194 | + int regnum, const void *gregs) |
| 251 | +{ | 195 | +{ |
| 252 | + unsigned int *regs = gregs; | 196 | + const unsigned int *regs = (const unsigned int *)gregs; |
| 253 | + if (regnum >= 0) | 197 | + if (regnum >= 0) |
| 254 | + regcache_raw_supply (regcache, regnum, regs + regnum); | 198 | + regcache->raw_supply (regnum, regs + regnum); |
| 255 | + | 199 | + |
| 256 | + if (regnum == -1) { | 200 | + if (regnum == -1) { |
| 257 | + int i; | 201 | + int i; |
| 258 | + | 202 | + |
| 259 | + for (i = 0; i < 50; i++) { | 203 | + for (i = 0; i < 50; i++) { |
| 260 | + regcache_raw_supply (regcache, i, regs + i); | 204 | + regcache->raw_supply (i, regs + i); |
| 261 | + } | 205 | + } |
| 262 | + } | 206 | + } |
| 263 | +} | 207 | +} |
| 264 | + | 208 | + |
| 265 | + | 209 | + |
| 266 | +void | ||
| 267 | +microblaze_collect_gregset (const struct microblaze_gregset *gregset, | ||
| 268 | + const struct regcache *regcache, | ||
| 269 | + int regnum, void *gregs) | ||
| 270 | +{ | ||
| 271 | + /* FIXME. */ | ||
| 272 | +} | ||
| 273 | + | ||
| 274 | +void | ||
| 275 | +microblaze_supply_fpregset (struct regcache *regcache, | ||
| 276 | + int regnum, const void *fpregs) | ||
| 277 | +{ | ||
| 278 | + /* FIXME. */ | ||
| 279 | +} | ||
| 280 | + | ||
| 281 | +void | ||
| 282 | +microblaze_collect_fpregset (const struct regcache *regcache, | ||
| 283 | + int regnum, void *fpregs) | ||
| 284 | +{ | ||
| 285 | + /* FIXME. */ | ||
| 286 | +} | ||
| 287 | + | ||
| 288 | + | ||
| 289 | +/* Return the appropriate register set for the core section identified | 210 | +/* Return the appropriate register set for the core section identified |
| 290 | + by SECT_NAME and SECT_SIZE. */ | 211 | + by SECT_NAME and SECT_SIZE. */ |
| 291 | + | 212 | + |
| 292 | +const struct regset * | 213 | +static void |
| 293 | +microblaze_regset_from_core_section (struct gdbarch *gdbarch, | 214 | +microblaze_iterate_over_regset_sections (struct gdbarch *gdbarch, |
| 294 | + const char *sect_name, size_t sect_size) | 215 | + iterate_over_regset_sections_cb *cb, |
| 216 | + void *cb_data, | ||
| 217 | + const struct regcache *regcache) | ||
| 295 | +{ | 218 | +{ |
| 296 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | 219 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); |
| 297 | + | 220 | + |
| 298 | + microblaze_debug ("microblaze_regset_from_core_section, sect_name = %s\n", sect_name); | 221 | + cb(".reg", tdep->sizeof_gregset, tdep->sizeof_gregset, tdep->gregset, NULL, cb_data); |
| 299 | + | ||
| 300 | + if (strcmp (sect_name, ".reg") == 0 && sect_size >= tdep->sizeof_gregset) | ||
| 301 | + return tdep->gregset; | ||
| 302 | + | ||
| 303 | + if (strcmp (sect_name, ".reg2") == 0 && sect_size >= tdep->sizeof_fpregset) | ||
| 304 | + return tdep->fpregset; | ||
| 305 | + | 222 | + |
| 306 | + microblaze_debug ("microblaze_regset_from_core_section returning null :-( \n"); | 223 | + cb(".reg2", tdep->sizeof_fpregset, tdep->sizeof_fpregset, tdep->fpregset, NULL, cb_data); |
| 307 | + return NULL; | ||
| 308 | +} | 224 | +} |
| 309 | + | 225 | + |
| 310 | + | 226 | + |
| @@ -312,7 +228,7 @@ index 443adfb364..1b5cf38e45 100644 | |||
| 312 | static struct gdbarch * | 228 | static struct gdbarch * |
| 313 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 229 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
| 314 | { | 230 | { |
| 315 | @@ -733,6 +812,10 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 231 | @@ -731,6 +768,10 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
| 316 | tdep = XCNEW (struct gdbarch_tdep); | 232 | tdep = XCNEW (struct gdbarch_tdep); |
| 317 | gdbarch = gdbarch_alloc (&info, tdep); | 233 | gdbarch = gdbarch_alloc (&info, tdep); |
| 318 | 234 | ||
| @@ -323,22 +239,22 @@ index 443adfb364..1b5cf38e45 100644 | |||
| 323 | set_gdbarch_long_double_bit (gdbarch, 128); | 239 | set_gdbarch_long_double_bit (gdbarch, 128); |
| 324 | 240 | ||
| 325 | set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS); | 241 | set_gdbarch_num_regs (gdbarch, MICROBLAZE_NUM_REGS); |
| 326 | @@ -781,6 +864,13 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | 242 | @@ -779,6 +820,13 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) |
| 327 | frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); | 243 | frame_base_append_sniffer (gdbarch, dwarf2_frame_base_sniffer); |
| 328 | if (tdesc_data != NULL) | 244 | if (tdesc_data != NULL) |
| 329 | tdesc_use_registers (gdbarch, tdesc, tdesc_data); | 245 | tdesc_use_registers (gdbarch, tdesc, std::move (tdesc_data)); |
| 330 | + //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); | 246 | + //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); |
| 331 | + | 247 | + |
| 332 | + /* If we have register sets, enable the generic core file support. */ | 248 | + /* If we have register sets, enable the generic core file support. */ |
| 333 | + if (tdep->gregset) { | 249 | + if (tdep->gregset) { |
| 334 | + set_gdbarch_regset_from_core_section (gdbarch, | 250 | + set_gdbarch_iterate_over_regset_sections (gdbarch, |
| 335 | + microblaze_regset_from_core_section); | 251 | + microblaze_iterate_over_regset_sections); |
| 336 | + } | 252 | + } |
| 337 | 253 | ||
| 338 | return gdbarch; | 254 | return gdbarch; |
| 339 | } | 255 | } |
| 340 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | 256 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h |
| 341 | index db0772643d..de66a05cab 100644 | 257 | index 8a429cbf001..e91991b8dba 100644 |
| 342 | --- a/gdb/microblaze-tdep.h | 258 | --- a/gdb/microblaze-tdep.h |
| 343 | +++ b/gdb/microblaze-tdep.h | 259 | +++ b/gdb/microblaze-tdep.h |
| 344 | @@ -22,8 +22,22 @@ | 260 | @@ -22,8 +22,22 @@ |
| @@ -368,10 +284,10 @@ index db0772643d..de66a05cab 100644 | |||
| 368 | #define MICROBLAZE_BREAKPOINT {0xba, 0x0c, 0x00, 0x18} | 284 | #define MICROBLAZE_BREAKPOINT {0xba, 0x0c, 0x00, 0x18} |
| 369 | #define MICROBLAZE_BREAKPOINT_LE {0x18, 0x00, 0x0c, 0xba} | 285 | #define MICROBLAZE_BREAKPOINT_LE {0x18, 0x00, 0x0c, 0xba} |
| 370 | 286 | ||
| 371 | +extern void microblaze_supply_gregset (const struct microblaze_gregset *gregset, | 287 | +extern void microblaze_supply_gregset (const struct regset *regset, |
| 372 | + struct regcache *regcache, | 288 | + struct regcache *regcache, |
| 373 | + int regnum, const void *gregs); | 289 | + int regnum, const void *gregs); |
| 374 | +extern void microblaze_collect_gregset (const struct microblaze_gregset *gregset, | 290 | +extern void microblaze_collect_gregset (const struct regset *regset, |
| 375 | + const struct regcache *regcache, | 291 | + const struct regcache *regcache, |
| 376 | + int regnum, void *gregs); | 292 | + int regnum, void *gregs); |
| 377 | +extern void microblaze_supply_fpregset (struct regcache *regcache, | 293 | +extern void microblaze_supply_fpregset (struct regcache *regcache, |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0035-Fix-debug-message-when-register-is-unavailable.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0035-Fix-debug-message-when-register-is-unavailable.patch index 4c26f259..9326e2c0 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0035-Fix-debug-message-when-register-is-unavailable.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0035-Fix-debug-message-when-register-is-unavailable.patch | |||
| @@ -1,18 +1,21 @@ | |||
| 1 | From bc2b702d7f73a231bd67c60465137fe37f67479a Mon Sep 17 00:00:00 2001 | 1 | From 59fd18d5155ffe8924ed24283def8ef434067909 Mon Sep 17 00:00:00 2001 |
| 2 | From: Nathan Rossi <nathan.rossi@petalogix.com> | 2 | From: Nathan Rossi <nathan.rossi@petalogix.com> |
| 3 | Date: Tue, 8 May 2012 18:11:17 +1000 | 3 | Date: Tue, 8 May 2012 18:11:17 +1000 |
| 4 | Subject: [PATCH 35/52] Fix debug message when register is unavailable | 4 | Subject: [PATCH 35/38] Fix debug message when register is unavailable |
| 5 | 5 | ||
| 6 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> | 6 | Signed-off-by: Nathan Rossi <nathan.rossi@petalogix.com> |
| 7 | |||
| 8 | Conflicts: | ||
| 9 | gdb/frame.c | ||
| 7 | --- | 10 | --- |
| 8 | gdb/frame.c | 13 ++++++++++--- | 11 | gdb/frame.c | 9 ++++++++- |
| 9 | 1 file changed, 10 insertions(+), 3 deletions(-) | 12 | 1 file changed, 8 insertions(+), 1 deletion(-) |
| 10 | 13 | ||
| 11 | diff --git a/gdb/frame.c b/gdb/frame.c | 14 | diff --git a/gdb/frame.c b/gdb/frame.c |
| 12 | index ff27b9f00e..bf931b370c 100644 | 15 | index 3f2d2700541..d557a093f63 100644 |
| 13 | --- a/gdb/frame.c | 16 | --- a/gdb/frame.c |
| 14 | +++ b/gdb/frame.c | 17 | +++ b/gdb/frame.c |
| 15 | @@ -1263,12 +1263,19 @@ frame_unwind_register_value (frame_info *next_frame, int regnum) | 18 | @@ -1261,12 +1261,19 @@ frame_unwind_register_value (frame_info *next_frame, int regnum) |
| 16 | else | 19 | else |
| 17 | { | 20 | { |
| 18 | int i; | 21 | int i; |
| @@ -22,17 +25,15 @@ index ff27b9f00e..bf931b370c 100644 | |||
| 22 | + buf = value_contents (value); | 25 | + buf = value_contents (value); |
| 23 | + } | 26 | + } |
| 24 | 27 | ||
| 25 | fprintf_unfiltered (gdb_stdlog, " bytes="); | 28 | fprintf_unfiltered (&debug_file, " bytes="); |
| 26 | fprintf_unfiltered (gdb_stdlog, "["); | 29 | fprintf_unfiltered (&debug_file, "["); |
| 27 | - for (i = 0; i < register_size (gdbarch, regnum); i++) | ||
| 28 | - fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]); | ||
| 29 | + if (buf != NULL) { | 30 | + if (buf != NULL) { |
| 30 | + for (i = 0; i < register_size (gdbarch, regnum); i++) | 31 | for (i = 0; i < register_size (gdbarch, regnum); i++) |
| 31 | + fprintf_unfiltered (gdb_stdlog, "%02x", buf[i]); | 32 | fprintf_unfiltered (&debug_file, "%02x", buf[i]); |
| 32 | + } else { | 33 | + } else { |
| 33 | + fprintf_unfiltered (gdb_stdlog, "unavailable"); | 34 | + fprintf_unfiltered (&debug_file, "unavailable"); |
| 34 | + } | 35 | + } |
| 35 | fprintf_unfiltered (gdb_stdlog, "]"); | 36 | fprintf_unfiltered (&debug_file, "]"); |
| 36 | } | 37 | } |
| 37 | } | 38 | } |
| 38 | -- | 39 | -- |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0038-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0036-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch index dede70e8..350dd8c0 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0038-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0036-microblaze-Add-build_gdbserver-yes-to-top-level-conf.patch | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | From 463a2d331ab68484913a2957614e852eac793583 Mon Sep 17 00:00:00 2001 | 1 | From 112d69b1bcebf14e37049a9795ce7128e98c1a23 Mon Sep 17 00:00:00 2001 |
| 2 | From: David Holsgrove <david.holsgrove@xilinx.com> | 2 | From: David Holsgrove <david.holsgrove@xilinx.com> |
| 3 | Date: Mon, 16 Dec 2013 16:37:32 +1000 | 3 | Date: Mon, 16 Dec 2013 16:37:32 +1000 |
| 4 | Subject: [PATCH 38/52] microblaze: Add build_gdbserver=yes to top level | 4 | Subject: [PATCH 36/38] microblaze: Add build_gdbserver=yes to top level |
| 5 | configure.tgt | 5 | configure.tgt |
| 6 | 6 | ||
| 7 | For Microblaze linux toolchains, set the build_gdbserver=yes | 7 | For Microblaze linux toolchains, set the build_gdbserver=yes |
| @@ -16,10 +16,10 @@ Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | |||
| 16 | 1 file changed, 1 insertion(+) | 16 | 1 file changed, 1 insertion(+) |
| 17 | 17 | ||
| 18 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt | 18 | diff --git a/gdb/configure.tgt b/gdb/configure.tgt |
| 19 | index 2938fddfe8..ac2d35a991 100644 | 19 | index 95095e98706..47497ac3d39 100644 |
| 20 | --- a/gdb/configure.tgt | 20 | --- a/gdb/configure.tgt |
| 21 | +++ b/gdb/configure.tgt | 21 | +++ b/gdb/configure.tgt |
| 22 | @@ -397,6 +397,7 @@ microblaze*-*-*) | 22 | @@ -407,6 +407,7 @@ microblaze*-*-*) |
| 23 | # Target: Xilinx MicroBlaze running standalone | 23 | # Target: Xilinx MicroBlaze running standalone |
| 24 | gdb_target_obs="microblaze-tdep.o" | 24 | gdb_target_obs="microblaze-tdep.o" |
| 25 | gdb_sim=../sim/microblaze/libsim.a | 25 | gdb_sim=../sim/microblaze/libsim.a |
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0036-revert-master-rebase-changes-to-gdbserver.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0036-revert-master-rebase-changes-to-gdbserver.patch deleted file mode 100644 index 81f55f76..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0036-revert-master-rebase-changes-to-gdbserver.patch +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | From c84c1a62142bcd18c242ec476539f0c505285d6c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: David Holsgrove <david.holsgrove@xilinx.com> | ||
| 3 | Date: Mon, 22 Jul 2013 11:16:05 +1000 | ||
| 4 | Subject: [PATCH 36/52] revert master-rebase changes to gdbserver | ||
| 5 | |||
| 6 | Signed-off-by: David Holsgrove <david.holsgrove@xilinx.com> | ||
| 7 | --- | ||
| 8 | gdbserver/configure.srv | 7 +++++++ | ||
| 9 | 1 file changed, 7 insertions(+) | ||
| 10 | |||
| 11 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv | ||
| 12 | index 5e33bd9c54..7e81388850 100644 | ||
| 13 | --- a/gdbserver/configure.srv | ||
| 14 | +++ b/gdbserver/configure.srv | ||
| 15 | @@ -155,6 +155,13 @@ case "${gdbserver_host}" in | ||
| 16 | srv_linux_usrregs=yes | ||
| 17 | srv_linux_thread_db=yes | ||
| 18 | ;; | ||
| 19 | + microblaze*-*-linux*) srv_regobj=microblaze-linux.o | ||
| 20 | + srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " | ||
| 21 | + srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" | ||
| 22 | + srv_linux_regsets=yes | ||
| 23 | + srv_linux_usrregs=yes | ||
| 24 | + srv_linux_thread_db=yes | ||
| 25 | + ;; | ||
| 26 | powerpc*-*-linux*) srv_regobj="powerpc-32l.o" | ||
| 27 | srv_regobj="${srv_regobj} powerpc-altivec32l.o" | ||
| 28 | srv_regobj="${srv_regobj} powerpc-vsx32l.o" | ||
| 29 | -- | ||
| 30 | 2.17.1 | ||
| 31 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0040-Fixing-the-issues-related-to-GDB-7.12-added-all-the-.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0037-Fixing-the-issues-related-to-GDB-7.12.patch index e08f16df..14ebbb63 100644 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0040-Fixing-the-issues-related-to-GDB-7.12-added-all-the-.patch +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0037-Fixing-the-issues-related-to-GDB-7.12.patch | |||
| @@ -1,157 +1,56 @@ | |||
| 1 | From 976a0e2664559cc194eee8040280cd29e2672d26 Mon Sep 17 00:00:00 2001 | 1 | From 3d14409964a92753c3176b6af84ba4c80011237f Mon Sep 17 00:00:00 2001 |
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | 2 | From: Nagaraju Mekala <nmekala@xilix.com> |
| 3 | Date: Fri, 17 Feb 2017 14:09:40 +0530 | 3 | Date: Fri, 17 Feb 2017 14:09:40 +0530 |
| 4 | Subject: [PATCH 40/52] Fixing the issues related to GDB-7.12 added all the | 4 | Subject: [PATCH 37/38] Fixing the issues related to GDB-7.12 |
| 5 | required function which are new in 7.12 and removed few deprecated functions | ||
| 6 | from 7.6 | ||
| 7 | 5 | ||
| 6 | added all the required function which are new in 7.12 and removed | ||
| 7 | few deprecated functions from 7.6 | ||
| 8 | |||
| 9 | Conflicts: | ||
| 10 | gdb/config/microblaze/linux.mh | ||
| 8 | --- | 11 | --- |
| 9 | gdb/config/microblaze/linux.mh | 4 +- | 12 | gdb/config/microblaze/linux.mh | 11 ++++ |
| 10 | gdb/microblaze-linux-tdep.c | 68 ++++++++++++++++++++-- | 13 | gdb/gdbserver/configure.srv | 3 +- |
| 11 | gdb/microblaze-tdep.h | 1 + | 14 | gdb/gdbserver/linux-microblaze-low.c | 97 ++++++++++++++++++++++++---- |
| 12 | gdbserver/configure.srv | 3 +- | 15 | gdb/microblaze-tdep.h | 1 + |
| 13 | gdbserver/linux-microblaze-low.c | 97 +++++++++++++++++++++++++++----- | 16 | 4 files changed, 97 insertions(+), 15 deletions(-) |
| 14 | 5 files changed, 153 insertions(+), 20 deletions(-) | 17 | create mode 100644 gdb/config/microblaze/linux.mh |
| 15 | 18 | ||
| 16 | diff --git a/gdb/config/microblaze/linux.mh b/gdb/config/microblaze/linux.mh | 19 | diff --git a/gdb/config/microblaze/linux.mh b/gdb/config/microblaze/linux.mh |
| 17 | index a4eaf540e1..74a53b854a 100644 | 20 | new file mode 100644 |
| 18 | --- a/gdb/config/microblaze/linux.mh | 21 | index 00000000000..74a53b854a4 |
| 22 | --- /dev/null | ||
| 19 | +++ b/gdb/config/microblaze/linux.mh | 23 | +++ b/gdb/config/microblaze/linux.mh |
| 20 | @@ -1,9 +1,11 @@ | 24 | @@ -0,0 +1,11 @@ |
| 21 | # Host: Microblaze, running Linux | 25 | +# Host: Microblaze, running Linux |
| 22 | 26 | + | |
| 23 | +#linux-nat.o linux-waitpid.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o | 27 | +#linux-nat.o linux-waitpid.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o |
| 24 | NAT_FILE= config/nm-linux.h | 28 | +NAT_FILE= config/nm-linux.h |
| 25 | NATDEPFILES= inf-ptrace.o fork-child.o \ | 29 | +NATDEPFILES= inf-ptrace.o fork-child.o \ |
| 26 | microblaze-linux-nat.o proc-service.o linux-thread-db.o \ | 30 | + microblaze-linux-nat.o proc-service.o linux-thread-db.o \ |
| 27 | - linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o | ||
| 28 | + linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ | 31 | + linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o \ |
| 29 | + linux-waitpid.o linux-personality.o linux-namespaces.o | 32 | + linux-waitpid.o linux-personality.o linux-namespaces.o |
| 30 | NAT_CDEPS = $(srcdir)/proc-service.list | 33 | +NAT_CDEPS = $(srcdir)/proc-service.list |
| 31 | 34 | + | |
| 32 | LOADLIBES = -ldl $(RDYNAMIC) | 35 | +LOADLIBES = -ldl $(RDYNAMIC) |
| 33 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | 36 | diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv |
| 34 | index 2725ce1789..a2e858d10f 100644 | 37 | index e0d2b2fe04a..26db2dd2461 100644 |
| 35 | --- a/gdb/microblaze-linux-tdep.c | 38 | --- a/gdb/gdbserver/configure.srv |
| 36 | +++ b/gdb/microblaze-linux-tdep.c | 39 | +++ b/gdb/gdbserver/configure.srv |
| 37 | @@ -29,13 +29,76 @@ | 40 | @@ -185,8 +185,7 @@ case "${target}" in |
| 38 | #include "regcache.h" | ||
| 39 | #include "value.h" | ||
| 40 | #include "osabi.h" | ||
| 41 | -#include "regset.h" | ||
| 42 | #include "solib-svr4.h" | ||
| 43 | #include "microblaze-tdep.h" | ||
| 44 | #include "trad-frame.h" | ||
| 45 | #include "frame-unwind.h" | ||
| 46 | #include "tramp-frame.h" | ||
| 47 | #include "linux-tdep.h" | ||
| 48 | +#include "glibc-tdep.h" | ||
| 49 | + | ||
| 50 | +#include "gdb_assert.h" | ||
| 51 | + | ||
| 52 | +#ifndef REGSET_H | ||
| 53 | +#define REGSET_H 1 | ||
| 54 | + | ||
| 55 | +struct gdbarch; | ||
| 56 | +struct regcache; | ||
| 57 | + | ||
| 58 | +/* Data structure for the supported register notes in a core file. */ | ||
| 59 | +struct core_regset_section | ||
| 60 | +{ | ||
| 61 | + const char *sect_name; | ||
| 62 | + int size; | ||
| 63 | + const char *human_name; | ||
| 64 | +}; | ||
| 65 | + | ||
| 66 | +/* Data structure describing a register set. */ | ||
| 67 | + | ||
| 68 | +typedef void (supply_regset_ftype) (const struct regset *, struct regcache *, | ||
| 69 | + int, const void *, size_t); | ||
| 70 | +typedef void (collect_regset_ftype) (const struct regset *, | ||
| 71 | + const struct regcache *, | ||
| 72 | + int, void *, size_t); | ||
| 73 | + | ||
| 74 | +struct regset | ||
| 75 | +{ | ||
| 76 | + /* Data pointer for private use by the methods below, presumably | ||
| 77 | + providing some sort of description of the register set. */ | ||
| 78 | + const void *descr; | ||
| 79 | + | ||
| 80 | + /* Function supplying values in a register set to a register cache. */ | ||
| 81 | + supply_regset_ftype *supply_regset; | ||
| 82 | + | ||
| 83 | + /* Function collecting values in a register set from a register cache. */ | ||
| 84 | + collect_regset_ftype *collect_regset; | ||
| 85 | + | ||
| 86 | + /* Architecture associated with the register set. */ | ||
| 87 | + struct gdbarch *arch; | ||
| 88 | +}; | ||
| 89 | + | ||
| 90 | +#endif | ||
| 91 | + | ||
| 92 | +/* Allocate a fresh 'struct regset' whose supply_regset function is | ||
| 93 | + SUPPLY_REGSET, and whose collect_regset function is COLLECT_REGSET. | ||
| 94 | + If the regset has no collect_regset function, pass NULL for | ||
| 95 | + COLLECT_REGSET. | ||
| 96 | + | ||
| 97 | + The object returned is allocated on ARCH's obstack. */ | ||
| 98 | + | ||
| 99 | +struct regset * | ||
| 100 | +regset_alloc (struct gdbarch *arch, | ||
| 101 | + supply_regset_ftype *supply_regset, | ||
| 102 | + collect_regset_ftype *collect_regset) | ||
| 103 | +{ | ||
| 104 | + struct regset *regset = GDBARCH_OBSTACK_ZALLOC (arch, struct regset); | ||
| 105 | + | ||
| 106 | + regset->arch = arch; | ||
| 107 | + regset->supply_regset = supply_regset; | ||
| 108 | + regset->collect_regset = collect_regset; | ||
| 109 | + | ||
| 110 | + return regset; | ||
| 111 | +} | ||
| 112 | |||
| 113 | static int microblaze_debug_flag = 0; | ||
| 114 | |||
| 115 | @@ -207,9 +270,6 @@ microblaze_linux_init_abi (struct gdbarch_info info, | ||
| 116 | set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); | ||
| 117 | set_gdbarch_skip_solib_resolver (gdbarch, glibc_skip_solib_resolver); | ||
| 118 | |||
| 119 | - set_gdbarch_regset_from_core_section (gdbarch, | ||
| 120 | - microblaze_regset_from_core_section); | ||
| 121 | - | ||
| 122 | /* Enable TLS support. */ | ||
| 123 | set_gdbarch_fetch_tls_load_module_address (gdbarch, | ||
| 124 | svr4_fetch_objfile_link_map); | ||
| 125 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
| 126 | index de66a05cab..1234f8a36f 100644 | ||
| 127 | --- a/gdb/microblaze-tdep.h | ||
| 128 | +++ b/gdb/microblaze-tdep.h | ||
| 129 | @@ -24,6 +24,7 @@ | ||
| 130 | /* Microblaze architecture-specific information. */ | ||
| 131 | struct microblaze_gregset | ||
| 132 | { | ||
| 133 | + microblaze_gregset() {} | ||
| 134 | unsigned int gregs[32]; | ||
| 135 | unsigned int fpregs[32]; | ||
| 136 | unsigned int pregs[16]; | ||
| 137 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv | ||
| 138 | index 7e81388850..456f4b3349 100644 | ||
| 139 | --- a/gdbserver/configure.srv | ||
| 140 | +++ b/gdbserver/configure.srv | ||
| 141 | @@ -156,8 +156,7 @@ case "${gdbserver_host}" in | ||
| 142 | srv_linux_thread_db=yes | 41 | srv_linux_thread_db=yes |
| 143 | ;; | 42 | ;; |
| 144 | microblaze*-*-linux*) srv_regobj=microblaze-linux.o | 43 | microblaze*-*-linux*) srv_regobj="microblaze-linux.o" |
| 145 | - srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " | 44 | - srv_tgtobj="linux-low.o linux-osdata.o linux-microblaze-low.o " |
| 146 | - srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" | 45 | - srv_tgtobj="${srv_tgtobj} linux-procfs.o linux-ptrace.o" |
| 147 | + srv_tgtobj="$srv_linux_obj linux-microblaze-low.o " | 46 | + srv_tgtobj="$srv_linux_obj linux-microblaze-low.o " |
| 47 | srv_xmlfiles="microblaze-linux.xml" | ||
| 148 | srv_linux_regsets=yes | 48 | srv_linux_regsets=yes |
| 149 | srv_linux_usrregs=yes | 49 | srv_linux_usrregs=yes |
| 150 | srv_linux_thread_db=yes | 50 | diff --git a/gdb/gdbserver/linux-microblaze-low.c b/gdb/gdbserver/linux-microblaze-low.c |
| 151 | diff --git a/gdbserver/linux-microblaze-low.c b/gdbserver/linux-microblaze-low.c | 51 | index cba5d6fc585..a2733f3c21c 100644 |
| 152 | index cba5d6fc58..a2733f3c21 100644 | 52 | --- a/gdb/gdbserver/linux-microblaze-low.c |
| 153 | --- a/gdbserver/linux-microblaze-low.c | 53 | +++ b/gdb/gdbserver/linux-microblaze-low.c |
| 154 | +++ b/gdbserver/linux-microblaze-low.c | ||
| 155 | @@ -39,10 +39,11 @@ static int microblaze_regmap[] = | 54 | @@ -39,10 +39,11 @@ static int microblaze_regmap[] = |
| 156 | PT_FSR | 55 | PT_FSR |
| 157 | }; | 56 | }; |
| @@ -304,6 +203,18 @@ index cba5d6fc58..a2733f3c21 100644 | |||
| 304 | +{ | 203 | +{ |
| 305 | + init_registers_microblaze (); | 204 | + init_registers_microblaze (); |
| 306 | +} | 205 | +} |
| 206 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
| 207 | index e91991b8dba..872a3931f20 100644 | ||
| 208 | --- a/gdb/microblaze-tdep.h | ||
| 209 | +++ b/gdb/microblaze-tdep.h | ||
| 210 | @@ -24,6 +24,7 @@ | ||
| 211 | /* Microblaze architecture-specific information. */ | ||
| 212 | struct microblaze_gregset | ||
| 213 | { | ||
| 214 | + microblaze_gregset() {} | ||
| 215 | unsigned int gregs[32]; | ||
| 216 | unsigned int fpregs[32]; | ||
| 217 | unsigned int pregs[16]; | ||
| 307 | -- | 218 | -- |
| 308 | 2.17.1 | 219 | 2.17.1 |
| 309 | 220 | ||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0037-revert-master-rebase-changes-to-gdbserver-previous-c.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0037-revert-master-rebase-changes-to-gdbserver-previous-c.patch deleted file mode 100644 index 24ae7a8c..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0037-revert-master-rebase-changes-to-gdbserver-previous-c.patch +++ /dev/null | |||
| @@ -1,36 +0,0 @@ | |||
| 1 | From 06f1e66daaa1c8a2e1e43254a66f35840945e63b Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Mon, 30 Apr 2018 17:09:55 +0530 | ||
| 4 | Subject: [PATCH 37/52] revert master-rebase changes to gdbserver , previous | ||
| 5 | commit typo's | ||
| 6 | |||
| 7 | Note: This _WILL NOT WORK_, the format of the files in gdbserver have changed! | ||
| 8 | |||
| 9 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 10 | --- | ||
| 11 | gdbserver/Makefile.in | 2 ++ | ||
| 12 | 1 file changed, 2 insertions(+) | ||
| 13 | |||
| 14 | diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in | ||
| 15 | index 9d7687be53..df354d636c 100644 | ||
| 16 | --- a/gdbserver/Makefile.in | ||
| 17 | +++ b/gdbserver/Makefile.in | ||
| 18 | @@ -183,6 +183,7 @@ SFILES = \ | ||
| 19 | $(srcdir)/linux-ia64-low.cc \ | ||
| 20 | $(srcdir)/linux-low.cc \ | ||
| 21 | $(srcdir)/linux-m68k-low.cc \ | ||
| 22 | + $(srcdir)/linux-microblaze-low.c \ | ||
| 23 | $(srcdir)/linux-mips-low.cc \ | ||
| 24 | $(srcdir)/linux-nios2-low.cc \ | ||
| 25 | $(srcdir)/linux-ppc-low.cc \ | ||
| 26 | @@ -217,6 +218,7 @@ SFILES = \ | ||
| 27 | $(srcdir)/../gdb/nat/linux-osdata.c \ | ||
| 28 | $(srcdir)/../gdb/nat/linux-personality.c \ | ||
| 29 | $(srcdir)/../gdb/nat/mips-linux-watch.c \ | ||
| 30 | + $(srcdir)/../gdb/nat/microblaze-linux.c \ | ||
| 31 | $(srcdir)/../gdb/nat/ppc-linux.c \ | ||
| 32 | $(srcdir)/../gdb/nat/riscv-linux-tdesc.c \ | ||
| 33 | $(srcdir)/../gdb/nat/fork-inferior.c \ | ||
| 34 | -- | ||
| 35 | 2.17.1 | ||
| 36 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0038-Patch-MB-MB-binutils-Upstream-port-issues.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0038-Patch-MB-MB-binutils-Upstream-port-issues.patch new file mode 100644 index 00000000..1fb73946 --- /dev/null +++ b/meta-microblaze/recipes-devtools/binutils/binutils/0038-Patch-MB-MB-binutils-Upstream-port-issues.patch | |||
| @@ -0,0 +1,556 @@ | |||
| 1 | From 5e492aae0baf2ed8593c2fb2df03c54fbb180e57 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Sun, 28 Nov 2021 17:17:15 +0530 | ||
| 4 | Subject: [PATCH 38/38] [Patch,MB]: MB binutils Upstream port issues. | ||
| 5 | |||
| 6 | --- | ||
| 7 | bfd/elf64-microblaze.c | 266 ++++++++++++++++++++++++++++--------- | ||
| 8 | gas/config/tc-microblaze.c | 2 +- | ||
| 9 | opcodes/microblaze-dis.c | 12 +- | ||
| 10 | opcodes/microblaze-opc.h | 2 +- | ||
| 11 | 4 files changed, 208 insertions(+), 74 deletions(-) | ||
| 12 | |||
| 13 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | ||
| 14 | index 4d41ddbd953..210b84b2a50 100644 | ||
| 15 | --- a/bfd/elf64-microblaze.c | ||
| 16 | +++ b/bfd/elf64-microblaze.c | ||
| 17 | @@ -767,12 +767,35 @@ microblaze_elf_is_local_label_name (bfd *abfd, const char *name) | ||
| 18 | return _bfd_elf_is_local_label_name (abfd, name); | ||
| 19 | } | ||
| 20 | |||
| 21 | +/* The microblaze linker (like many others) needs to keep track of | ||
| 22 | + the number of relocs that it decides to copy as dynamic relocs in | ||
| 23 | + check_relocs for each symbol. This is so that it can later discard | ||
| 24 | + them if they are found to be unnecessary. We store the information | ||
| 25 | + in a field extending the regular ELF linker hash table. */ | ||
| 26 | + | ||
| 27 | +struct elf64_mb_dyn_relocs | ||
| 28 | +{ | ||
| 29 | + struct elf64_mb_dyn_relocs *next; | ||
| 30 | + | ||
| 31 | + /* The input section of the reloc. */ | ||
| 32 | + asection *sec; | ||
| 33 | + | ||
| 34 | + /* Total number of relocs copied for the input section. */ | ||
| 35 | + bfd_size_type count; | ||
| 36 | + | ||
| 37 | + /* Number of pc-relative relocs copied for the input section. */ | ||
| 38 | + bfd_size_type pc_count; | ||
| 39 | +}; | ||
| 40 | + | ||
| 41 | /* ELF linker hash entry. */ | ||
| 42 | |||
| 43 | struct elf64_mb_link_hash_entry | ||
| 44 | { | ||
| 45 | struct elf_link_hash_entry elf; | ||
| 46 | |||
| 47 | + /* Track dynamic relocs copied for this symbol. */ | ||
| 48 | + struct elf64_mb_dyn_relocs *dyn_relocs; | ||
| 49 | + | ||
| 50 | /* TLS Reference Types for the symbol; Updated by check_relocs */ | ||
| 51 | #define TLS_GD 1 /* GD reloc. */ | ||
| 52 | #define TLS_LD 2 /* LD reloc. */ | ||
| 53 | @@ -796,6 +819,18 @@ struct elf64_mb_link_hash_table | ||
| 54 | { | ||
| 55 | struct elf_link_hash_table elf; | ||
| 56 | |||
| 57 | + /* Short-cuts to get to dynamic linker sections. */ | ||
| 58 | + asection *sgot; | ||
| 59 | + asection *sgotplt; | ||
| 60 | + asection *srelgot; | ||
| 61 | + asection *splt; | ||
| 62 | + asection *srelplt; | ||
| 63 | + asection *sdynbss; | ||
| 64 | + asection *srelbss; | ||
| 65 | + | ||
| 66 | + /* Small local sym to section mapping cache. */ | ||
| 67 | + struct sym_cache sym_sec; | ||
| 68 | + | ||
| 69 | /* TLS Local Dynamic GOT Entry */ | ||
| 70 | union { | ||
| 71 | bfd_signed_vma refcount; | ||
| 72 | @@ -1335,8 +1370,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 73 | /* Need to generate relocs ? */ | ||
| 74 | if ((bfd_link_pic (info) || indx != 0) | ||
| 75 | && (h == NULL | ||
| 76 | - || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT | ||
| 77 | - && !resolved_to_zero) | ||
| 78 | + || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT | ||
| 79 | || h->root.type != bfd_link_hash_undefweak)) | ||
| 80 | need_relocs = true; | ||
| 81 | |||
| 82 | @@ -1523,13 +1557,11 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 83 | contents + offset + endian); | ||
| 84 | } | ||
| 85 | else | ||
| 86 | - { | ||
| 87 | - bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 88 | - contents + offset + endian); | ||
| 89 | - bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 90 | - contents + offset + endian + INST_WORD_SIZE); | ||
| 91 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 92 | + contents + offset + endian); | ||
| 93 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 94 | + contents + offset + endian + INST_WORD_SIZE); | ||
| 95 | } | ||
| 96 | - } | ||
| 97 | break; | ||
| 98 | } | ||
| 99 | |||
| 100 | @@ -1619,9 +1651,16 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 101 | else | ||
| 102 | { | ||
| 103 | if (r_type == R_MICROBLAZE_64_PCREL) | ||
| 104 | + { | ||
| 105 | + if (!input_section->output_section->vma && | ||
| 106 | + !input_section->output_offset && !offset) | ||
| 107 | + relocation -= (input_section->output_section->vma | ||
| 108 | + + input_section->output_offset | ||
| 109 | + + offset); | ||
| 110 | + else | ||
| 111 | relocation -= (input_section->output_section->vma | ||
| 112 | - + input_section->output_offset | ||
| 113 | - + offset + INST_WORD_SIZE); | ||
| 114 | + + input_section->output_offset + offset + INST_WORD_SIZE); | ||
| 115 | + } | ||
| 116 | else if (r_type == R_MICROBLAZE_TEXTREL_64 | ||
| 117 | || r_type == R_MICROBLAZE_TEXTREL_32_LO) | ||
| 118 | relocation -= input_section->output_section->vma; | ||
| 119 | @@ -1640,14 +1679,11 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 120 | contents + offset + endian); | ||
| 121 | } | ||
| 122 | else | ||
| 123 | - { | ||
| 124 | - bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 125 | - contents + offset + endian); | ||
| 126 | - bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 127 | - contents + offset + endian | ||
| 128 | - + INST_WORD_SIZE); | ||
| 129 | - } | ||
| 130 | - } | ||
| 131 | + bfd_put_16 (input_bfd, (relocation >> 16) & 0xffff, | ||
| 132 | + contents + offset + endian); | ||
| 133 | + bfd_put_16 (input_bfd, relocation & 0xffff, | ||
| 134 | + contents + offset + endian + INST_WORD_SIZE); | ||
| 135 | + } | ||
| 136 | break; | ||
| 137 | } | ||
| 138 | } | ||
| 139 | @@ -1718,6 +1754,21 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 140 | |||
| 141 | return ret; | ||
| 142 | } | ||
| 143 | + | ||
| 144 | +/* Merge backend specific data from an object file to the output | ||
| 145 | + object file when linking. | ||
| 146 | + | ||
| 147 | + Note: We only use this hook to catch endian mismatches. */ | ||
| 148 | +static bool | ||
| 149 | +microblaze_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) | ||
| 150 | +{ | ||
| 151 | + /* Check if we have the same endianess. */ | ||
| 152 | + if (! _bfd_generic_verify_endian_match (ibfd, obfd)) | ||
| 153 | + return false; | ||
| 154 | + | ||
| 155 | + return true; | ||
| 156 | +} | ||
| 157 | + | ||
| 158 | |||
| 159 | /* Calculate fixup value for reference. */ | ||
| 160 | |||
| 161 | @@ -2391,8 +2442,11 @@ microblaze_elf_relax_section (bfd *abfd, | ||
| 162 | symtab_hdr->contents = (bfd_byte *) isymbuf; | ||
| 163 | } | ||
| 164 | |||
| 165 | - free (free_relocs); | ||
| 166 | - free_relocs = NULL; | ||
| 167 | + if (free_relocs != NULL) | ||
| 168 | + { | ||
| 169 | + free (free_relocs); | ||
| 170 | + free_relocs = NULL; | ||
| 171 | + } | ||
| 172 | |||
| 173 | if (free_contents != NULL) | ||
| 174 | { | ||
| 175 | @@ -2415,11 +2469,16 @@ microblaze_elf_relax_section (bfd *abfd, | ||
| 176 | return true; | ||
| 177 | |||
| 178 | error_return: | ||
| 179 | - free (free_relocs); | ||
| 180 | - free (free_contents); | ||
| 181 | - free (sec->relax); | ||
| 182 | - sec->relax = NULL; | ||
| 183 | - sec->relax_count = 0; | ||
| 184 | + if (free_relocs != NULL) | ||
| 185 | + free (free_relocs); | ||
| 186 | + if (free_contents != NULL) | ||
| 187 | + free (free_contents); | ||
| 188 | + if (sec->relax != NULL) | ||
| 189 | + { | ||
| 190 | + free (sec->relax); | ||
| 191 | + sec->relax = NULL; | ||
| 192 | + sec->relax_count = 0; | ||
| 193 | + } | ||
| 194 | return false; | ||
| 195 | } | ||
| 196 | |||
| 197 | @@ -2444,6 +2503,17 @@ microblaze_elf_gc_mark_hook (asection *sec, | ||
| 198 | return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); | ||
| 199 | } | ||
| 200 | |||
| 201 | +/* Update the got entry reference counts for the section being removed. */ | ||
| 202 | + | ||
| 203 | +static bool | ||
| 204 | +microblaze_elf_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 205 | + struct bfd_link_info * info ATTRIBUTE_UNUSED, | ||
| 206 | + asection * sec ATTRIBUTE_UNUSED, | ||
| 207 | + const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED) | ||
| 208 | +{ | ||
| 209 | + return true; | ||
| 210 | +} | ||
| 211 | + | ||
| 212 | /* PIC support. */ | ||
| 213 | |||
| 214 | #define PLT_ENTRY_SIZE 16 | ||
| 215 | @@ -2650,14 +2720,14 @@ microblaze_elf_check_relocs (bfd * abfd, | ||
| 216 | && (! info->symbolic | ||
| 217 | || h->root.type == bfd_link_hash_defweak | ||
| 218 | || !h->def_regular)))) | ||
| 219 | - || (!bfd_link_pic (info) | ||
| 220 | - && (sec->flags & SEC_ALLOC) != 0 | ||
| 221 | - && h != NULL | ||
| 222 | - && (h->root.type == bfd_link_hash_defweak | ||
| 223 | - || !h->def_regular))) | ||
| 224 | - { | ||
| 225 | - struct elf_dyn_relocs *p; | ||
| 226 | - struct elf_dyn_relocs **head; | ||
| 227 | + || (!bfd_link_pic (info) | ||
| 228 | + && (sec->flags & SEC_ALLOC) != 0 | ||
| 229 | + && h != NULL | ||
| 230 | + && (h->root.type == bfd_link_hash_defweak | ||
| 231 | + || !h->def_regular))) | ||
| 232 | + { | ||
| 233 | + struct elf64_mb_dyn_relocs *p; | ||
| 234 | + struct elf64_mb_dyn_relocs **head; | ||
| 235 | |||
| 236 | /* When creating a shared object, we must copy these | ||
| 237 | relocs into the output file. We create a reloc | ||
| 238 | @@ -2701,14 +2771,14 @@ microblaze_elf_check_relocs (bfd * abfd, | ||
| 239 | return false; | ||
| 240 | |||
| 241 | vpp = &elf_section_data (s)->local_dynrel; | ||
| 242 | - head = (struct elf_dyn_relocs **) vpp; | ||
| 243 | + head = (struct elf64_mb_dyn_relocs **) vpp; | ||
| 244 | } | ||
| 245 | |||
| 246 | p = *head; | ||
| 247 | if (p == NULL || p->sec != sec) | ||
| 248 | { | ||
| 249 | size_t amt = sizeof *p; | ||
| 250 | - p = ((struct elf_dyn_relocs *) | ||
| 251 | + p = ((struct elf64_mb_dyn_relocs *) | ||
| 252 | bfd_alloc (htab->elf.dynobj, amt)); | ||
| 253 | if (p == NULL) | ||
| 254 | return false; | ||
| 255 | @@ -2731,6 +2801,34 @@ microblaze_elf_check_relocs (bfd * abfd, | ||
| 256 | return true; | ||
| 257 | } | ||
| 258 | |||
| 259 | +static bool | ||
| 260 | +microblaze_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info) | ||
| 261 | +{ | ||
| 262 | + struct elf64_mb_link_hash_table *htab; | ||
| 263 | + | ||
| 264 | + htab = elf64_mb_hash_table (info); | ||
| 265 | + if (htab == NULL) | ||
| 266 | + return false; | ||
| 267 | + | ||
| 268 | + if (!htab->sgot && !_bfd_elf_create_got_section (dynobj, info)) | ||
| 269 | + return false; | ||
| 270 | + | ||
| 271 | + if (!_bfd_elf_create_dynamic_sections (dynobj, info)) | ||
| 272 | + return false; | ||
| 273 | + | ||
| 274 | + htab->splt = bfd_get_linker_section (dynobj, ".plt"); | ||
| 275 | + htab->srelplt = bfd_get_linker_section (dynobj, ".rela.plt"); | ||
| 276 | + htab->sdynbss = bfd_get_linker_section (dynobj, ".dynbss"); | ||
| 277 | + if (!bfd_link_pic (info)) | ||
| 278 | + htab->srelbss = bfd_get_linker_section (dynobj, ".rela.bss"); | ||
| 279 | + | ||
| 280 | + if (!htab->splt || !htab->srelplt || !htab->sdynbss | ||
| 281 | + || (!bfd_link_pic (info) && !htab->srelbss)) | ||
| 282 | + abort (); | ||
| 283 | + | ||
| 284 | + return true; | ||
| 285 | +} | ||
| 286 | + | ||
| 287 | /* Copy the extra info we tack onto an elf_link_hash_entry. */ | ||
| 288 | |||
| 289 | static void | ||
| 290 | @@ -2743,6 +2841,40 @@ microblaze_elf_copy_indirect_symbol (struct bfd_link_info *info, | ||
| 291 | edir = (struct elf64_mb_link_hash_entry *) dir; | ||
| 292 | eind = (struct elf64_mb_link_hash_entry *) ind; | ||
| 293 | |||
| 294 | + if (eind->dyn_relocs != NULL) | ||
| 295 | + { | ||
| 296 | + if (edir->dyn_relocs != NULL) | ||
| 297 | + { | ||
| 298 | + struct elf64_mb_dyn_relocs **pp; | ||
| 299 | + struct elf64_mb_dyn_relocs *p; | ||
| 300 | + | ||
| 301 | + if (ind->root.type == bfd_link_hash_indirect) | ||
| 302 | + abort (); | ||
| 303 | + | ||
| 304 | + /* Add reloc counts against the weak sym to the strong sym | ||
| 305 | + list. Merge any entries against the same section. */ | ||
| 306 | + for (pp = &eind->dyn_relocs; (p = *pp) != NULL; ) | ||
| 307 | + { | ||
| 308 | + struct elf64_mb_dyn_relocs *q; | ||
| 309 | + | ||
| 310 | + for (q = edir->dyn_relocs; q != NULL; q = q->next) | ||
| 311 | + if (q->sec == p->sec) | ||
| 312 | + { | ||
| 313 | + q->pc_count += p->pc_count; | ||
| 314 | + q->count += p->count; | ||
| 315 | + *pp = p->next; | ||
| 316 | + break; | ||
| 317 | + } | ||
| 318 | + if (q == NULL) | ||
| 319 | + pp = &p->next; | ||
| 320 | + } | ||
| 321 | + *pp = edir->dyn_relocs; | ||
| 322 | + } | ||
| 323 | + | ||
| 324 | + edir->dyn_relocs = eind->dyn_relocs; | ||
| 325 | + eind->dyn_relocs = NULL; | ||
| 326 | + } | ||
| 327 | + | ||
| 328 | edir->tls_mask |= eind->tls_mask; | ||
| 329 | |||
| 330 | _bfd_elf_link_hash_copy_indirect (info, dir, ind); | ||
| 331 | @@ -2828,9 +2960,17 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | ||
| 332 | return true; | ||
| 333 | } | ||
| 334 | |||
| 335 | - /* If we don't find any dynamic relocs in read-only sections, then | ||
| 336 | + eh = (struct elf64_mb_link_hash_entry *) h; | ||
| 337 | + for (p = eh->dyn_relocs; p != NULL; p = p->next) | ||
| 338 | + { | ||
| 339 | + s = p->sec->output_section; | ||
| 340 | + if (s != NULL && (s->flags & SEC_READONLY) != 0) | ||
| 341 | + break; | ||
| 342 | + } | ||
| 343 | + | ||
| 344 | + /* If we didn't find any dynamic relocs in read-only sections, then | ||
| 345 | we'll be keeping the dynamic relocs and avoiding the copy reloc. */ | ||
| 346 | - if (!_bfd_elf_readonly_dynrelocs (h)) | ||
| 347 | + if (p == NULL) | ||
| 348 | { | ||
| 349 | h->non_got_ref = 0; | ||
| 350 | return true; | ||
| 351 | @@ -2849,19 +2989,11 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | ||
| 352 | /* We must generate a R_MICROBLAZE_COPY reloc to tell the dynamic linker | ||
| 353 | to copy the initial value out of the dynamic object and into the | ||
| 354 | runtime process image. */ | ||
| 355 | - if ((h->root.u.def.section->flags & SEC_READONLY) != 0) | ||
| 356 | - { | ||
| 357 | - s = htab->elf.sdynrelro; | ||
| 358 | - srel = htab->elf.sreldynrelro; | ||
| 359 | - } | ||
| 360 | - else | ||
| 361 | - { | ||
| 362 | - s = htab->elf.sdynbss; | ||
| 363 | - srel = htab->elf.srelbss; | ||
| 364 | - } | ||
| 365 | + dynobj = elf_hash_table (info)->dynobj; | ||
| 366 | + BFD_ASSERT (dynobj != NULL); | ||
| 367 | if ((h->root.u.def.section->flags & SEC_ALLOC) != 0) | ||
| 368 | { | ||
| 369 | - srel->size += sizeof (Elf64_External_Rela); | ||
| 370 | + htab->srelbss->size += sizeof (Elf64_External_Rela); | ||
| 371 | h->needs_copy = 1; | ||
| 372 | } | ||
| 373 | |||
| 374 | @@ -2871,11 +3003,12 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | ||
| 375 | if (power_of_two > 3) | ||
| 376 | power_of_two = 3; | ||
| 377 | |||
| 378 | + sdynbss = htab->sdynbss; | ||
| 379 | /* Apply the required alignment. */ | ||
| 380 | - s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two)); | ||
| 381 | - if (power_of_two > s->alignment_power) | ||
| 382 | + sdynbss->size = BFD_ALIGN (sdynbss->size, (bfd_size_type) (1 << power_of_two)); | ||
| 383 | + if (power_of_two > sdynbss->alignment_power) | ||
| 384 | { | ||
| 385 | - if (!bfd_set_section_alignment (s, power_of_two)) | ||
| 386 | + if (! bfd_set_section_alignment (sdynbss, power_of_two)) | ||
| 387 | return false; | ||
| 388 | } | ||
| 389 | |||
| 390 | @@ -2897,7 +3030,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 391 | struct bfd_link_info *info; | ||
| 392 | struct elf64_mb_link_hash_table *htab; | ||
| 393 | struct elf64_mb_link_hash_entry *eh; | ||
| 394 | - struct elf_dyn_relocs *p; | ||
| 395 | + struct elf64_mb_dyn_relocs *p; | ||
| 396 | |||
| 397 | if (h->root.type == bfd_link_hash_indirect) | ||
| 398 | return true; | ||
| 399 | @@ -2949,7 +3082,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 400 | htab->elf.sgotplt->size += 4; | ||
| 401 | |||
| 402 | /* We also need to make an entry in the .rel.plt section. */ | ||
| 403 | - htab->elf.srelplt->size += sizeof (Elf32_External_Rela); | ||
| 404 | + htab->elf.srelplt->size += sizeof (Elf64_External_Rela); | ||
| 405 | } | ||
| 406 | else | ||
| 407 | { | ||
| 408 | @@ -3015,7 +3148,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 409 | else | ||
| 410 | h->got.offset = (bfd_vma) -1; | ||
| 411 | |||
| 412 | - if (h->dyn_relocs == NULL) | ||
| 413 | + if (eh->dyn_relocs == NULL) | ||
| 414 | return true; | ||
| 415 | |||
| 416 | /* In the shared -Bsymbolic case, discard space allocated for | ||
| 417 | @@ -3030,9 +3163,9 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 418 | && (h->forced_local | ||
| 419 | || info->symbolic)) | ||
| 420 | { | ||
| 421 | - struct elf_dyn_relocs **pp; | ||
| 422 | + struct elf64_mb_dyn_relocs **pp; | ||
| 423 | |||
| 424 | - for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) | ||
| 425 | + for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) | ||
| 426 | { | ||
| 427 | p->count -= p->pc_count; | ||
| 428 | p->pc_count = 0; | ||
| 429 | @@ -3124,7 +3257,7 @@ microblaze_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED, | ||
| 430 | { | ||
| 431 | struct elf_dyn_relocs *p; | ||
| 432 | |||
| 433 | - for (p = ((struct elf_dyn_relocs *) | ||
| 434 | + for (p = ((struct elf64_mb_dyn_relocs *) | ||
| 435 | elf_section_data (s)->local_dynrel); | ||
| 436 | p != NULL; | ||
| 437 | p = p->next) | ||
| 438 | @@ -3601,13 +3734,14 @@ microblaze_elf_add_symbol_hook (bfd *abfd, | ||
| 439 | #define bfd_elf64_bfd_is_local_label_name microblaze_elf_is_local_label_name | ||
| 440 | #define elf_backend_relocate_section microblaze_elf_relocate_section | ||
| 441 | #define bfd_elf64_bfd_relax_section microblaze_elf_relax_section | ||
| 442 | -#define bfd_elf64_bfd_merge_private_bfd_data _bfd_generic_verify_endian_match | ||
| 443 | +#define bfd_elf64_bfd_merge_private_bfd_data microblaze_elf_merge_private_bfd_data | ||
| 444 | #define bfd_elf64_bfd_reloc_name_lookup microblaze_elf_reloc_name_lookup | ||
| 445 | |||
| 446 | #define elf_backend_gc_mark_hook microblaze_elf_gc_mark_hook | ||
| 447 | -#define elf_backend_check_relocs microblaze_elf_check_relocs | ||
| 448 | -#define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol | ||
| 449 | -#define bfd_elf32_bfd_link_hash_table_create microblaze_elf_link_hash_table_create | ||
| 450 | +#define elf_backend_gc_sweep_hook microblaze_elf_gc_sweep_hook | ||
| 451 | +#define elf_backend_check_relocs microblaze_elf_check_relocs | ||
| 452 | +#define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol | ||
| 453 | +#define bfd_elf64_bfd_link_hash_table_create microblaze_elf_link_hash_table_create | ||
| 454 | #define elf_backend_can_gc_sections 1 | ||
| 455 | #define elf_backend_can_refcount 1 | ||
| 456 | #define elf_backend_want_got_plt 1 | ||
| 457 | @@ -3617,11 +3751,11 @@ microblaze_elf_add_symbol_hook (bfd *abfd, | ||
| 458 | #define elf_backend_rela_normal 1 | ||
| 459 | #define elf_backend_dtrel_excludes_plt 1 | ||
| 460 | |||
| 461 | -#define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol | ||
| 462 | -#define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections | ||
| 463 | -#define elf_backend_finish_dynamic_sections microblaze_elf_finish_dynamic_sections | ||
| 464 | -#define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | ||
| 465 | -#define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | ||
| 466 | +#define elf_backend_adjust_dynamic_symbol microblaze_elf_adjust_dynamic_symbol | ||
| 467 | +#define elf_backend_create_dynamic_sections microblaze_elf_create_dynamic_sections | ||
| 468 | +#define elf_backend_finish_dynamic_sections microblaze_elf_finish_dynamic_sections | ||
| 469 | +#define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | ||
| 470 | +#define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | ||
| 471 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | ||
| 472 | |||
| 473 | #include "elf64-target.h" | ||
| 474 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | ||
| 475 | index dfcd0ab1569..e34af099640 100644 | ||
| 476 | --- a/gas/config/tc-microblaze.c | ||
| 477 | +++ b/gas/config/tc-microblaze.c | ||
| 478 | @@ -433,7 +433,7 @@ const pseudo_typeS md_pseudo_table[] = | ||
| 479 | void | ||
| 480 | md_begin (void) | ||
| 481 | { | ||
| 482 | - const struct op_code_struct * opcode; | ||
| 483 | + struct op_code_struct * opcode; | ||
| 484 | const char *prev_name = ""; | ||
| 485 | |||
| 486 | opcode_hash_control = str_htab_create (); | ||
| 487 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | ||
| 488 | index d945d144c44..5e8ebb28b8f 100644 | ||
| 489 | --- a/opcodes/microblaze-dis.c | ||
| 490 | +++ b/opcodes/microblaze-dis.c | ||
| 491 | @@ -140,7 +140,7 @@ get_field_imm16 (struct string_buf *buf, long instr) | ||
| 492 | |||
| 493 | static char * | ||
| 494 | get_field_special (struct string_buf *buf, long instr, | ||
| 495 | - const struct op_code_struct *op) | ||
| 496 | + struct op_code_struct *op) | ||
| 497 | { | ||
| 498 | char *p = strbuf (buf); | ||
| 499 | char *spr; | ||
| 500 | @@ -213,11 +213,11 @@ get_field_special (struct string_buf *buf, long instr, | ||
| 501 | static unsigned long | ||
| 502 | read_insn_microblaze (bfd_vma memaddr, | ||
| 503 | struct disassemble_info *info, | ||
| 504 | - const struct op_code_struct **opr) | ||
| 505 | + struct op_code_struct **opr) | ||
| 506 | { | ||
| 507 | unsigned char ibytes[4]; | ||
| 508 | int status; | ||
| 509 | - const struct op_code_struct *op; | ||
| 510 | + struct op_code_struct *op; | ||
| 511 | unsigned long inst; | ||
| 512 | |||
| 513 | status = info->read_memory_func (memaddr, ibytes, 4, info); | ||
| 514 | @@ -253,7 +253,7 @@ print_insn_microblaze (bfd_vma memaddr, struct disassemble_info * info) | ||
| 515 | fprintf_ftype print_func = info->fprintf_func; | ||
| 516 | void *stream = info->stream; | ||
| 517 | unsigned long inst, prev_inst; | ||
| 518 | - const struct op_code_struct *op, *pop; | ||
| 519 | + struct op_code_struct *op, *pop; | ||
| 520 | int immval = 0; | ||
| 521 | bool immfound = false; | ||
| 522 | static bfd_vma prev_insn_addr = -1; /* Init the prev insn addr. */ | ||
| 523 | @@ -496,7 +496,7 @@ get_insn_microblaze (long inst, | ||
| 524 | enum microblaze_instr_type *insn_type, | ||
| 525 | short *delay_slots) | ||
| 526 | { | ||
| 527 | - const struct op_code_struct *op; | ||
| 528 | + struct op_code_struct *op; | ||
| 529 | *isunsignedimm = false; | ||
| 530 | |||
| 531 | /* Just a linear search of the table. */ | ||
| 532 | @@ -538,7 +538,7 @@ microblaze_get_target_address (long inst, bool immfound, int immval, | ||
| 533 | bool *targetvalid, | ||
| 534 | bool *unconditionalbranch) | ||
| 535 | { | ||
| 536 | - const struct op_code_struct *op; | ||
| 537 | + struct op_code_struct *op; | ||
| 538 | long targetaddr = 0; | ||
| 539 | |||
| 540 | *unconditionalbranch = false; | ||
| 541 | diff --git a/opcodes/microblaze-opc.h b/opcodes/microblaze-opc.h | ||
| 542 | index 6f9a5a60dab..a6165649793 100644 | ||
| 543 | --- a/opcodes/microblaze-opc.h | ||
| 544 | +++ b/opcodes/microblaze-opc.h | ||
| 545 | @@ -145,7 +145,7 @@ | ||
| 546 | |||
| 547 | #define MAX_OPCODES 424 | ||
| 548 | |||
| 549 | -const struct op_code_struct | ||
| 550 | +struct op_code_struct | ||
| 551 | { | ||
| 552 | const char * name; | ||
| 553 | short inst_type; /* Registers and immediate values involved. */ | ||
| 554 | -- | ||
| 555 | 2.17.1 | ||
| 556 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0039-Initial-support-for-native-gdb.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0039-Initial-support-for-native-gdb.patch deleted file mode 100644 index 646914a4..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0039-Initial-support-for-native-gdb.patch +++ /dev/null | |||
| @@ -1,495 +0,0 @@ | |||
| 1 | From eef1384ec08bbbac893e4a564981517f92f90b57 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: David Holsgrove <david.holsgrove@petalogix.com> | ||
| 3 | Date: Fri, 20 Jul 2012 15:18:35 +1000 | ||
| 4 | Subject: [PATCH 39/52] Initial support for native gdb | ||
| 5 | |||
| 6 | microblaze: Follow PPC method of getting setting registers | ||
| 7 | using PTRACE PEEK/POKE | ||
| 8 | |||
| 9 | Signed-off-by: David Holsgrove <david.holsgrove@petalogix.com> | ||
| 10 | |||
| 11 | Conflicts: | ||
| 12 | gdb/Makefile.in | ||
| 13 | --- | ||
| 14 | gdb/Makefile.in | 2 + | ||
| 15 | gdb/config/microblaze/linux.mh | 9 + | ||
| 16 | gdb/microblaze-linux-nat.c | 431 +++++++++++++++++++++++++++++++++ | ||
| 17 | 3 files changed, 442 insertions(+) | ||
| 18 | create mode 100644 gdb/config/microblaze/linux.mh | ||
| 19 | create mode 100644 gdb/microblaze-linux-nat.c | ||
| 20 | |||
| 21 | diff --git a/gdb/Makefile.in b/gdb/Makefile.in | ||
| 22 | index 9ae9fe2d1e..a44464b983 100644 | ||
| 23 | --- a/gdb/Makefile.in | ||
| 24 | +++ b/gdb/Makefile.in | ||
| 25 | @@ -1328,6 +1328,7 @@ HFILES_NO_SRCDIR = \ | ||
| 26 | memory-map.h \ | ||
| 27 | memrange.h \ | ||
| 28 | microblaze-tdep.h \ | ||
| 29 | + microblaze-linux-tdep.h \ | ||
| 30 | mips-linux-tdep.h \ | ||
| 31 | mips-nbsd-tdep.h \ | ||
| 32 | mips-tdep.h \ | ||
| 33 | @@ -2207,6 +2208,7 @@ ALLDEPFILES = \ | ||
| 34 | m68k-tdep.c \ | ||
| 35 | microblaze-linux-tdep.c \ | ||
| 36 | microblaze-tdep.c \ | ||
| 37 | + microblaze-linux-nat.c \ | ||
| 38 | mingw-hdep.c \ | ||
| 39 | mips-fbsd-nat.c \ | ||
| 40 | mips-fbsd-tdep.c \ | ||
| 41 | diff --git a/gdb/config/microblaze/linux.mh b/gdb/config/microblaze/linux.mh | ||
| 42 | new file mode 100644 | ||
| 43 | index 0000000000..a4eaf540e1 | ||
| 44 | --- /dev/null | ||
| 45 | +++ b/gdb/config/microblaze/linux.mh | ||
| 46 | @@ -0,0 +1,9 @@ | ||
| 47 | +# Host: Microblaze, running Linux | ||
| 48 | + | ||
| 49 | +NAT_FILE= config/nm-linux.h | ||
| 50 | +NATDEPFILES= inf-ptrace.o fork-child.o \ | ||
| 51 | + microblaze-linux-nat.o proc-service.o linux-thread-db.o \ | ||
| 52 | + linux-nat.o linux-osdata.o linux-fork.o linux-procfs.o linux-ptrace.o | ||
| 53 | +NAT_CDEPS = $(srcdir)/proc-service.list | ||
| 54 | + | ||
| 55 | +LOADLIBES = -ldl $(RDYNAMIC) | ||
| 56 | diff --git a/gdb/microblaze-linux-nat.c b/gdb/microblaze-linux-nat.c | ||
| 57 | new file mode 100644 | ||
| 58 | index 0000000000..e9b8c9c522 | ||
| 59 | --- /dev/null | ||
| 60 | +++ b/gdb/microblaze-linux-nat.c | ||
| 61 | @@ -0,0 +1,431 @@ | ||
| 62 | +/* Microblaze GNU/Linux native support. | ||
| 63 | + | ||
| 64 | + Copyright (C) 1988-1989, 1991-1992, 1994, 1996, 2000-2012 Free | ||
| 65 | + Software Foundation, Inc. | ||
| 66 | + | ||
| 67 | + This file is part of GDB. | ||
| 68 | + | ||
| 69 | + This program is free software; you can redistribute it and/or modify | ||
| 70 | + it under the terms of the GNU General Public License as published by | ||
| 71 | + the Free Software Foundation; either version 3 of the License, or | ||
| 72 | + (at your option) any later version. | ||
| 73 | + | ||
| 74 | + This program is distributed in the hope that it will be useful, | ||
| 75 | + but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 76 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 77 | + GNU General Public License for more details. | ||
| 78 | + | ||
| 79 | + You should have received a copy of the GNU General Public License | ||
| 80 | + along with this program. If not, see <http://www.gnu.org/licenses/>. */ | ||
| 81 | + | ||
| 82 | +#include "defs.h" | ||
| 83 | +#include "arch-utils.h" | ||
| 84 | +#include "dis-asm.h" | ||
| 85 | +#include "frame.h" | ||
| 86 | +#include "trad-frame.h" | ||
| 87 | +#include "symtab.h" | ||
| 88 | +#include "value.h" | ||
| 89 | +#include "gdbcmd.h" | ||
| 90 | +#include "breakpoint.h" | ||
| 91 | +#include "inferior.h" | ||
| 92 | +#include "regcache.h" | ||
| 93 | +#include "target.h" | ||
| 94 | +#include "frame.h" | ||
| 95 | +#include "frame-base.h" | ||
| 96 | +#include "frame-unwind.h" | ||
| 97 | +#include "dwarf2-frame.h" | ||
| 98 | +#include "osabi.h" | ||
| 99 | + | ||
| 100 | +#include "gdb_assert.h" | ||
| 101 | +#include "gdb_string.h" | ||
| 102 | +#include "target-descriptions.h" | ||
| 103 | +#include "opcodes/microblaze-opcm.h" | ||
| 104 | +#include "opcodes/microblaze-dis.h" | ||
| 105 | + | ||
| 106 | +#include "linux-nat.h" | ||
| 107 | +#include "target-descriptions.h" | ||
| 108 | + | ||
| 109 | +#include <sys/user.h> | ||
| 110 | +#include <sys/utsname.h> | ||
| 111 | +#include <sys/procfs.h> | ||
| 112 | +#include <sys/ptrace.h> | ||
| 113 | + | ||
| 114 | +/* Prototypes for supply_gregset etc. */ | ||
| 115 | +#include "gregset.h" | ||
| 116 | + | ||
| 117 | +#include "microblaze-tdep.h" | ||
| 118 | + | ||
| 119 | +#include <elf/common.h> | ||
| 120 | +#include "auxv.h" | ||
| 121 | + | ||
| 122 | +/* Defines ps_err_e, struct ps_prochandle. */ | ||
| 123 | +#include "gdb_proc_service.h" | ||
| 124 | + | ||
| 125 | +/* On GNU/Linux, threads are implemented as pseudo-processes, in which | ||
| 126 | + case we may be tracing more than one process at a time. In that | ||
| 127 | + case, inferior_ptid will contain the main process ID and the | ||
| 128 | + individual thread (process) ID. get_thread_id () is used to get | ||
| 129 | + the thread id if it's available, and the process id otherwise. */ | ||
| 130 | + | ||
| 131 | +int | ||
| 132 | +get_thread_id (ptid_t ptid) | ||
| 133 | +{ | ||
| 134 | + int tid = TIDGET (ptid); | ||
| 135 | + if (0 == tid) | ||
| 136 | + tid = PIDGET (ptid); | ||
| 137 | + return tid; | ||
| 138 | +} | ||
| 139 | + | ||
| 140 | +#define GET_THREAD_ID(PTID) get_thread_id (PTID) | ||
| 141 | + | ||
| 142 | +/* Non-zero if our kernel may support the PTRACE_GETREGS and | ||
| 143 | + PTRACE_SETREGS requests, for reading and writing the | ||
| 144 | + general-purpose registers. Zero if we've tried one of | ||
| 145 | + them and gotten an error. */ | ||
| 146 | +int have_ptrace_getsetregs = 1; | ||
| 147 | + | ||
| 148 | +static int | ||
| 149 | +microblaze_register_u_addr (struct gdbarch *gdbarch, int regno) | ||
| 150 | +{ | ||
| 151 | + int u_addr = -1; | ||
| 152 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 153 | + /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace | ||
| 154 | + interface, and not the wordsize of the program's ABI. */ | ||
| 155 | + int wordsize = sizeof (long); | ||
| 156 | + | ||
| 157 | + /* General purpose registers occupy 1 slot each in the buffer. */ | ||
| 158 | + if (regno >= MICROBLAZE_R0_REGNUM | ||
| 159 | + && regno <= MICROBLAZE_FSR_REGNUM) | ||
| 160 | + u_addr = (regno * wordsize); | ||
| 161 | + | ||
| 162 | + return u_addr; | ||
| 163 | +} | ||
| 164 | + | ||
| 165 | + | ||
| 166 | +static void | ||
| 167 | +fetch_register (struct regcache *regcache, int tid, int regno) | ||
| 168 | +{ | ||
| 169 | + struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 170 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 171 | + /* This isn't really an address. But ptrace thinks of it as one. */ | ||
| 172 | + CORE_ADDR regaddr = microblaze_register_u_addr (gdbarch, regno); | ||
| 173 | + int bytes_transferred; | ||
| 174 | + unsigned int offset; /* Offset of registers within the u area. */ | ||
| 175 | + char buf[MAX_REGISTER_SIZE]; | ||
| 176 | + | ||
| 177 | + if (regaddr == -1) | ||
| 178 | + { | ||
| 179 | + memset (buf, '\0', register_size (gdbarch, regno)); /* Supply zeroes */ | ||
| 180 | + regcache_raw_supply (regcache, regno, buf); | ||
| 181 | + return; | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + /* Read the raw register using sizeof(long) sized chunks. On a | ||
| 185 | + 32-bit platform, 64-bit floating-point registers will require two | ||
| 186 | + transfers. */ | ||
| 187 | + for (bytes_transferred = 0; | ||
| 188 | + bytes_transferred < register_size (gdbarch, regno); | ||
| 189 | + bytes_transferred += sizeof (long)) | ||
| 190 | + { | ||
| 191 | + long l; | ||
| 192 | + | ||
| 193 | + errno = 0; | ||
| 194 | + l = ptrace (PTRACE_PEEKUSER, tid, (PTRACE_TYPE_ARG3) regaddr, 0); | ||
| 195 | + regaddr += sizeof (long); | ||
| 196 | + if (errno != 0) | ||
| 197 | + { | ||
| 198 | + char message[128]; | ||
| 199 | + sprintf (message, "reading register %s (#%d)", | ||
| 200 | + gdbarch_register_name (gdbarch, regno), regno); | ||
| 201 | + perror_with_name (message); | ||
| 202 | + } | ||
| 203 | + memcpy (&buf[bytes_transferred], &l, sizeof (l)); | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + /* Now supply the register. Keep in mind that the regcache's idea | ||
| 207 | + of the register's size may not be a multiple of sizeof | ||
| 208 | + (long). */ | ||
| 209 | + if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) | ||
| 210 | + { | ||
| 211 | + /* Little-endian values are always found at the left end of the | ||
| 212 | + bytes transferred. */ | ||
| 213 | + regcache_raw_supply (regcache, regno, buf); | ||
| 214 | + } | ||
| 215 | + else if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) | ||
| 216 | + { | ||
| 217 | + /* Big-endian values are found at the right end of the bytes | ||
| 218 | + transferred. */ | ||
| 219 | + size_t padding = (bytes_transferred - register_size (gdbarch, regno)); | ||
| 220 | + regcache_raw_supply (regcache, regno, buf + padding); | ||
| 221 | + } | ||
| 222 | + else | ||
| 223 | + internal_error (__FILE__, __LINE__, | ||
| 224 | + _("fetch_register: unexpected byte order: %d"), | ||
| 225 | + gdbarch_byte_order (gdbarch)); | ||
| 226 | +} | ||
| 227 | + | ||
| 228 | +/* This function actually issues the request to ptrace, telling | ||
| 229 | + it to get all general-purpose registers and put them into the | ||
| 230 | + specified regset. | ||
| 231 | + | ||
| 232 | + If the ptrace request does not exist, this function returns 0 | ||
| 233 | + and properly sets the have_ptrace_* flag. If the request fails, | ||
| 234 | + this function calls perror_with_name. Otherwise, if the request | ||
| 235 | + succeeds, then the regcache gets filled and 1 is returned. */ | ||
| 236 | +static int | ||
| 237 | +fetch_all_gp_regs (struct regcache *regcache, int tid) | ||
| 238 | +{ | ||
| 239 | + struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 240 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 241 | + gdb_gregset_t gregset; | ||
| 242 | + | ||
| 243 | + if (ptrace (PTRACE_GETREGS, tid, 0, (void *) &gregset) < 0) | ||
| 244 | + { | ||
| 245 | + if (errno == EIO) | ||
| 246 | + { | ||
| 247 | + have_ptrace_getsetregs = 0; | ||
| 248 | + return 0; | ||
| 249 | + } | ||
| 250 | + perror_with_name (_("Couldn't get general-purpose registers.")); | ||
| 251 | + } | ||
| 252 | + | ||
| 253 | + supply_gregset (regcache, (const gdb_gregset_t *) &gregset); | ||
| 254 | + | ||
| 255 | + return 1; | ||
| 256 | +} | ||
| 257 | + | ||
| 258 | + | ||
| 259 | +/* This is a wrapper for the fetch_all_gp_regs function. It is | ||
| 260 | + responsible for verifying if this target has the ptrace request | ||
| 261 | + that can be used to fetch all general-purpose registers at one | ||
| 262 | + shot. If it doesn't, then we should fetch them using the | ||
| 263 | + old-fashioned way, which is to iterate over the registers and | ||
| 264 | + request them one by one. */ | ||
| 265 | +static void | ||
| 266 | +fetch_gp_regs (struct regcache *regcache, int tid) | ||
| 267 | +{ | ||
| 268 | + struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 269 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 270 | + int i; | ||
| 271 | + | ||
| 272 | + if (have_ptrace_getsetregs) | ||
| 273 | + if (fetch_all_gp_regs (regcache, tid)) | ||
| 274 | + return; | ||
| 275 | + | ||
| 276 | + /* If we've hit this point, it doesn't really matter which | ||
| 277 | + architecture we are using. We just need to read the | ||
| 278 | + registers in the "old-fashioned way". */ | ||
| 279 | + for (i = MICROBLAZE_R0_REGNUM; i <= MICROBLAZE_FSR_REGNUM; i++) | ||
| 280 | + fetch_register (regcache, tid, i); | ||
| 281 | +} | ||
| 282 | + | ||
| 283 | + | ||
| 284 | +static void | ||
| 285 | +store_register (const struct regcache *regcache, int tid, int regno) | ||
| 286 | +{ | ||
| 287 | + struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 288 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 289 | + /* This isn't really an address. But ptrace thinks of it as one. */ | ||
| 290 | + CORE_ADDR regaddr = microblaze_register_u_addr (gdbarch, regno); | ||
| 291 | + int i; | ||
| 292 | + size_t bytes_to_transfer; | ||
| 293 | + char buf[MAX_REGISTER_SIZE]; | ||
| 294 | + | ||
| 295 | + if (regaddr == -1) | ||
| 296 | + return; | ||
| 297 | + | ||
| 298 | + /* First collect the register. Keep in mind that the regcache's | ||
| 299 | + idea of the register's size may not be a multiple of sizeof | ||
| 300 | + (long). */ | ||
| 301 | + memset (buf, 0, sizeof buf); | ||
| 302 | + bytes_to_transfer = align_up (register_size (gdbarch, regno), sizeof (long)); | ||
| 303 | + if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) | ||
| 304 | + { | ||
| 305 | + /* Little-endian values always sit at the left end of the buffer. */ | ||
| 306 | + regcache_raw_collect (regcache, regno, buf); | ||
| 307 | + } | ||
| 308 | + else if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) | ||
| 309 | + { | ||
| 310 | + /* Big-endian values sit at the right end of the buffer. */ | ||
| 311 | + size_t padding = (bytes_to_transfer - register_size (gdbarch, regno)); | ||
| 312 | + regcache_raw_collect (regcache, regno, buf + padding); | ||
| 313 | + } | ||
| 314 | + | ||
| 315 | + for (i = 0; i < bytes_to_transfer; i += sizeof (long)) | ||
| 316 | + { | ||
| 317 | + long l; | ||
| 318 | + | ||
| 319 | + memcpy (&l, &buf[i], sizeof (l)); | ||
| 320 | + errno = 0; | ||
| 321 | + ptrace (PTRACE_POKEUSER, tid, (PTRACE_TYPE_ARG3) regaddr, l); | ||
| 322 | + regaddr += sizeof (long); | ||
| 323 | + | ||
| 324 | + if (errno != 0) | ||
| 325 | + { | ||
| 326 | + char message[128]; | ||
| 327 | + sprintf (message, "writing register %s (#%d)", | ||
| 328 | + gdbarch_register_name (gdbarch, regno), regno); | ||
| 329 | + perror_with_name (message); | ||
| 330 | + } | ||
| 331 | + } | ||
| 332 | +} | ||
| 333 | + | ||
| 334 | +/* This function actually issues the request to ptrace, telling | ||
| 335 | + it to store all general-purpose registers present in the specified | ||
| 336 | + regset. | ||
| 337 | + | ||
| 338 | + If the ptrace request does not exist, this function returns 0 | ||
| 339 | + and properly sets the have_ptrace_* flag. If the request fails, | ||
| 340 | + this function calls perror_with_name. Otherwise, if the request | ||
| 341 | + succeeds, then the regcache is stored and 1 is returned. */ | ||
| 342 | +static int | ||
| 343 | +store_all_gp_regs (const struct regcache *regcache, int tid, int regno) | ||
| 344 | +{ | ||
| 345 | + struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 346 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 347 | + gdb_gregset_t gregset; | ||
| 348 | + | ||
| 349 | + if (ptrace (PTRACE_GETREGS, tid, 0, (void *) &gregset) < 0) | ||
| 350 | + { | ||
| 351 | + if (errno == EIO) | ||
| 352 | + { | ||
| 353 | + have_ptrace_getsetregs = 0; | ||
| 354 | + return 0; | ||
| 355 | + } | ||
| 356 | + perror_with_name (_("Couldn't get general-purpose registers.")); | ||
| 357 | + } | ||
| 358 | + | ||
| 359 | + fill_gregset (regcache, &gregset, regno); | ||
| 360 | + | ||
| 361 | + if (ptrace (PTRACE_SETREGS, tid, 0, (void *) &gregset) < 0) | ||
| 362 | + { | ||
| 363 | + if (errno == EIO) | ||
| 364 | + { | ||
| 365 | + have_ptrace_getsetregs = 0; | ||
| 366 | + return 0; | ||
| 367 | + } | ||
| 368 | + perror_with_name (_("Couldn't set general-purpose registers.")); | ||
| 369 | + } | ||
| 370 | + | ||
| 371 | + return 1; | ||
| 372 | +} | ||
| 373 | + | ||
| 374 | +/* This is a wrapper for the store_all_gp_regs function. It is | ||
| 375 | + responsible for verifying if this target has the ptrace request | ||
| 376 | + that can be used to store all general-purpose registers at one | ||
| 377 | + shot. If it doesn't, then we should store them using the | ||
| 378 | + old-fashioned way, which is to iterate over the registers and | ||
| 379 | + store them one by one. */ | ||
| 380 | +static void | ||
| 381 | +store_gp_regs (const struct regcache *regcache, int tid, int regno) | ||
| 382 | +{ | ||
| 383 | + struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 384 | + struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 385 | + int i; | ||
| 386 | + | ||
| 387 | + if (have_ptrace_getsetregs) | ||
| 388 | + if (store_all_gp_regs (regcache, tid, regno)) | ||
| 389 | + return; | ||
| 390 | + | ||
| 391 | + /* If we hit this point, it doesn't really matter which | ||
| 392 | + architecture we are using. We just need to store the | ||
| 393 | + registers in the "old-fashioned way". */ | ||
| 394 | + for (i = MICROBLAZE_R0_REGNUM; i <= MICROBLAZE_FSR_REGNUM; i++) | ||
| 395 | + store_register (regcache, tid, i); | ||
| 396 | +} | ||
| 397 | + | ||
| 398 | + | ||
| 399 | +/* Fetch registers from the child process. Fetch all registers if | ||
| 400 | + regno == -1, otherwise fetch all general registers or all floating | ||
| 401 | + point registers depending upon the value of regno. */ | ||
| 402 | + | ||
| 403 | +static void | ||
| 404 | +microblaze_linux_fetch_inferior_registers (struct target_ops *ops, | ||
| 405 | + struct regcache *regcache, int regno) | ||
| 406 | +{ | ||
| 407 | + /* Get the thread id for the ptrace call. */ | ||
| 408 | + int tid = GET_THREAD_ID (inferior_ptid); | ||
| 409 | + | ||
| 410 | + if (regno == -1) | ||
| 411 | + fetch_gp_regs (regcache, tid); | ||
| 412 | + else | ||
| 413 | + fetch_register (regcache, tid, regno); | ||
| 414 | +} | ||
| 415 | + | ||
| 416 | +/* Store registers back into the inferior. Store all registers if | ||
| 417 | + regno == -1, otherwise store all general registers or all floating | ||
| 418 | + point registers depending upon the value of regno. */ | ||
| 419 | + | ||
| 420 | +static void | ||
| 421 | +microblaze_linux_store_inferior_registers (struct target_ops *ops, | ||
| 422 | + struct regcache *regcache, int regno) | ||
| 423 | +{ | ||
| 424 | + /* Get the thread id for the ptrace call. */ | ||
| 425 | + int tid = GET_THREAD_ID (inferior_ptid); | ||
| 426 | + | ||
| 427 | + if (regno >= 0) | ||
| 428 | + store_register (regcache, tid, regno); | ||
| 429 | + else | ||
| 430 | + store_gp_regs (regcache, tid, -1); | ||
| 431 | +} | ||
| 432 | + | ||
| 433 | +/* Wrapper functions for the standard regset handling, used by | ||
| 434 | + thread debugging. */ | ||
| 435 | + | ||
| 436 | +void | ||
| 437 | +fill_gregset (const struct regcache *regcache, | ||
| 438 | + gdb_gregset_t *gregsetp, int regno) | ||
| 439 | +{ | ||
| 440 | + microblaze_collect_gregset (NULL, regcache, regno, gregsetp); | ||
| 441 | +} | ||
| 442 | + | ||
| 443 | +void | ||
| 444 | +supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp) | ||
| 445 | +{ | ||
| 446 | + microblaze_supply_gregset (NULL, regcache, -1, gregsetp); | ||
| 447 | +} | ||
| 448 | + | ||
| 449 | +void | ||
| 450 | +fill_fpregset (const struct regcache *regcache, | ||
| 451 | + gdb_fpregset_t *fpregsetp, int regno) | ||
| 452 | +{ | ||
| 453 | + /* FIXME. */ | ||
| 454 | +} | ||
| 455 | + | ||
| 456 | +void | ||
| 457 | +supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp) | ||
| 458 | +{ | ||
| 459 | + /* FIXME. */ | ||
| 460 | +} | ||
| 461 | + | ||
| 462 | +static const struct target_desc * | ||
| 463 | +microblaze_linux_read_description (struct target_ops *ops) | ||
| 464 | +{ | ||
| 465 | + CORE_ADDR microblaze_hwcap = 0; | ||
| 466 | + | ||
| 467 | + if (target_auxv_search (ops, AT_HWCAP, µblaze_hwcap) != 1) | ||
| 468 | + return NULL; | ||
| 469 | + | ||
| 470 | + return NULL; | ||
| 471 | +} | ||
| 472 | + | ||
| 473 | + | ||
| 474 | +void _initialize_microblaze_linux_nat (void); | ||
| 475 | + | ||
| 476 | +void | ||
| 477 | +_initialize_microblaze_linux_nat (void) | ||
| 478 | +{ | ||
| 479 | + struct target_ops *t; | ||
| 480 | + | ||
| 481 | + /* Fill in the generic GNU/Linux methods. */ | ||
| 482 | + t = linux_target (); | ||
| 483 | + | ||
| 484 | + /* Add our register access methods. */ | ||
| 485 | + t->to_fetch_registers = microblaze_linux_fetch_inferior_registers; | ||
| 486 | + t->to_store_registers = microblaze_linux_store_inferior_registers; | ||
| 487 | + | ||
| 488 | + t->to_read_description = microblaze_linux_read_description; | ||
| 489 | + | ||
| 490 | + /* Register the target. */ | ||
| 491 | + linux_nat_add_target (t); | ||
| 492 | +} | ||
| 493 | -- | ||
| 494 | 2.17.1 | ||
| 495 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0041-Adding-64-bit-MB-support-Added-new-architecture-to-M.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0041-Adding-64-bit-MB-support-Added-new-architecture-to-M.patch deleted file mode 100644 index 2cb1cc81..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0041-Adding-64-bit-MB-support-Added-new-architecture-to-M.patch +++ /dev/null | |||
| @@ -1,1008 +0,0 @@ | |||
| 1 | From 90412eba37c683e0526470c39926318ae7f5bd27 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nagaraju Mekala <nmekala@xilix.com> | ||
| 3 | Date: Thu, 31 Jan 2019 14:36:00 +0530 | ||
| 4 | Subject: [PATCH 41/52] Adding 64 bit MB support Added new architecture to | ||
| 5 | Microblaze 64-bit support to GDB Signed-off-by :Nagaraju Mekala | ||
| 6 | <nmekala@xilix.com> | ||
| 7 | |||
| 8 | Conflicts: | ||
| 9 | gdb/Makefile.in | ||
| 10 | --- | ||
| 11 | bfd/archures.c | 2 + | ||
| 12 | bfd/bfd-in2.h | 2 + | ||
| 13 | bfd/cpu-microblaze.c | 8 +- | ||
| 14 | gas/config/tc-microblaze.c | 13 ++ | ||
| 15 | gas/config/tc-microblaze.h | 4 + | ||
| 16 | gdb/features/Makefile | 3 + | ||
| 17 | gdb/features/microblaze-core.xml | 6 +- | ||
| 18 | gdb/features/microblaze-stack-protect.xml | 4 +- | ||
| 19 | gdb/features/microblaze-with-stack-protect.c | 8 +- | ||
| 20 | gdb/features/microblaze.c | 6 +- | ||
| 21 | gdb/features/microblaze64-core.xml | 69 ++++++ | ||
| 22 | gdb/features/microblaze64-stack-protect.xml | 12 + | ||
| 23 | .../microblaze64-with-stack-protect.c | 79 +++++++ | ||
| 24 | .../microblaze64-with-stack-protect.xml | 12 + | ||
| 25 | gdb/features/microblaze64.c | 77 +++++++ | ||
| 26 | gdb/features/microblaze64.xml | 11 + | ||
| 27 | gdb/microblaze-tdep.c | 207 ++++++++++++++++-- | ||
| 28 | gdb/microblaze-tdep.h | 8 +- | ||
| 29 | .../microblaze-with-stack-protect.dat | 4 +- | ||
| 30 | 19 files changed, 491 insertions(+), 44 deletions(-) | ||
| 31 | create mode 100644 gdb/features/microblaze64-core.xml | ||
| 32 | create mode 100644 gdb/features/microblaze64-stack-protect.xml | ||
| 33 | create mode 100644 gdb/features/microblaze64-with-stack-protect.c | ||
| 34 | create mode 100644 gdb/features/microblaze64-with-stack-protect.xml | ||
| 35 | create mode 100644 gdb/features/microblaze64.c | ||
| 36 | create mode 100644 gdb/features/microblaze64.xml | ||
| 37 | |||
| 38 | diff --git a/bfd/archures.c b/bfd/archures.c | ||
| 39 | index 551ec8732f..627d81261d 100644 | ||
| 40 | --- a/bfd/archures.c | ||
| 41 | +++ b/bfd/archures.c | ||
| 42 | @@ -522,6 +522,8 @@ DESCRIPTION | ||
| 43 | . bfd_arch_lm32, {* Lattice Mico32. *} | ||
| 44 | .#define bfd_mach_lm32 1 | ||
| 45 | . bfd_arch_microblaze,{* Xilinx MicroBlaze. *} | ||
| 46 | +.#define bfd_mach_microblaze 1 | ||
| 47 | +.#define bfd_mach_microblaze64 2 | ||
| 48 | . bfd_arch_tilepro, {* Tilera TILEPro. *} | ||
| 49 | . bfd_arch_tilegx, {* Tilera TILE-Gx. *} | ||
| 50 | .#define bfd_mach_tilepro 1 | ||
| 51 | diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h | ||
| 52 | index 05fbeb9b3a..788fb2b48b 100644 | ||
| 53 | --- a/bfd/bfd-in2.h | ||
| 54 | +++ b/bfd/bfd-in2.h | ||
| 55 | @@ -1922,6 +1922,8 @@ enum bfd_architecture | ||
| 56 | bfd_arch_lm32, /* Lattice Mico32. */ | ||
| 57 | #define bfd_mach_lm32 1 | ||
| 58 | bfd_arch_microblaze,/* Xilinx MicroBlaze. */ | ||
| 59 | +#define bfd_mach_microblaze 1 | ||
| 60 | +#define bfd_mach_microblaze64 2 | ||
| 61 | bfd_arch_tilepro, /* Tilera TILEPro. */ | ||
| 62 | bfd_arch_tilegx, /* Tilera TILE-Gx. */ | ||
| 63 | #define bfd_mach_tilepro 1 | ||
| 64 | diff --git a/bfd/cpu-microblaze.c b/bfd/cpu-microblaze.c | ||
| 65 | index 194920b20b..f3e8bbda75 100644 | ||
| 66 | --- a/bfd/cpu-microblaze.c | ||
| 67 | +++ b/bfd/cpu-microblaze.c | ||
| 68 | @@ -31,7 +31,7 @@ const bfd_arch_info_type bfd_microblaze_arch[] = | ||
| 69 | 64, /* 32 bits in an address. */ | ||
| 70 | 8, /* 8 bits in a byte. */ | ||
| 71 | bfd_arch_microblaze, /* Architecture. */ | ||
| 72 | - 0, /* Machine number - 0 for now. */ | ||
| 73 | + bfd_mach_microblaze64, /* 64 bit Machine */ | ||
| 74 | "microblaze", /* Architecture name. */ | ||
| 75 | "MicroBlaze", /* Printable name. */ | ||
| 76 | 3, /* Section align power. */ | ||
| 77 | @@ -46,7 +46,7 @@ const bfd_arch_info_type bfd_microblaze_arch[] = | ||
| 78 | 32, /* Bits in an address. */ | ||
| 79 | 8, /* Bits in a byte. */ | ||
| 80 | bfd_arch_microblaze, /* Architecture number. */ | ||
| 81 | - 0, /* Machine number - 0 for now. */ | ||
| 82 | + bfd_mach_microblaze, /* 32 bit Machine */ | ||
| 83 | "microblaze", /* Architecture name. */ | ||
| 84 | "MicroBlaze", /* Printable name. */ | ||
| 85 | 3, /* Section align power. */ | ||
| 86 | @@ -63,7 +63,7 @@ const bfd_arch_info_type bfd_microblaze_arch[] = | ||
| 87 | 32, /* 32 bits in an address. */ | ||
| 88 | 8, /* 8 bits in a byte. */ | ||
| 89 | bfd_arch_microblaze, /* Architecture. */ | ||
| 90 | - 0, /* Machine number - 0 for now. */ | ||
| 91 | + bfd_mach_microblaze, /* 32 bit Machine */ | ||
| 92 | "microblaze", /* Architecture name. */ | ||
| 93 | "MicroBlaze", /* Printable name. */ | ||
| 94 | 3, /* Section align power. */ | ||
| 95 | @@ -78,7 +78,7 @@ const bfd_arch_info_type bfd_microblaze_arch[] = | ||
| 96 | 64, /* 32 bits in an address. */ | ||
| 97 | 8, /* 8 bits in a byte. */ | ||
| 98 | bfd_arch_microblaze, /* Architecture. */ | ||
| 99 | - 0, /* Machine number - 0 for now. */ | ||
| 100 | + bfd_mach_microblaze64, /* 64 bit Machine */ | ||
| 101 | "microblaze", /* Architecture name. */ | ||
| 102 | "MicroBlaze", /* Printable name. */ | ||
| 103 | 3, /* Section align power. */ | ||
| 104 | diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c | ||
| 105 | index c6ca913f8b..df7088d6c3 100644 | ||
| 106 | --- a/gas/config/tc-microblaze.c | ||
| 107 | +++ b/gas/config/tc-microblaze.c | ||
| 108 | @@ -438,6 +438,11 @@ md_begin (void) | ||
| 109 | |||
| 110 | opcode_hash_control = hash_new (); | ||
| 111 | |||
| 112 | + if (microblaze_arch_size == 64) | ||
| 113 | + bfd_set_arch_mach (stdoutput, bfd_arch_microblaze, bfd_mach_microblaze64); | ||
| 114 | + else | ||
| 115 | + bfd_set_arch_mach (stdoutput, bfd_arch_microblaze, bfd_mach_microblaze); | ||
| 116 | + | ||
| 117 | /* Insert unique names into hash table. */ | ||
| 118 | for (opcode = (struct opcodes *)opcodes; opcode->name; opcode ++) | ||
| 119 | { | ||
| 120 | @@ -3478,6 +3483,14 @@ md_show_usage (FILE * stream ATTRIBUTE_UNUSED) | ||
| 121 | fprintf (stream, " -%-23s%s\n", "m64", N_("generate 64-bit elf")); | ||
| 122 | } | ||
| 123 | |||
| 124 | +unsigned long | ||
| 125 | +microblaze_mach (void) | ||
| 126 | +{ | ||
| 127 | + if (microblaze_arch_size == 64) | ||
| 128 | + return bfd_mach_microblaze64; | ||
| 129 | + else | ||
| 130 | + return bfd_mach_microblaze; | ||
| 131 | +} | ||
| 132 | |||
| 133 | /* Create a fixup for a cons expression. If parse_cons_expression_microblaze | ||
| 134 | found a machine specific op in an expression, | ||
| 135 | diff --git a/gas/config/tc-microblaze.h b/gas/config/tc-microblaze.h | ||
| 136 | index 7435a70ef5..90c2a4a555 100644 | ||
| 137 | --- a/gas/config/tc-microblaze.h | ||
| 138 | +++ b/gas/config/tc-microblaze.h | ||
| 139 | @@ -23,6 +23,10 @@ | ||
| 140 | #define TC_MICROBLAZE 1 | ||
| 141 | |||
| 142 | #define TARGET_ARCH bfd_arch_microblaze | ||
| 143 | +#define TARGET_MACH (microblaze_mach ()) | ||
| 144 | +#define DEFAULT_MACHINE bfd_mach_microblaze64 | ||
| 145 | +extern unsigned long microblaze_mach (void); | ||
| 146 | + | ||
| 147 | #ifndef TARGET_BYTES_BIG_ENDIAN | ||
| 148 | /* Used to initialise target_big_endian. */ | ||
| 149 | #define TARGET_BYTES_BIG_ENDIAN 1 | ||
| 150 | diff --git a/gdb/features/Makefile b/gdb/features/Makefile | ||
| 151 | index d0af9a47b4..2c3cf91b69 100644 | ||
| 152 | --- a/gdb/features/Makefile | ||
| 153 | +++ b/gdb/features/Makefile | ||
| 154 | @@ -46,6 +46,7 @@ | ||
| 155 | # List of .dat files to create in ../regformats/ | ||
| 156 | WHICH = mips-linux mips-dsp-linux \ | ||
| 157 | microblaze-with-stack-protect \ | ||
| 158 | + microblaze64-with-stack-protect \ | ||
| 159 | mips64-linux mips64-dsp-linux \ | ||
| 160 | nios2-linux \ | ||
| 161 | rs6000/powerpc-32 \ | ||
| 162 | @@ -107,7 +108,9 @@ OUTPUTS = $(patsubst %,$(outdir)/%.dat,$(WHICH)) | ||
| 163 | # to make on the command line. | ||
| 164 | XMLTOC = \ | ||
| 165 | microblaze-with-stack-protect.xml \ | ||
| 166 | + microblaze64-with-stack-protect.xml \ | ||
| 167 | microblaze.xml \ | ||
| 168 | + microblaze64.xml \ | ||
| 169 | mips-dsp-linux.xml \ | ||
| 170 | mips-linux.xml \ | ||
| 171 | mips64-dsp-linux.xml \ | ||
| 172 | diff --git a/gdb/features/microblaze-core.xml b/gdb/features/microblaze-core.xml | ||
| 173 | index f272650a41..a87f0f2319 100644 | ||
| 174 | --- a/gdb/features/microblaze-core.xml | ||
| 175 | +++ b/gdb/features/microblaze-core.xml | ||
| 176 | @@ -8,7 +8,7 @@ | ||
| 177 | <!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 178 | <feature name="org.gnu.gdb.microblaze.core"> | ||
| 179 | <reg name="r0" bitsize="32" regnum="0"/> | ||
| 180 | - <reg name="r1" bitsize="32" type="data_ptr"/> | ||
| 181 | + <reg name="r1" bitsize="32"/> | ||
| 182 | <reg name="r2" bitsize="32"/> | ||
| 183 | <reg name="r3" bitsize="32"/> | ||
| 184 | <reg name="r4" bitsize="32"/> | ||
| 185 | @@ -39,7 +39,7 @@ | ||
| 186 | <reg name="r29" bitsize="32"/> | ||
| 187 | <reg name="r30" bitsize="32"/> | ||
| 188 | <reg name="r31" bitsize="32"/> | ||
| 189 | - <reg name="rpc" bitsize="32" type="code_ptr"/> | ||
| 190 | + <reg name="rpc" bitsize="32"/> | ||
| 191 | <reg name="rmsr" bitsize="32"/> | ||
| 192 | <reg name="rear" bitsize="32"/> | ||
| 193 | <reg name="resr" bitsize="32"/> | ||
| 194 | @@ -64,4 +64,6 @@ | ||
| 195 | <reg name="rtlbsx" bitsize="32"/> | ||
| 196 | <reg name="rtlblo" bitsize="32"/> | ||
| 197 | <reg name="rtlbhi" bitsize="32"/> | ||
| 198 | + <reg name="slr" bitsize="32"/> | ||
| 199 | + <reg name="shr" bitsize="32"/> | ||
| 200 | </feature> | ||
| 201 | diff --git a/gdb/features/microblaze-stack-protect.xml b/gdb/features/microblaze-stack-protect.xml | ||
| 202 | index 1b16223406..1a67f88c18 100644 | ||
| 203 | --- a/gdb/features/microblaze-stack-protect.xml | ||
| 204 | +++ b/gdb/features/microblaze-stack-protect.xml | ||
| 205 | @@ -7,6 +7,6 @@ | ||
| 206 | |||
| 207 | <!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 208 | <feature name="org.gnu.gdb.microblaze.stack-protect"> | ||
| 209 | - <reg name="rslr" bitsize="32"/> | ||
| 210 | - <reg name="rshr" bitsize="32"/> | ||
| 211 | + <reg name="slr" bitsize="32"/> | ||
| 212 | + <reg name="shr" bitsize="32"/> | ||
| 213 | </feature> | ||
| 214 | diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c | ||
| 215 | index b39aa19887..609934e2b4 100644 | ||
| 216 | --- a/gdb/features/microblaze-with-stack-protect.c | ||
| 217 | +++ b/gdb/features/microblaze-with-stack-protect.c | ||
| 218 | @@ -14,7 +14,7 @@ initialize_tdesc_microblaze_with_stack_protect (void) | ||
| 219 | |||
| 220 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core"); | ||
| 221 | tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); | ||
| 222 | - tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr"); | ||
| 223 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); | ||
| 224 | tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int"); | ||
| 225 | tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int"); | ||
| 226 | tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int"); | ||
| 227 | @@ -45,7 +45,7 @@ initialize_tdesc_microblaze_with_stack_protect (void) | ||
| 228 | tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "int"); | ||
| 229 | tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "int"); | ||
| 230 | tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "int"); | ||
| 231 | - tdesc_create_reg (feature, "rpc", 32, 1, NULL, 32, "code_ptr"); | ||
| 232 | + tdesc_create_reg (feature, "rpc", 32, 1, NULL, 32, "int"); | ||
| 233 | tdesc_create_reg (feature, "rmsr", 33, 1, NULL, 32, "int"); | ||
| 234 | tdesc_create_reg (feature, "rear", 34, 1, NULL, 32, "int"); | ||
| 235 | tdesc_create_reg (feature, "resr", 35, 1, NULL, 32, "int"); | ||
| 236 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze_with_stack_protect (void) | ||
| 237 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 238 | |||
| 239 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.stack-protect"); | ||
| 240 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 32, "int"); | ||
| 241 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int"); | ||
| 242 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 32, "int"); | ||
| 243 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 32, "int"); | ||
| 244 | |||
| 245 | tdesc_microblaze_with_stack_protect = result; | ||
| 246 | } | ||
| 247 | diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c | ||
| 248 | index 6c86fc0770..ceb98ca8b8 100644 | ||
| 249 | --- a/gdb/features/microblaze.c | ||
| 250 | +++ b/gdb/features/microblaze.c | ||
| 251 | @@ -14,7 +14,7 @@ initialize_tdesc_microblaze (void) | ||
| 252 | |||
| 253 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.core"); | ||
| 254 | tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "int"); | ||
| 255 | - tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "data_ptr"); | ||
| 256 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "int"); | ||
| 257 | tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "int"); | ||
| 258 | tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "int"); | ||
| 259 | tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "int"); | ||
| 260 | @@ -45,7 +45,7 @@ initialize_tdesc_microblaze (void) | ||
| 261 | tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "int"); | ||
| 262 | tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "int"); | ||
| 263 | tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "int"); | ||
| 264 | - tdesc_create_reg (feature, "rpc", 32, 1, NULL, 32, "code_ptr"); | ||
| 265 | + tdesc_create_reg (feature, "rpc", 32, 1, NULL, 32, "int"); | ||
| 266 | tdesc_create_reg (feature, "rmsr", 33, 1, NULL, 32, "int"); | ||
| 267 | tdesc_create_reg (feature, "rear", 34, 1, NULL, 32, "int"); | ||
| 268 | tdesc_create_reg (feature, "resr", 35, 1, NULL, 32, "int"); | ||
| 269 | @@ -70,6 +70,8 @@ initialize_tdesc_microblaze (void) | ||
| 270 | tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 271 | tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 272 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 273 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 274 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 275 | |||
| 276 | tdesc_microblaze = result; | ||
| 277 | } | ||
| 278 | diff --git a/gdb/features/microblaze64-core.xml b/gdb/features/microblaze64-core.xml | ||
| 279 | new file mode 100644 | ||
| 280 | index 0000000000..96e99e2fb2 | ||
| 281 | --- /dev/null | ||
| 282 | +++ b/gdb/features/microblaze64-core.xml | ||
| 283 | @@ -0,0 +1,69 @@ | ||
| 284 | +<?xml version="1.0"?> | ||
| 285 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | ||
| 286 | + | ||
| 287 | + Copying and distribution of this file, with or without modification, | ||
| 288 | + are permitted in any medium without royalty provided the copyright | ||
| 289 | + notice and this notice are preserved. --> | ||
| 290 | + | ||
| 291 | +<!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 292 | +<feature name="org.gnu.gdb.microblaze64.core"> | ||
| 293 | + <reg name="r0" bitsize="64" regnum="0"/> | ||
| 294 | + <reg name="r1" bitsize="64"/> | ||
| 295 | + <reg name="r2" bitsize="64"/> | ||
| 296 | + <reg name="r3" bitsize="64"/> | ||
| 297 | + <reg name="r4" bitsize="64"/> | ||
| 298 | + <reg name="r5" bitsize="64"/> | ||
| 299 | + <reg name="r6" bitsize="64"/> | ||
| 300 | + <reg name="r7" bitsize="64"/> | ||
| 301 | + <reg name="r8" bitsize="64"/> | ||
| 302 | + <reg name="r9" bitsize="64"/> | ||
| 303 | + <reg name="r10" bitsize="64"/> | ||
| 304 | + <reg name="r11" bitsize="64"/> | ||
| 305 | + <reg name="r12" bitsize="64"/> | ||
| 306 | + <reg name="r13" bitsize="64"/> | ||
| 307 | + <reg name="r14" bitsize="64"/> | ||
| 308 | + <reg name="r15" bitsize="64"/> | ||
| 309 | + <reg name="r16" bitsize="64"/> | ||
| 310 | + <reg name="r17" bitsize="64"/> | ||
| 311 | + <reg name="r18" bitsize="64"/> | ||
| 312 | + <reg name="r19" bitsize="64"/> | ||
| 313 | + <reg name="r20" bitsize="64"/> | ||
| 314 | + <reg name="r21" bitsize="64"/> | ||
| 315 | + <reg name="r22" bitsize="64"/> | ||
| 316 | + <reg name="r23" bitsize="64"/> | ||
| 317 | + <reg name="r24" bitsize="64"/> | ||
| 318 | + <reg name="r25" bitsize="64"/> | ||
| 319 | + <reg name="r26" bitsize="64"/> | ||
| 320 | + <reg name="r27" bitsize="64"/> | ||
| 321 | + <reg name="r28" bitsize="64"/> | ||
| 322 | + <reg name="r29" bitsize="64"/> | ||
| 323 | + <reg name="r30" bitsize="64"/> | ||
| 324 | + <reg name="r31" bitsize="64"/> | ||
| 325 | + <reg name="rpc" bitsize="64"/> | ||
| 326 | + <reg name="rmsr" bitsize="32"/> | ||
| 327 | + <reg name="rear" bitsize="64"/> | ||
| 328 | + <reg name="resr" bitsize="32"/> | ||
| 329 | + <reg name="rfsr" bitsize="32"/> | ||
| 330 | + <reg name="rbtr" bitsize="64"/> | ||
| 331 | + <reg name="rpvr0" bitsize="32"/> | ||
| 332 | + <reg name="rpvr1" bitsize="32"/> | ||
| 333 | + <reg name="rpvr2" bitsize="32"/> | ||
| 334 | + <reg name="rpvr3" bitsize="32"/> | ||
| 335 | + <reg name="rpvr4" bitsize="32"/> | ||
| 336 | + <reg name="rpvr5" bitsize="32"/> | ||
| 337 | + <reg name="rpvr6" bitsize="32"/> | ||
| 338 | + <reg name="rpvr7" bitsize="32"/> | ||
| 339 | + <reg name="rpvr8" bitsize="64"/> | ||
| 340 | + <reg name="rpvr9" bitsize="64"/> | ||
| 341 | + <reg name="rpvr10" bitsize="32"/> | ||
| 342 | + <reg name="rpvr11" bitsize="32"/> | ||
| 343 | + <reg name="redr" bitsize="32"/> | ||
| 344 | + <reg name="rpid" bitsize="32"/> | ||
| 345 | + <reg name="rzpr" bitsize="32"/> | ||
| 346 | + <reg name="rtlbx" bitsize="32"/> | ||
| 347 | + <reg name="rtlbsx" bitsize="32"/> | ||
| 348 | + <reg name="rtlblo" bitsize="32"/> | ||
| 349 | + <reg name="rtlbhi" bitsize="32"/> | ||
| 350 | + <reg name="slr" bitsize="64"/> | ||
| 351 | + <reg name="shr" bitsize="64"/> | ||
| 352 | +</feature> | ||
| 353 | diff --git a/gdb/features/microblaze64-stack-protect.xml b/gdb/features/microblaze64-stack-protect.xml | ||
| 354 | new file mode 100644 | ||
| 355 | index 0000000000..1bbf5fc3ce | ||
| 356 | --- /dev/null | ||
| 357 | +++ b/gdb/features/microblaze64-stack-protect.xml | ||
| 358 | @@ -0,0 +1,12 @@ | ||
| 359 | +<?xml version="1.0"?> | ||
| 360 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | ||
| 361 | + | ||
| 362 | + Copying and distribution of this file, with or without modification, | ||
| 363 | + are permitted in any medium without royalty provided the copyright | ||
| 364 | + notice and this notice are preserved. --> | ||
| 365 | + | ||
| 366 | +<!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 367 | +<feature name="org.gnu.gdb.microblaze64.stack-protect"> | ||
| 368 | + <reg name="slr" bitsize="64"/> | ||
| 369 | + <reg name="shr" bitsize="64"/> | ||
| 370 | +</feature> | ||
| 371 | diff --git a/gdb/features/microblaze64-with-stack-protect.c b/gdb/features/microblaze64-with-stack-protect.c | ||
| 372 | new file mode 100644 | ||
| 373 | index 0000000000..f448c9a749 | ||
| 374 | --- /dev/null | ||
| 375 | +++ b/gdb/features/microblaze64-with-stack-protect.c | ||
| 376 | @@ -0,0 +1,79 @@ | ||
| 377 | +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: | ||
| 378 | + Original: microblaze-with-stack-protect.xml */ | ||
| 379 | + | ||
| 380 | +#include "defs.h" | ||
| 381 | +#include "osabi.h" | ||
| 382 | +#include "target-descriptions.h" | ||
| 383 | + | ||
| 384 | +struct target_desc *tdesc_microblaze64_with_stack_protect; | ||
| 385 | +static void | ||
| 386 | +initialize_tdesc_microblaze64_with_stack_protect (void) | ||
| 387 | +{ | ||
| 388 | + struct target_desc *result = allocate_target_description (); | ||
| 389 | + struct tdesc_feature *feature; | ||
| 390 | + | ||
| 391 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.core"); | ||
| 392 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); | ||
| 393 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); | ||
| 394 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); | ||
| 395 | + tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64"); | ||
| 396 | + tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64"); | ||
| 397 | + tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64"); | ||
| 398 | + tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64"); | ||
| 399 | + tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64"); | ||
| 400 | + tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64"); | ||
| 401 | + tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64"); | ||
| 402 | + tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64"); | ||
| 403 | + tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64"); | ||
| 404 | + tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64"); | ||
| 405 | + tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64"); | ||
| 406 | + tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64"); | ||
| 407 | + tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64"); | ||
| 408 | + tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64"); | ||
| 409 | + tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64"); | ||
| 410 | + tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64"); | ||
| 411 | + tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64"); | ||
| 412 | + tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64"); | ||
| 413 | + tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64"); | ||
| 414 | + tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64"); | ||
| 415 | + tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64"); | ||
| 416 | + tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64"); | ||
| 417 | + tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64"); | ||
| 418 | + tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64"); | ||
| 419 | + tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64"); | ||
| 420 | + tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64"); | ||
| 421 | + tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64"); | ||
| 422 | + tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64"); | ||
| 423 | + tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64"); | ||
| 424 | + tdesc_create_reg (feature, "rpc", 32, 1, NULL, 64, "uint64"); | ||
| 425 | + tdesc_create_reg (feature, "rmsr", 33, 1, NULL, 32, "int"); | ||
| 426 | + tdesc_create_reg (feature, "rear", 34, 1, NULL, 64, "int"); | ||
| 427 | + tdesc_create_reg (feature, "resr", 35, 1, NULL, 32, "int"); | ||
| 428 | + tdesc_create_reg (feature, "rfsr", 36, 1, NULL, 32, "int"); | ||
| 429 | + tdesc_create_reg (feature, "rbtr", 37, 1, NULL, 64, "uint64"); | ||
| 430 | + tdesc_create_reg (feature, "rpvr0", 38, 1, NULL, 32, "int"); | ||
| 431 | + tdesc_create_reg (feature, "rpvr1", 39, 1, NULL, 32, "int"); | ||
| 432 | + tdesc_create_reg (feature, "rpvr2", 40, 1, NULL, 32, "int"); | ||
| 433 | + tdesc_create_reg (feature, "rpvr3", 41, 1, NULL, 32, "int"); | ||
| 434 | + tdesc_create_reg (feature, "rpvr4", 42, 1, NULL, 32, "int"); | ||
| 435 | + tdesc_create_reg (feature, "rpvr5", 43, 1, NULL, 32, "int"); | ||
| 436 | + tdesc_create_reg (feature, "rpvr6", 44, 1, NULL, 32, "int"); | ||
| 437 | + tdesc_create_reg (feature, "rpvr7", 45, 1, NULL, 32, "int"); | ||
| 438 | + tdesc_create_reg (feature, "rpvr8", 46, 1, NULL, 64, "uint64"); | ||
| 439 | + tdesc_create_reg (feature, "rpvr9", 47, 1, NULL, 64, "uint64"); | ||
| 440 | + tdesc_create_reg (feature, "rpvr10", 48, 1, NULL, 32, "int"); | ||
| 441 | + tdesc_create_reg (feature, "rpvr11", 49, 1, NULL, 32, "int"); | ||
| 442 | + tdesc_create_reg (feature, "redr", 50, 1, NULL, 32, "int"); | ||
| 443 | + tdesc_create_reg (feature, "rpid", 51, 1, NULL, 32, "int"); | ||
| 444 | + tdesc_create_reg (feature, "rzpr", 52, 1, NULL, 32, "int"); | ||
| 445 | + tdesc_create_reg (feature, "rtlbx", 53, 1, NULL, 32, "int"); | ||
| 446 | + tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 447 | + tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 448 | + tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 449 | + | ||
| 450 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.stack-protect"); | ||
| 451 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 452 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 453 | + | ||
| 454 | + tdesc_microblaze64_with_stack_protect = result; | ||
| 455 | +} | ||
| 456 | diff --git a/gdb/features/microblaze64-with-stack-protect.xml b/gdb/features/microblaze64-with-stack-protect.xml | ||
| 457 | new file mode 100644 | ||
| 458 | index 0000000000..0e9f01611f | ||
| 459 | --- /dev/null | ||
| 460 | +++ b/gdb/features/microblaze64-with-stack-protect.xml | ||
| 461 | @@ -0,0 +1,12 @@ | ||
| 462 | +<?xml version="1.0"?> | ||
| 463 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | ||
| 464 | + | ||
| 465 | + Copying and distribution of this file, with or without modification, | ||
| 466 | + are permitted in any medium without royalty provided the copyright | ||
| 467 | + notice and this notice are preserved. --> | ||
| 468 | + | ||
| 469 | +<!DOCTYPE target SYSTEM "gdb-target.dtd"> | ||
| 470 | +<target> | ||
| 471 | + <xi:include href="microblaze64-core.xml"/> | ||
| 472 | + <xi:include href="microblaze64-stack-protect.xml"/> | ||
| 473 | +</target> | ||
| 474 | diff --git a/gdb/features/microblaze64.c b/gdb/features/microblaze64.c | ||
| 475 | new file mode 100644 | ||
| 476 | index 0000000000..1aa37c4512 | ||
| 477 | --- /dev/null | ||
| 478 | +++ b/gdb/features/microblaze64.c | ||
| 479 | @@ -0,0 +1,77 @@ | ||
| 480 | +/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: | ||
| 481 | + Original: microblaze.xml */ | ||
| 482 | + | ||
| 483 | +#include "defs.h" | ||
| 484 | +#include "osabi.h" | ||
| 485 | +#include "target-descriptions.h" | ||
| 486 | + | ||
| 487 | +struct target_desc *tdesc_microblaze64; | ||
| 488 | +static void | ||
| 489 | +initialize_tdesc_microblaze64 (void) | ||
| 490 | +{ | ||
| 491 | + struct target_desc *result = allocate_target_description (); | ||
| 492 | + struct tdesc_feature *feature; | ||
| 493 | + | ||
| 494 | + feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.core"); | ||
| 495 | + tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); | ||
| 496 | + tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); | ||
| 497 | + tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); | ||
| 498 | + tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64"); | ||
| 499 | + tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64"); | ||
| 500 | + tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64"); | ||
| 501 | + tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64"); | ||
| 502 | + tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64"); | ||
| 503 | + tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64"); | ||
| 504 | + tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64"); | ||
| 505 | + tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64"); | ||
| 506 | + tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64"); | ||
| 507 | + tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64"); | ||
| 508 | + tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64"); | ||
| 509 | + tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64"); | ||
| 510 | + tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64"); | ||
| 511 | + tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64"); | ||
| 512 | + tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64"); | ||
| 513 | + tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64"); | ||
| 514 | + tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64"); | ||
| 515 | + tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64"); | ||
| 516 | + tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64"); | ||
| 517 | + tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64"); | ||
| 518 | + tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64"); | ||
| 519 | + tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64"); | ||
| 520 | + tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64"); | ||
| 521 | + tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64"); | ||
| 522 | + tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64"); | ||
| 523 | + tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64"); | ||
| 524 | + tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64"); | ||
| 525 | + tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64"); | ||
| 526 | + tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64"); | ||
| 527 | + tdesc_create_reg (feature, "rpc", 32, 1, NULL, 64, "uint64"); | ||
| 528 | + tdesc_create_reg (feature, "rmsr", 33, 1, NULL, 32, "int"); | ||
| 529 | + tdesc_create_reg (feature, "rear", 34, 1, NULL, 64, "uint64"); | ||
| 530 | + tdesc_create_reg (feature, "resr", 35, 1, NULL, 32, "int"); | ||
| 531 | + tdesc_create_reg (feature, "rfsr", 36, 1, NULL, 32, "int"); | ||
| 532 | + tdesc_create_reg (feature, "rbtr", 37, 1, NULL, 64, "uint64"); | ||
| 533 | + tdesc_create_reg (feature, "rpvr0", 38, 1, NULL, 32, "int"); | ||
| 534 | + tdesc_create_reg (feature, "rpvr1", 39, 1, NULL, 32, "int"); | ||
| 535 | + tdesc_create_reg (feature, "rpvr2", 40, 1, NULL, 32, "int"); | ||
| 536 | + tdesc_create_reg (feature, "rpvr3", 41, 1, NULL, 32, "int"); | ||
| 537 | + tdesc_create_reg (feature, "rpvr4", 42, 1, NULL, 32, "int"); | ||
| 538 | + tdesc_create_reg (feature, "rpvr5", 43, 1, NULL, 32, "int"); | ||
| 539 | + tdesc_create_reg (feature, "rpvr6", 44, 1, NULL, 32, "int"); | ||
| 540 | + tdesc_create_reg (feature, "rpvr7", 45, 1, NULL, 32, "int"); | ||
| 541 | + tdesc_create_reg (feature, "rpvr8", 46, 1, NULL, 64, "uint64"); | ||
| 542 | + tdesc_create_reg (feature, "rpvr9", 47, 1, NULL, 64, "uint64"); | ||
| 543 | + tdesc_create_reg (feature, "rpvr10", 48, 1, NULL, 32, "int"); | ||
| 544 | + tdesc_create_reg (feature, "rpvr11", 49, 1, NULL, 32, "int"); | ||
| 545 | + tdesc_create_reg (feature, "redr", 50, 1, NULL, 32, "int"); | ||
| 546 | + tdesc_create_reg (feature, "rpid", 51, 1, NULL, 32, "int"); | ||
| 547 | + tdesc_create_reg (feature, "rzpr", 52, 1, NULL, 32, "int"); | ||
| 548 | + tdesc_create_reg (feature, "rtlbx", 53, 1, NULL, 32, "int"); | ||
| 549 | + tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 550 | + tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 551 | + tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 552 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 553 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 554 | + | ||
| 555 | + tdesc_microblaze64 = result; | ||
| 556 | +} | ||
| 557 | diff --git a/gdb/features/microblaze64.xml b/gdb/features/microblaze64.xml | ||
| 558 | new file mode 100644 | ||
| 559 | index 0000000000..515d18e65c | ||
| 560 | --- /dev/null | ||
| 561 | +++ b/gdb/features/microblaze64.xml | ||
| 562 | @@ -0,0 +1,11 @@ | ||
| 563 | +<?xml version="1.0"?> | ||
| 564 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | ||
| 565 | + | ||
| 566 | + Copying and distribution of this file, with or without modification, | ||
| 567 | + are permitted in any medium without royalty provided the copyright | ||
| 568 | + notice and this notice are preserved. --> | ||
| 569 | + | ||
| 570 | +<!DOCTYPE target SYSTEM "gdb-target.dtd"> | ||
| 571 | +<target> | ||
| 572 | + <xi:include href="microblaze64-core.xml"/> | ||
| 573 | +</target> | ||
| 574 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | ||
| 575 | index 1b5cf38e45..f4ea3cc342 100644 | ||
| 576 | --- a/gdb/microblaze-tdep.c | ||
| 577 | +++ b/gdb/microblaze-tdep.c | ||
| 578 | @@ -40,7 +40,9 @@ | ||
| 579 | #include "remote.h" | ||
| 580 | |||
| 581 | #include "features/microblaze-with-stack-protect.c" | ||
| 582 | +#include "features/microblaze64-with-stack-protect.c" | ||
| 583 | #include "features/microblaze.c" | ||
| 584 | +#include "features/microblaze64.c" | ||
| 585 | |||
| 586 | /* Instruction macros used for analyzing the prologue. */ | ||
| 587 | /* This set of instruction macros need to be changed whenever the | ||
| 588 | @@ -75,12 +77,13 @@ static const char *microblaze_register_names[] = | ||
| 589 | "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6", | ||
| 590 | "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11", | ||
| 591 | "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi", | ||
| 592 | - "rslr", "rshr" | ||
| 593 | + "slr", "shr" | ||
| 594 | }; | ||
| 595 | |||
| 596 | #define MICROBLAZE_NUM_REGS ARRAY_SIZE (microblaze_register_names) | ||
| 597 | |||
| 598 | static unsigned int microblaze_debug_flag = 0; | ||
| 599 | +int reg_size = 4; | ||
| 600 | |||
| 601 | static void ATTRIBUTE_PRINTF (1, 2) | ||
| 602 | microblaze_debug (const char *fmt, ...) | ||
| 603 | @@ -145,6 +148,7 @@ microblaze_store_arguments (struct regcache *regcache, int nargs, | ||
| 604 | error (_("store_arguments not implemented")); | ||
| 605 | return sp; | ||
| 606 | } | ||
| 607 | +#if 0 | ||
| 608 | static int | ||
| 609 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 610 | struct bp_target_info *bp_tgt) | ||
| 611 | @@ -154,7 +158,7 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 612 | int val; | ||
| 613 | int bplen; | ||
| 614 | gdb_byte old_contents[BREAKPOINT_MAX]; | ||
| 615 | - struct cleanup *cleanup; | ||
| 616 | + //struct cleanup *cleanup; | ||
| 617 | |||
| 618 | /* Determine appropriate breakpoint contents and size for this address. */ | ||
| 619 | bp = gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen); | ||
| 620 | @@ -162,7 +166,8 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 621 | error (_("Software breakpoints not implemented for this target.")); | ||
| 622 | |||
| 623 | /* Make sure we see the memory breakpoints. */ | ||
| 624 | - cleanup = make_show_memory_breakpoints_cleanup (1); | ||
| 625 | + scoped_restore | ||
| 626 | + cleanup = make_scoped_restore_show_memory_breakpoints (1); | ||
| 627 | val = target_read_memory (addr, old_contents, bplen); | ||
| 628 | |||
| 629 | /* If our breakpoint is no longer at the address, this means that the | ||
| 630 | @@ -178,6 +183,7 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 631 | return val; | ||
| 632 | } | ||
| 633 | |||
| 634 | +#endif | ||
| 635 | /* Allocate and initialize a frame cache. */ | ||
| 636 | |||
| 637 | static struct microblaze_frame_cache * | ||
| 638 | @@ -570,17 +576,16 @@ microblaze_extract_return_value (struct type *type, struct regcache *regcache, | ||
| 639 | gdb_byte *valbuf) | ||
| 640 | { | ||
| 641 | gdb_byte buf[8]; | ||
| 642 | - | ||
| 643 | /* Copy the return value (starting) in RETVAL_REGNUM to VALBUF. */ | ||
| 644 | switch (TYPE_LENGTH (type)) | ||
| 645 | { | ||
| 646 | case 1: /* return last byte in the register. */ | ||
| 647 | regcache->cooked_read (MICROBLAZE_RETVAL_REGNUM, buf); | ||
| 648 | - memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 1, 1); | ||
| 649 | + memcpy(valbuf, buf + reg_size - 1, 1); | ||
| 650 | return; | ||
| 651 | case 2: /* return last 2 bytes in register. */ | ||
| 652 | regcache->cooked_read (MICROBLAZE_RETVAL_REGNUM, buf); | ||
| 653 | - memcpy(valbuf, buf + MICROBLAZE_REGISTER_SIZE - 2, 2); | ||
| 654 | + memcpy(valbuf, buf + reg_size - 2, 2); | ||
| 655 | return; | ||
| 656 | case 4: /* for sizes 4 or 8, copy the required length. */ | ||
| 657 | case 8: | ||
| 658 | @@ -647,7 +652,119 @@ microblaze_stabs_argument_has_addr (struct gdbarch *gdbarch, struct type *type) | ||
| 659 | return (TYPE_LENGTH (type) == 16); | ||
| 660 | } | ||
| 661 | |||
| 662 | - | ||
| 663 | +#if 0 | ||
| 664 | +static std::vector<CORE_ADDR> | ||
| 665 | +microblaze_software_single_step (struct regcache *regcache) | ||
| 666 | +{ | ||
| 667 | +// struct gdbarch *arch = get_frame_arch(frame); | ||
| 668 | + struct gdbarch *arch = get_regcache_arch (regcache); | ||
| 669 | + struct address_space *aspace = get_regcache_aspace (regcache); | ||
| 670 | +// struct address_space *aspace = get_frame_address_space (frame); | ||
| 671 | + struct gdbarch_tdep *tdep = gdbarch_tdep (arch); | ||
| 672 | + static char le_breakp[] = MICROBLAZE_BREAKPOINT_LE; | ||
| 673 | + static char be_breakp[] = MICROBLAZE_BREAKPOINT; | ||
| 674 | + enum bfd_endian byte_order = gdbarch_byte_order (arch); | ||
| 675 | + char *breakp = byte_order == BFD_ENDIAN_BIG ? be_breakp : le_breakp; | ||
| 676 | + std::vector<CORE_ADDR> ret = 0; | ||
| 677 | + | ||
| 678 | + /* Save the address and the values of the next_pc and the target */ | ||
| 679 | + static struct sstep_breaks | ||
| 680 | + { | ||
| 681 | + CORE_ADDR address; | ||
| 682 | + bfd_boolean valid; | ||
| 683 | + /* Shadow contents. */ | ||
| 684 | + char data[INST_WORD_SIZE]; | ||
| 685 | + } stepbreaks[2]; | ||
| 686 | + int ii; | ||
| 687 | + | ||
| 688 | + if (1) | ||
| 689 | + { | ||
| 690 | + CORE_ADDR pc; | ||
| 691 | + std::vector<CORE_ADDR> *next_pcs = NULL; | ||
| 692 | + long insn; | ||
| 693 | + enum microblaze_instr minstr; | ||
| 694 | + bfd_boolean isunsignednum; | ||
| 695 | + enum microblaze_instr_type insn_type; | ||
| 696 | + short delay_slots; | ||
| 697 | + int imm; | ||
| 698 | + bfd_boolean immfound = FALSE; | ||
| 699 | + | ||
| 700 | + /* Set a breakpoint at the next instruction */ | ||
| 701 | + /* If the current instruction is an imm, set it at the inst after */ | ||
| 702 | + /* If the instruction has a delay slot, skip the delay slot */ | ||
| 703 | + pc = regcache_read_pc (regcache); | ||
| 704 | + insn = microblaze_fetch_instruction (pc); | ||
| 705 | + minstr = get_insn_microblaze (insn, &isunsignednum, &insn_type, &delay_slots); | ||
| 706 | + if (insn_type == immediate_inst) | ||
| 707 | + { | ||
| 708 | + int rd, ra, rb; | ||
| 709 | + immfound = TRUE; | ||
| 710 | + minstr = microblaze_decode_insn (insn, &rd, &ra, &rb, &imm); | ||
| 711 | + pc = pc + INST_WORD_SIZE; | ||
| 712 | + insn = microblaze_fetch_instruction (pc); | ||
| 713 | + minstr = get_insn_microblaze (insn, &isunsignednum, &insn_type, &delay_slots); | ||
| 714 | + } | ||
| 715 | + stepbreaks[0].address = pc + (delay_slots * INST_WORD_SIZE) + INST_WORD_SIZE; | ||
| 716 | + if (insn_type != return_inst) { | ||
| 717 | + stepbreaks[0].valid = TRUE; | ||
| 718 | + } else { | ||
| 719 | + stepbreaks[0].valid = FALSE; | ||
| 720 | + } | ||
| 721 | + | ||
| 722 | + microblaze_debug ("single-step insn_type=%x insn=%x\n", insn_type, insn); | ||
| 723 | + /* Now check for branch or return instructions */ | ||
| 724 | + if (insn_type == branch_inst || insn_type == return_inst) { | ||
| 725 | + int limm; | ||
| 726 | + int lrd, lra, lrb; | ||
| 727 | + int ra, rb; | ||
| 728 | + bfd_boolean targetvalid; | ||
| 729 | + bfd_boolean unconditionalbranch; | ||
| 730 | + microblaze_decode_insn(insn, &lrd, &lra, &lrb, &limm); | ||
| 731 | + if (lra >= 0 && lra < MICROBLAZE_NUM_REGS) | ||
| 732 | + ra = regcache_raw_get_unsigned(regcache, lra); | ||
| 733 | + else | ||
| 734 | + ra = 0; | ||
| 735 | + if (lrb >= 0 && lrb < MICROBLAZE_NUM_REGS) | ||
| 736 | + rb = regcache_raw_get_unsigned(regcache, lrb); | ||
| 737 | + else | ||
| 738 | + rb = 0; | ||
| 739 | + stepbreaks[1].address = microblaze_get_target_address (insn, immfound, imm, pc, ra, rb, &targetvalid, &unconditionalbranch); | ||
| 740 | + microblaze_debug ("single-step uncondbr=%d targetvalid=%d target=%x\n", unconditionalbranch, targetvalid, stepbreaks[1].address); | ||
| 741 | + if (unconditionalbranch) | ||
| 742 | + stepbreaks[0].valid = FALSE; /* This is a unconditional branch: will not come to the next address */ | ||
| 743 | + if (targetvalid && (stepbreaks[0].valid == FALSE || | ||
| 744 | + (stepbreaks[0].address != stepbreaks[1].address)) | ||
| 745 | + && (stepbreaks[1].address != pc)) { | ||
| 746 | + stepbreaks[1].valid = TRUE; | ||
| 747 | + } else { | ||
| 748 | + stepbreaks[1].valid = FALSE; | ||
| 749 | + } | ||
| 750 | + } else { | ||
| 751 | + stepbreaks[1].valid = FALSE; | ||
| 752 | + } | ||
| 753 | + | ||
| 754 | + /* Insert the breakpoints */ | ||
| 755 | + for (ii = 0; ii < 2; ++ii) | ||
| 756 | + { | ||
| 757 | + | ||
| 758 | + /* ignore invalid breakpoint. */ | ||
| 759 | + if (stepbreaks[ii].valid) { | ||
| 760 | + VEC_safe_push (CORE_ADDR, next_pcs, stepbreaks[ii].address);; | ||
| 761 | +// insert_single_step_breakpoint (arch, aspace, stepbreaks[ii].address); | ||
| 762 | + ret = next_pcs; | ||
| 763 | + } | ||
| 764 | + } | ||
| 765 | + } | ||
| 766 | + return ret; | ||
| 767 | +} | ||
| 768 | +#endif | ||
| 769 | + | ||
| 770 | +static void | ||
| 771 | +microblaze_write_pc (struct regcache *regcache, CORE_ADDR pc) | ||
| 772 | +{ | ||
| 773 | + regcache_cooked_write_unsigned (regcache, MICROBLAZE_PC_REGNUM, pc); | ||
| 774 | +} | ||
| 775 | + | ||
| 776 | static int dwarf2_to_reg_map[78] = | ||
| 777 | { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */ | ||
| 778 | 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */ | ||
| 779 | @@ -682,13 +799,14 @@ microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg) | ||
| 780 | static void | ||
| 781 | microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) | ||
| 782 | { | ||
| 783 | + | ||
| 784 | register_remote_g_packet_guess (gdbarch, | ||
| 785 | - 4 * MICROBLAZE_NUM_CORE_REGS, | ||
| 786 | - tdesc_microblaze); | ||
| 787 | + 4 * MICROBLAZE_NUM_REGS, | ||
| 788 | + tdesc_microblaze64); | ||
| 789 | |||
| 790 | register_remote_g_packet_guess (gdbarch, | ||
| 791 | 4 * MICROBLAZE_NUM_REGS, | ||
| 792 | - tdesc_microblaze_with_stack_protect); | ||
| 793 | + tdesc_microblaze64_with_stack_protect); | ||
| 794 | } | ||
| 795 | |||
| 796 | void | ||
| 797 | @@ -696,15 +814,15 @@ microblaze_supply_gregset (const struct microblaze_gregset *gregset, | ||
| 798 | struct regcache *regcache, | ||
| 799 | int regnum, const void *gregs) | ||
| 800 | { | ||
| 801 | - unsigned int *regs = gregs; | ||
| 802 | + const gdb_byte *regs = (const gdb_byte *) gregs; | ||
| 803 | if (regnum >= 0) | ||
| 804 | - regcache_raw_supply (regcache, regnum, regs + regnum); | ||
| 805 | + regcache->raw_supply (regnum, regs + regnum); | ||
| 806 | |||
| 807 | if (regnum == -1) { | ||
| 808 | int i; | ||
| 809 | |||
| 810 | for (i = 0; i < 50; i++) { | ||
| 811 | - regcache_raw_supply (regcache, i, regs + i); | ||
| 812 | + regcache->raw_supply (regnum, regs + i); | ||
| 813 | } | ||
| 814 | } | ||
| 815 | } | ||
| 816 | @@ -755,6 +873,17 @@ microblaze_regset_from_core_section (struct gdbarch *gdbarch, | ||
| 817 | } | ||
| 818 | |||
| 819 | |||
| 820 | +static void | ||
| 821 | +make_regs (struct gdbarch *arch) | ||
| 822 | +{ | ||
| 823 | + struct gdbarch_tdep *tdep = gdbarch_tdep (arch); | ||
| 824 | + int mach = gdbarch_bfd_arch_info (arch)->mach; | ||
| 825 | + | ||
| 826 | + if (mach == bfd_mach_microblaze64) | ||
| 827 | + { | ||
| 828 | + set_gdbarch_ptr_bit (arch, 64); | ||
| 829 | + } | ||
| 830 | +} | ||
| 831 | |||
| 832 | static struct gdbarch * | ||
| 833 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 834 | @@ -769,8 +898,15 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 835 | if (arches != NULL) | ||
| 836 | return arches->gdbarch; | ||
| 837 | if (tdesc == NULL) | ||
| 838 | - tdesc = tdesc_microblaze; | ||
| 839 | - | ||
| 840 | + { | ||
| 841 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) | ||
| 842 | + { | ||
| 843 | + tdesc = tdesc_microblaze64; | ||
| 844 | + reg_size = 8; | ||
| 845 | + } | ||
| 846 | + else | ||
| 847 | + tdesc = tdesc_microblaze; | ||
| 848 | + } | ||
| 849 | /* Check any target description for validity. */ | ||
| 850 | if (tdesc_has_registers (tdesc)) | ||
| 851 | { | ||
| 852 | @@ -778,27 +914,35 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 853 | int valid_p; | ||
| 854 | int i; | ||
| 855 | |||
| 856 | - feature = tdesc_find_feature (tdesc, | ||
| 857 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) | ||
| 858 | + feature = tdesc_find_feature (tdesc, | ||
| 859 | + "org.gnu.gdb.microblaze64.core"); | ||
| 860 | + else | ||
| 861 | + feature = tdesc_find_feature (tdesc, | ||
| 862 | "org.gnu.gdb.microblaze.core"); | ||
| 863 | if (feature == NULL) | ||
| 864 | return NULL; | ||
| 865 | tdesc_data = tdesc_data_alloc (); | ||
| 866 | |||
| 867 | valid_p = 1; | ||
| 868 | - for (i = 0; i < MICROBLAZE_NUM_CORE_REGS; i++) | ||
| 869 | + for (i = 0; i < MICROBLAZE_NUM_REGS; i++) | ||
| 870 | valid_p &= tdesc_numbered_register (feature, tdesc_data, i, | ||
| 871 | microblaze_register_names[i]); | ||
| 872 | - feature = tdesc_find_feature (tdesc, | ||
| 873 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) | ||
| 874 | + feature = tdesc_find_feature (tdesc, | ||
| 875 | + "org.gnu.gdb.microblaze64.stack-protect"); | ||
| 876 | + else | ||
| 877 | + feature = tdesc_find_feature (tdesc, | ||
| 878 | "org.gnu.gdb.microblaze.stack-protect"); | ||
| 879 | if (feature != NULL) | ||
| 880 | { | ||
| 881 | valid_p = 1; | ||
| 882 | valid_p &= tdesc_numbered_register (feature, tdesc_data, | ||
| 883 | MICROBLAZE_SLR_REGNUM, | ||
| 884 | - "rslr"); | ||
| 885 | + "slr"); | ||
| 886 | valid_p &= tdesc_numbered_register (feature, tdesc_data, | ||
| 887 | MICROBLAZE_SHR_REGNUM, | ||
| 888 | - "rshr"); | ||
| 889 | + "shr"); | ||
| 890 | } | ||
| 891 | |||
| 892 | if (!valid_p) | ||
| 893 | @@ -806,6 +950,7 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 894 | tdesc_data_cleanup (tdesc_data); | ||
| 895 | return NULL; | ||
| 896 | } | ||
| 897 | + | ||
| 898 | } | ||
| 899 | |||
| 900 | /* Allocate space for the new architecture. */ | ||
| 901 | @@ -825,7 +970,17 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 902 | /* Register numbers of various important registers. */ | ||
| 903 | set_gdbarch_sp_regnum (gdbarch, MICROBLAZE_SP_REGNUM); | ||
| 904 | set_gdbarch_pc_regnum (gdbarch, MICROBLAZE_PC_REGNUM); | ||
| 905 | + | ||
| 906 | + /* Register set. | ||
| 907 | + make_regs (gdbarch); */ | ||
| 908 | + switch (info.bfd_arch_info->mach) | ||
| 909 | + { | ||
| 910 | + case bfd_mach_microblaze64: | ||
| 911 | + set_gdbarch_ptr_bit (gdbarch, 64); | ||
| 912 | + break; | ||
| 913 | + } | ||
| 914 | |||
| 915 | + | ||
| 916 | /* Map Dwarf2 registers to GDB registers. */ | ||
| 917 | set_gdbarch_dwarf2_reg_to_regnum (gdbarch, microblaze_dwarf2_reg_to_regnum); | ||
| 918 | |||
| 919 | @@ -845,13 +1000,15 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 920 | microblaze_breakpoint::kind_from_pc); | ||
| 921 | set_gdbarch_sw_breakpoint_from_kind (gdbarch, | ||
| 922 | microblaze_breakpoint::bp_from_kind); | ||
| 923 | - set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); | ||
| 924 | +// set_gdbarch_memory_remove_breakpoint (gdbarch, microblaze_linux_memory_remove_breakpoint); | ||
| 925 | + | ||
| 926 | +// set_gdbarch_software_single_step (gdbarch, microblaze_software_single_step); | ||
| 927 | |||
| 928 | set_gdbarch_frame_args_skip (gdbarch, 8); | ||
| 929 | |||
| 930 | set_gdbarch_unwind_pc (gdbarch, microblaze_unwind_pc); | ||
| 931 | |||
| 932 | - microblaze_register_g_packet_guesses (gdbarch); | ||
| 933 | + //microblaze_register_g_packet_guesses (gdbarch); | ||
| 934 | |||
| 935 | frame_base_set_default (gdbarch, µblaze_frame_base); | ||
| 936 | |||
| 937 | @@ -866,11 +1023,11 @@ microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 938 | tdesc_use_registers (gdbarch, tdesc, tdesc_data); | ||
| 939 | //frame_base_append_sniffer (gdbarch, microblaze_frame_sniffer); | ||
| 940 | |||
| 941 | - /* If we have register sets, enable the generic core file support. */ | ||
| 942 | + /* If we have register sets, enable the generic core file support. | ||
| 943 | if (tdep->gregset) { | ||
| 944 | set_gdbarch_regset_from_core_section (gdbarch, | ||
| 945 | microblaze_regset_from_core_section); | ||
| 946 | - } | ||
| 947 | + }*/ | ||
| 948 | |||
| 949 | return gdbarch; | ||
| 950 | } | ||
| 951 | @@ -883,6 +1040,8 @@ _initialize_microblaze_tdep () | ||
| 952 | |||
| 953 | initialize_tdesc_microblaze_with_stack_protect (); | ||
| 954 | initialize_tdesc_microblaze (); | ||
| 955 | + initialize_tdesc_microblaze64_with_stack_protect (); | ||
| 956 | + initialize_tdesc_microblaze64 (); | ||
| 957 | /* Debug this files internals. */ | ||
| 958 | add_setshow_zuinteger_cmd ("microblaze", class_maintenance, | ||
| 959 | µblaze_debug_flag, _("\ | ||
| 960 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
| 961 | index 1234f8a36f..c0fc900733 100644 | ||
| 962 | --- a/gdb/microblaze-tdep.h | ||
| 963 | +++ b/gdb/microblaze-tdep.h | ||
| 964 | @@ -27,7 +27,7 @@ struct microblaze_gregset | ||
| 965 | microblaze_gregset() {} | ||
| 966 | unsigned int gregs[32]; | ||
| 967 | unsigned int fpregs[32]; | ||
| 968 | - unsigned int pregs[16]; | ||
| 969 | + unsigned int pregs[18]; | ||
| 970 | }; | ||
| 971 | |||
| 972 | struct gdbarch_tdep | ||
| 973 | @@ -101,9 +101,9 @@ enum microblaze_regnum | ||
| 974 | MICROBLAZE_RTLBSX_REGNUM, | ||
| 975 | MICROBLAZE_RTLBLO_REGNUM, | ||
| 976 | MICROBLAZE_RTLBHI_REGNUM, | ||
| 977 | - MICROBLAZE_SLR_REGNUM, MICROBLAZE_NUM_CORE_REGS = MICROBLAZE_SLR_REGNUM, | ||
| 978 | + MICROBLAZE_SLR_REGNUM, | ||
| 979 | MICROBLAZE_SHR_REGNUM, | ||
| 980 | - MICROBLAZE_NUM_REGS | ||
| 981 | + MICROBLAZE_NUM_REGS, MICROBLAZE_NUM_CORE_REGS = MICROBLAZE_NUM_REGS | ||
| 982 | }; | ||
| 983 | |||
| 984 | struct microblaze_frame_cache | ||
| 985 | @@ -128,7 +128,7 @@ struct microblaze_frame_cache | ||
| 986 | struct trad_frame_saved_reg *saved_regs; | ||
| 987 | }; | ||
| 988 | /* All registers are 32 bits. */ | ||
| 989 | -#define MICROBLAZE_REGISTER_SIZE 4 | ||
| 990 | +//#define MICROBLAZE_REGISTER_SIZE 8 | ||
| 991 | |||
| 992 | /* MICROBLAZE_BREAKPOINT defines the breakpoint that should be used. | ||
| 993 | Only used for native debugging. */ | ||
| 994 | diff --git a/gdb/regformats/microblaze-with-stack-protect.dat b/gdb/regformats/microblaze-with-stack-protect.dat | ||
| 995 | index 8040a7b3fd..450e321d49 100644 | ||
| 996 | --- a/gdb/regformats/microblaze-with-stack-protect.dat | ||
| 997 | +++ b/gdb/regformats/microblaze-with-stack-protect.dat | ||
| 998 | @@ -60,5 +60,5 @@ expedite:r1,rpc | ||
| 999 | 32:rtlbsx | ||
| 1000 | 32:rtlblo | ||
| 1001 | 32:rtlbhi | ||
| 1002 | -32:rslr | ||
| 1003 | -32:rshr | ||
| 1004 | +32:slr | ||
| 1005 | +32:shr | ||
| 1006 | -- | ||
| 1007 | 2.17.1 | ||
| 1008 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0042-porting-GDB-for-linux.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0042-porting-GDB-for-linux.patch deleted file mode 100644 index e115666c..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0042-porting-GDB-for-linux.patch +++ /dev/null | |||
| @@ -1,155 +0,0 @@ | |||
| 1 | From c810c6e2a6ae66426444580d04659e8b2d0b2daa Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Thu, 12 Dec 2019 14:56:17 +0530 | ||
| 4 | Subject: [PATCH 42/52] porting GDB for linux | ||
| 5 | |||
| 6 | --- | ||
| 7 | gdb/features/microblaze-linux.xml | 12 ++++++++++ | ||
| 8 | gdb/microblaze-linux-tdep.c | 39 ++++++++++++++++++++++++------- | ||
| 9 | gdbserver/Makefile.in | 2 ++ | ||
| 10 | gdbserver/configure.srv | 3 ++- | ||
| 11 | 4 files changed, 47 insertions(+), 9 deletions(-) | ||
| 12 | create mode 100644 gdb/features/microblaze-linux.xml | ||
| 13 | |||
| 14 | diff --git a/gdb/features/microblaze-linux.xml b/gdb/features/microblaze-linux.xml | ||
| 15 | new file mode 100644 | ||
| 16 | index 0000000000..8983e66eb3 | ||
| 17 | --- /dev/null | ||
| 18 | +++ b/gdb/features/microblaze-linux.xml | ||
| 19 | @@ -0,0 +1,12 @@ | ||
| 20 | +<?xml version="1.0"?> | ||
| 21 | +<!-- Copyright (C) 2014-2018 Free Software Foundation, Inc. | ||
| 22 | + | ||
| 23 | + Copying and distribution of this file, with or without modification, | ||
| 24 | + are permitted in any medium without royalty provided the copyright | ||
| 25 | + notice and this notice are preserved. --> | ||
| 26 | + | ||
| 27 | +<!DOCTYPE target SYSTEM "gdb-target.dtd"> | ||
| 28 | +<target> | ||
| 29 | + <osabi>GNU/Linux</osabi> | ||
| 30 | + <xi:include href="microblaze-core.xml"/> | ||
| 31 | +</target> | ||
| 32 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | ||
| 33 | index a2e858d10f..a37c4c86f4 100644 | ||
| 34 | --- a/gdb/microblaze-linux-tdep.c | ||
| 35 | +++ b/gdb/microblaze-linux-tdep.c | ||
| 36 | @@ -41,7 +41,7 @@ | ||
| 37 | |||
| 38 | #ifndef REGSET_H | ||
| 39 | #define REGSET_H 1 | ||
| 40 | - | ||
| 41 | +int MICROBLAZE_REGISTER_SIZE=4; | ||
| 42 | struct gdbarch; | ||
| 43 | struct regcache; | ||
| 44 | |||
| 45 | @@ -115,7 +115,7 @@ microblaze_debug (const char *fmt, ...) | ||
| 46 | va_end (args); | ||
| 47 | } | ||
| 48 | } | ||
| 49 | - | ||
| 50 | +#if 0 | ||
| 51 | static int | ||
| 52 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 53 | struct bp_target_info *bp_tgt) | ||
| 54 | @@ -131,7 +131,7 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 55 | bp = gdbarch_breakpoint_from_pc (gdbarch, &addr, &bplen); | ||
| 56 | |||
| 57 | /* Make sure we see the memory breakpoints. */ | ||
| 58 | - cleanup = make_show_memory_breakpoints_cleanup (1); | ||
| 59 | + cleanup = make_scoped_restore_show_memory_breakpoints (1); | ||
| 60 | val = target_read_memory (addr, old_contents, bplen); | ||
| 61 | |||
| 62 | /* If our breakpoint is no longer at the address, this means that the | ||
| 63 | @@ -146,6 +146,7 @@ microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 64 | do_cleanups (cleanup); | ||
| 65 | return val; | ||
| 66 | } | ||
| 67 | +#endif | ||
| 68 | |||
| 69 | static void | ||
| 70 | microblaze_linux_sigtramp_cache (struct frame_info *next_frame, | ||
| 71 | @@ -248,8 +249,8 @@ microblaze_linux_init_abi (struct gdbarch_info info, | ||
| 72 | |||
| 73 | linux_init_abi (info, gdbarch); | ||
| 74 | |||
| 75 | - set_gdbarch_memory_remove_breakpoint (gdbarch, | ||
| 76 | - microblaze_linux_memory_remove_breakpoint); | ||
| 77 | +// set_gdbarch_memory_remove_breakpoint (gdbarch, | ||
| 78 | +// microblaze_linux_memory_remove_breakpoint); | ||
| 79 | |||
| 80 | /* Shared library handling. */ | ||
| 81 | set_solib_svr4_fetch_link_map_offsets (gdbarch, | ||
| 82 | @@ -261,10 +262,30 @@ microblaze_linux_init_abi (struct gdbarch_info info, | ||
| 83 | |||
| 84 | /* BFD target for core files. */ | ||
| 85 | if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) | ||
| 86 | - set_gdbarch_gcore_bfd_target (gdbarch, "elf32-microblaze"); | ||
| 87 | + { | ||
| 88 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) { | ||
| 89 | + set_gdbarch_gcore_bfd_target (gdbarch, "elf64-microblaze"); | ||
| 90 | + MICROBLAZE_REGISTER_SIZE=8; | ||
| 91 | + } | ||
| 92 | + else | ||
| 93 | + set_gdbarch_gcore_bfd_target (gdbarch, "elf32-microblaze"); | ||
| 94 | + } | ||
| 95 | else | ||
| 96 | - set_gdbarch_gcore_bfd_target (gdbarch, "elf32-microblazeel"); | ||
| 97 | + { | ||
| 98 | + if (info.bfd_arch_info->mach == bfd_mach_microblaze64) { | ||
| 99 | + set_gdbarch_gcore_bfd_target (gdbarch, "elf64-microblazeel"); | ||
| 100 | + MICROBLAZE_REGISTER_SIZE=8; | ||
| 101 | + } | ||
| 102 | + else | ||
| 103 | + set_gdbarch_gcore_bfd_target (gdbarch, "elf32-microblazeel"); | ||
| 104 | + } | ||
| 105 | |||
| 106 | + switch (info.bfd_arch_info->mach) | ||
| 107 | + { | ||
| 108 | + case bfd_mach_microblaze64: | ||
| 109 | + set_gdbarch_ptr_bit (gdbarch, 64); | ||
| 110 | + break; | ||
| 111 | + } | ||
| 112 | |||
| 113 | /* Shared library handling. */ | ||
| 114 | set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target); | ||
| 115 | @@ -279,6 +300,8 @@ void _initialize_microblaze_linux_tdep (); | ||
| 116 | void | ||
| 117 | _initialize_microblaze_linux_tdep () | ||
| 118 | { | ||
| 119 | - gdbarch_register_osabi (bfd_arch_microblaze, 0, GDB_OSABI_LINUX, | ||
| 120 | + gdbarch_register_osabi (bfd_arch_microblaze, bfd_mach_microblaze, GDB_OSABI_LINUX, | ||
| 121 | + microblaze_linux_init_abi); | ||
| 122 | + gdbarch_register_osabi (bfd_arch_microblaze, bfd_mach_microblaze64, GDB_OSABI_LINUX, | ||
| 123 | microblaze_linux_init_abi); | ||
| 124 | } | ||
| 125 | diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in | ||
| 126 | index df354d636c..680f536c06 100644 | ||
| 127 | --- a/gdbserver/Makefile.in | ||
| 128 | +++ b/gdbserver/Makefile.in | ||
| 129 | @@ -559,6 +559,8 @@ target/%.o: ../gdb/target/%.c | ||
| 130 | |||
| 131 | %-generated.cc: ../gdb/regformats/rs6000/%.dat $(regdat_sh) | ||
| 132 | $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ | ||
| 133 | +microblaze-linux.c : $(srcdir)/../regformats/reg-microblaze.dat $(regdat_sh) | ||
| 134 | + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/reg-microblaze.dat microblaze-linux.c | ||
| 135 | |||
| 136 | # | ||
| 137 | # Dependency tracking. | ||
| 138 | diff --git a/gdbserver/configure.srv b/gdbserver/configure.srv | ||
| 139 | index 456f4b3349..ff9ada71b0 100644 | ||
| 140 | --- a/gdbserver/configure.srv | ||
| 141 | +++ b/gdbserver/configure.srv | ||
| 142 | @@ -155,8 +155,9 @@ case "${gdbserver_host}" in | ||
| 143 | srv_linux_usrregs=yes | ||
| 144 | srv_linux_thread_db=yes | ||
| 145 | ;; | ||
| 146 | - microblaze*-*-linux*) srv_regobj=microblaze-linux.o | ||
| 147 | + microblaze*-*-linux*) srv_regobj="microblaze-linux.o" | ||
| 148 | srv_tgtobj="$srv_linux_obj linux-microblaze-low.o " | ||
| 149 | + srv_xmlfiles="microblaze-linux.xml" | ||
| 150 | srv_linux_regsets=yes | ||
| 151 | srv_linux_usrregs=yes | ||
| 152 | srv_linux_thread_db=yes | ||
| 153 | -- | ||
| 154 | 2.17.1 | ||
| 155 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0043-Binutils-security-check-is-causing-build-error-for-w.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0043-Binutils-security-check-is-causing-build-error-for-w.patch deleted file mode 100644 index 969ac2c0..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0043-Binutils-security-check-is-causing-build-error-for-w.patch +++ /dev/null | |||
| @@ -1,41 +0,0 @@ | |||
| 1 | From 27c8f7f202ea66cd0f4745ca3a77b4f33b6f5990 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Mon, 11 Mar 2019 13:57:42 +0530 | ||
| 4 | Subject: [PATCH 43/52] Binutils security check is causing build error for | ||
| 5 | windows builds.commenting for now. | ||
| 6 | |||
| 7 | --- | ||
| 8 | bfd/elf-attrs.c | 4 ++++ | ||
| 9 | 1 file changed, 4 insertions(+) | ||
| 10 | |||
| 11 | diff --git a/bfd/elf-attrs.c b/bfd/elf-attrs.c | ||
| 12 | index 070104c273..b135ac8f11 100644 | ||
| 13 | --- a/bfd/elf-attrs.c | ||
| 14 | +++ b/bfd/elf-attrs.c | ||
| 15 | @@ -436,12 +436,15 @@ _bfd_elf_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr) | ||
| 16 | bfd_byte *p_end; | ||
| 17 | bfd_vma len; | ||
| 18 | const char *std_sec; | ||
| 19 | +#if 0 | ||
| 20 | ufile_ptr filesize; | ||
| 21 | +#endif | ||
| 22 | |||
| 23 | /* PR 17512: file: 2844a11d. */ | ||
| 24 | if (hdr->sh_size == 0) | ||
| 25 | return; | ||
| 26 | |||
| 27 | +#if 0 | ||
| 28 | filesize = bfd_get_file_size (abfd); | ||
| 29 | if (filesize != 0 && hdr->sh_size > filesize) | ||
| 30 | { | ||
| 31 | @@ -451,6 +454,7 @@ _bfd_elf_parse_attributes (bfd *abfd, Elf_Internal_Shdr * hdr) | ||
| 32 | bfd_set_error (bfd_error_invalid_operation); | ||
| 33 | return; | ||
| 34 | } | ||
| 35 | +#endif | ||
| 36 | |||
| 37 | contents = (bfd_byte *) bfd_malloc (hdr->sh_size + 1); | ||
| 38 | if (!contents) | ||
| 39 | -- | ||
| 40 | 2.17.1 | ||
| 41 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0044-Correcting-the-register-names-from-slr-shr-to-rslr-r.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0044-Correcting-the-register-names-from-slr-shr-to-rslr-r.patch deleted file mode 100644 index 48c9c2c9..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0044-Correcting-the-register-names-from-slr-shr-to-rslr-r.patch +++ /dev/null | |||
| @@ -1,146 +0,0 @@ | |||
| 1 | From ba70b41346a8d5c9c1a4435f70edbb06e117564d Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nagaraju <nmekala@xilinx.com> | ||
| 3 | Date: Thu, 19 Dec 2019 12:22:04 +0530 | ||
| 4 | Subject: [PATCH 44/52] Correcting the register names from slr & shr to rslr & | ||
| 5 | rshr | ||
| 6 | |||
| 7 | --- | ||
| 8 | gdb/features/microblaze-core.xml | 4 ++-- | ||
| 9 | gdb/features/microblaze-stack-protect.xml | 4 ++-- | ||
| 10 | gdb/features/microblaze-with-stack-protect.c | 4 ++-- | ||
| 11 | gdb/features/microblaze.c | 4 ++-- | ||
| 12 | gdb/features/microblaze64-core.xml | 4 ++-- | ||
| 13 | gdb/features/microblaze64-stack-protect.xml | 4 ++-- | ||
| 14 | gdb/features/microblaze64-with-stack-protect.c | 4 ++-- | ||
| 15 | gdb/features/microblaze64.c | 4 ++-- | ||
| 16 | gdb/microblaze-tdep.c | 2 +- | ||
| 17 | 9 files changed, 17 insertions(+), 17 deletions(-) | ||
| 18 | |||
| 19 | diff --git a/gdb/features/microblaze-core.xml b/gdb/features/microblaze-core.xml | ||
| 20 | index a87f0f2319..d1f2282fd1 100644 | ||
| 21 | --- a/gdb/features/microblaze-core.xml | ||
| 22 | +++ b/gdb/features/microblaze-core.xml | ||
| 23 | @@ -64,6 +64,6 @@ | ||
| 24 | <reg name="rtlbsx" bitsize="32"/> | ||
| 25 | <reg name="rtlblo" bitsize="32"/> | ||
| 26 | <reg name="rtlbhi" bitsize="32"/> | ||
| 27 | - <reg name="slr" bitsize="32"/> | ||
| 28 | - <reg name="shr" bitsize="32"/> | ||
| 29 | + <reg name="rslr" bitsize="32"/> | ||
| 30 | + <reg name="rshr" bitsize="32"/> | ||
| 31 | </feature> | ||
| 32 | diff --git a/gdb/features/microblaze-stack-protect.xml b/gdb/features/microblaze-stack-protect.xml | ||
| 33 | index 1a67f88c18..1b16223406 100644 | ||
| 34 | --- a/gdb/features/microblaze-stack-protect.xml | ||
| 35 | +++ b/gdb/features/microblaze-stack-protect.xml | ||
| 36 | @@ -7,6 +7,6 @@ | ||
| 37 | |||
| 38 | <!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 39 | <feature name="org.gnu.gdb.microblaze.stack-protect"> | ||
| 40 | - <reg name="slr" bitsize="32"/> | ||
| 41 | - <reg name="shr" bitsize="32"/> | ||
| 42 | + <reg name="rslr" bitsize="32"/> | ||
| 43 | + <reg name="rshr" bitsize="32"/> | ||
| 44 | </feature> | ||
| 45 | diff --git a/gdb/features/microblaze-with-stack-protect.c b/gdb/features/microblaze-with-stack-protect.c | ||
| 46 | index 609934e2b4..ab162fd258 100644 | ||
| 47 | --- a/gdb/features/microblaze-with-stack-protect.c | ||
| 48 | +++ b/gdb/features/microblaze-with-stack-protect.c | ||
| 49 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze_with_stack_protect (void) | ||
| 50 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 51 | |||
| 52 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.stack-protect"); | ||
| 53 | - tdesc_create_reg (feature, "slr", 57, 1, NULL, 32, "int"); | ||
| 54 | - tdesc_create_reg (feature, "shr", 58, 1, NULL, 32, "int"); | ||
| 55 | + tdesc_create_reg (feature, "rslr", 57, 1, NULL, 32, "int"); | ||
| 56 | + tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int"); | ||
| 57 | |||
| 58 | tdesc_microblaze_with_stack_protect = result; | ||
| 59 | } | ||
| 60 | diff --git a/gdb/features/microblaze.c b/gdb/features/microblaze.c | ||
| 61 | index ceb98ca8b8..7919ac96e6 100644 | ||
| 62 | --- a/gdb/features/microblaze.c | ||
| 63 | +++ b/gdb/features/microblaze.c | ||
| 64 | @@ -70,8 +70,8 @@ initialize_tdesc_microblaze (void) | ||
| 65 | tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 66 | tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 67 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 68 | - tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 69 | - tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 70 | + tdesc_create_reg (feature, "rslr", 57, 1, NULL, 64, "uint64"); | ||
| 71 | + tdesc_create_reg (feature, "rshr", 58, 1, NULL, 64, "uint64"); | ||
| 72 | |||
| 73 | tdesc_microblaze = result; | ||
| 74 | } | ||
| 75 | diff --git a/gdb/features/microblaze64-core.xml b/gdb/features/microblaze64-core.xml | ||
| 76 | index 96e99e2fb2..b9adadfade 100644 | ||
| 77 | --- a/gdb/features/microblaze64-core.xml | ||
| 78 | +++ b/gdb/features/microblaze64-core.xml | ||
| 79 | @@ -64,6 +64,6 @@ | ||
| 80 | <reg name="rtlbsx" bitsize="32"/> | ||
| 81 | <reg name="rtlblo" bitsize="32"/> | ||
| 82 | <reg name="rtlbhi" bitsize="32"/> | ||
| 83 | - <reg name="slr" bitsize="64"/> | ||
| 84 | - <reg name="shr" bitsize="64"/> | ||
| 85 | + <reg name="rslr" bitsize="64"/> | ||
| 86 | + <reg name="rshr" bitsize="64"/> | ||
| 87 | </feature> | ||
| 88 | diff --git a/gdb/features/microblaze64-stack-protect.xml b/gdb/features/microblaze64-stack-protect.xml | ||
| 89 | index 1bbf5fc3ce..9d7ea8b9fd 100644 | ||
| 90 | --- a/gdb/features/microblaze64-stack-protect.xml | ||
| 91 | +++ b/gdb/features/microblaze64-stack-protect.xml | ||
| 92 | @@ -7,6 +7,6 @@ | ||
| 93 | |||
| 94 | <!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 95 | <feature name="org.gnu.gdb.microblaze64.stack-protect"> | ||
| 96 | - <reg name="slr" bitsize="64"/> | ||
| 97 | - <reg name="shr" bitsize="64"/> | ||
| 98 | + <reg name="rslr" bitsize="64"/> | ||
| 99 | + <reg name="rshr" bitsize="64"/> | ||
| 100 | </feature> | ||
| 101 | diff --git a/gdb/features/microblaze64-with-stack-protect.c b/gdb/features/microblaze64-with-stack-protect.c | ||
| 102 | index f448c9a749..249cb534da 100644 | ||
| 103 | --- a/gdb/features/microblaze64-with-stack-protect.c | ||
| 104 | +++ b/gdb/features/microblaze64-with-stack-protect.c | ||
| 105 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze64_with_stack_protect (void) | ||
| 106 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 107 | |||
| 108 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.stack-protect"); | ||
| 109 | - tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 110 | - tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 111 | + tdesc_create_reg (feature, "rslr", 57, 1, NULL, 64, "uint64"); | ||
| 112 | + tdesc_create_reg (feature, "rshr", 58, 1, NULL, 64, "uint64"); | ||
| 113 | |||
| 114 | tdesc_microblaze64_with_stack_protect = result; | ||
| 115 | } | ||
| 116 | diff --git a/gdb/features/microblaze64.c b/gdb/features/microblaze64.c | ||
| 117 | index 1aa37c4512..5d3e2c8cd9 100644 | ||
| 118 | --- a/gdb/features/microblaze64.c | ||
| 119 | +++ b/gdb/features/microblaze64.c | ||
| 120 | @@ -70,8 +70,8 @@ initialize_tdesc_microblaze64 (void) | ||
| 121 | tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 122 | tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 123 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 124 | - tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 125 | - tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 126 | + tdesc_create_reg (feature, "rslr", 57, 1, NULL, 64, "uint64"); | ||
| 127 | + tdesc_create_reg (feature, "rshr", 58, 1, NULL, 64, "uint64"); | ||
| 128 | |||
| 129 | tdesc_microblaze64 = result; | ||
| 130 | } | ||
| 131 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | ||
| 132 | index f4ea3cc342..041ebf1fca 100644 | ||
| 133 | --- a/gdb/microblaze-tdep.c | ||
| 134 | +++ b/gdb/microblaze-tdep.c | ||
| 135 | @@ -77,7 +77,7 @@ static const char *microblaze_register_names[] = | ||
| 136 | "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6", | ||
| 137 | "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11", | ||
| 138 | "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi", | ||
| 139 | - "slr", "shr" | ||
| 140 | + "rslr", "rshr" | ||
| 141 | }; | ||
| 142 | |||
| 143 | #define MICROBLAZE_NUM_REGS ARRAY_SIZE (microblaze_register_names) | ||
| 144 | -- | ||
| 145 | 2.17.1 | ||
| 146 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0045-Removing-the-header-gdb_assert.h-from-MB-target-file.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0045-Removing-the-header-gdb_assert.h-from-MB-target-file.patch deleted file mode 100644 index 46124c12..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0045-Removing-the-header-gdb_assert.h-from-MB-target-file.patch +++ /dev/null | |||
| @@ -1,24 +0,0 @@ | |||
| 1 | From 5fac707a9894ec9d0fcac14bbf0eb3ff631d0499 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Nagaraju <nmekala@xilinx.com> | ||
| 3 | Date: Fri, 17 Jan 2020 15:45:48 +0530 | ||
| 4 | Subject: [PATCH 45/52] Removing the header "gdb_assert.h" from MB target file | ||
| 5 | |||
| 6 | --- | ||
| 7 | gdb/microblaze-linux-tdep.c | 1 - | ||
| 8 | 1 file changed, 1 deletion(-) | ||
| 9 | |||
| 10 | diff --git a/gdb/microblaze-linux-tdep.c b/gdb/microblaze-linux-tdep.c | ||
| 11 | index a37c4c86f4..68e73d2e56 100644 | ||
| 12 | --- a/gdb/microblaze-linux-tdep.c | ||
| 13 | +++ b/gdb/microblaze-linux-tdep.c | ||
| 14 | @@ -37,7 +37,6 @@ | ||
| 15 | #include "linux-tdep.h" | ||
| 16 | #include "glibc-tdep.h" | ||
| 17 | |||
| 18 | -#include "gdb_assert.h" | ||
| 19 | |||
| 20 | #ifndef REGSET_H | ||
| 21 | #define REGSET_H 1 | ||
| 22 | -- | ||
| 23 | 2.17.1 | ||
| 24 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0046-bfd-cpu-microblaze.c-Enhance-disassembler.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0046-bfd-cpu-microblaze.c-Enhance-disassembler.patch deleted file mode 100644 index 46d51dd6..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0046-bfd-cpu-microblaze.c-Enhance-disassembler.patch +++ /dev/null | |||
| @@ -1,39 +0,0 @@ | |||
| 1 | From 1751b6fbc3170d29a3e2873b4394d058f8cb7d36 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | ||
| 3 | Date: Thu, 3 Dec 2020 10:08:53 -0800 | ||
| 4 | Subject: [PATCH 46/52] bfd/cpu-microblaze.c: Enhance disassembler | ||
| 5 | |||
| 6 | See commit aebcfb76fc165795e67917cb67cf985c4dfdc577 for why this is needed. | ||
| 7 | |||
| 8 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 9 | --- | ||
| 10 | bfd/cpu-microblaze.c | 6 ++++-- | ||
| 11 | 1 file changed, 4 insertions(+), 2 deletions(-) | ||
| 12 | |||
| 13 | diff --git a/bfd/cpu-microblaze.c b/bfd/cpu-microblaze.c | ||
| 14 | index f3e8bbda75..f3501df0e2 100644 | ||
| 15 | --- a/bfd/cpu-microblaze.c | ||
| 16 | +++ b/bfd/cpu-microblaze.c | ||
| 17 | @@ -39,7 +39,8 @@ const bfd_arch_info_type bfd_microblaze_arch[] = | ||
| 18 | bfd_default_compatible, /* Architecture comparison function. */ | ||
| 19 | bfd_default_scan, /* String to architecture conversion. */ | ||
| 20 | bfd_arch_default_fill, /* Default fill. */ | ||
| 21 | - &bfd_microblaze_arch[1] /* Next in list. */ | ||
| 22 | + &bfd_microblaze_arch[1], /* Next in list. */ | ||
| 23 | + 0 /* Maximum offset of a reloc from the start of an insn. */ | ||
| 24 | }, | ||
| 25 | { | ||
| 26 | 32, /* Bits in a word. */ | ||
| 27 | @@ -71,7 +72,8 @@ const bfd_arch_info_type bfd_microblaze_arch[] = | ||
| 28 | bfd_default_compatible, /* Architecture comparison function. */ | ||
| 29 | bfd_default_scan, /* String to architecture conversion. */ | ||
| 30 | bfd_arch_default_fill, /* Default fill. */ | ||
| 31 | - &bfd_microblaze_arch[1] /* Next in list. */ | ||
| 32 | + &bfd_microblaze_arch[1], /* Next in list. */ | ||
| 33 | + 0 /* Maximum offset of a reloc from the start of an insn. */ | ||
| 34 | }, | ||
| 35 | { | ||
| 36 | 64, /* 32 bits in a word. */ | ||
| 37 | -- | ||
| 38 | 2.17.1 | ||
| 39 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0047-bfd-elf64-microblaze.c-Fix-build-failures.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0047-bfd-elf64-microblaze.c-Fix-build-failures.patch deleted file mode 100644 index 423b224b..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0047-bfd-elf64-microblaze.c-Fix-build-failures.patch +++ /dev/null | |||
| @@ -1,78 +0,0 @@ | |||
| 1 | From 4500a281317093e78b7029e3dcb0037e7c628347 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | ||
| 3 | Date: Thu, 3 Dec 2020 11:02:11 -0800 | ||
| 4 | Subject: [PATCH 47/52] bfd/elf64-microblaze.c: Fix build failures | ||
| 5 | |||
| 6 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 7 | --- | ||
| 8 | bfd/elf64-microblaze.c | 16 ++++++++-------- | ||
| 9 | 1 file changed, 8 insertions(+), 8 deletions(-) | ||
| 10 | |||
| 11 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | ||
| 12 | index 338f16eeee..cf84e0db4e 100644 | ||
| 13 | --- a/bfd/elf64-microblaze.c | ||
| 14 | +++ b/bfd/elf64-microblaze.c | ||
| 15 | @@ -1572,7 +1572,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 16 | { | ||
| 17 | BFD_FAIL (); | ||
| 18 | (*_bfd_error_handler) | ||
| 19 | - (_("%B: probably compiled without -fPIC?"), | ||
| 20 | + (_("%pB: probably compiled without -fPIC?"), | ||
| 21 | input_bfd); | ||
| 22 | bfd_set_error (bfd_error_bad_value); | ||
| 23 | return FALSE; | ||
| 24 | @@ -2911,7 +2911,7 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | ||
| 25 | |||
| 26 | /* If we didn't find any dynamic relocs in read-only sections, then | ||
| 27 | we'll be keeping the dynamic relocs and avoiding the copy reloc. */ | ||
| 28 | - if (!_bfd_elf_readonly_dynrelocs (h)) | ||
| 29 | + if (p == NULL) | ||
| 30 | { | ||
| 31 | h->non_got_ref = 0; | ||
| 32 | return TRUE; | ||
| 33 | @@ -3096,7 +3096,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 34 | else | ||
| 35 | h->got.offset = (bfd_vma) -1; | ||
| 36 | |||
| 37 | - if (h->dyn_relocs == NULL) | ||
| 38 | + if (eh->dyn_relocs == NULL) | ||
| 39 | return TRUE; | ||
| 40 | |||
| 41 | /* In the shared -Bsymbolic case, discard space allocated for | ||
| 42 | @@ -3113,7 +3113,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 43 | { | ||
| 44 | struct elf64_mb_dyn_relocs **pp; | ||
| 45 | |||
| 46 | - for (pp = &h->dyn_relocs; (p = *pp) != NULL; ) | ||
| 47 | + for (pp = &eh->dyn_relocs; (p = *pp) != NULL; ) | ||
| 48 | { | ||
| 49 | p->count -= p->pc_count; | ||
| 50 | p->pc_count = 0; | ||
| 51 | @@ -3124,7 +3124,7 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 52 | } | ||
| 53 | } | ||
| 54 | else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) | ||
| 55 | - h->dyn_relocs = NULL; | ||
| 56 | + eh->dyn_relocs = NULL; | ||
| 57 | } | ||
| 58 | else | ||
| 59 | { | ||
| 60 | @@ -3154,13 +3154,13 @@ allocate_dynrelocs (struct elf_link_hash_entry *h, void * dat) | ||
| 61 | goto keep; | ||
| 62 | } | ||
| 63 | |||
| 64 | - h->dyn_relocs = NULL; | ||
| 65 | + eh->dyn_relocs = NULL; | ||
| 66 | |||
| 67 | keep: ; | ||
| 68 | } | ||
| 69 | |||
| 70 | /* Finally, allocate space. */ | ||
| 71 | - for (p = h->dyn_relocs; p != NULL; p = p->next) | ||
| 72 | + for (p = eh->dyn_relocs; p != NULL; p = p->next) | ||
| 73 | { | ||
| 74 | asection *sreloc = elf_section_data (p->sec)->sreloc; | ||
| 75 | sreloc->size += p->count * sizeof (Elf64_External_Rela); | ||
| 76 | -- | ||
| 77 | 2.17.1 | ||
| 78 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0048-bfd-elf-microblaze.c-Remove-obsolete-entries.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0048-bfd-elf-microblaze.c-Remove-obsolete-entries.patch deleted file mode 100644 index 7feaceb9..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0048-bfd-elf-microblaze.c-Remove-obsolete-entries.patch +++ /dev/null | |||
| @@ -1,75 +0,0 @@ | |||
| 1 | From 2f07425ca330dd357c374acdc30a27c6647454c9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | ||
| 3 | Date: Thu, 3 Dec 2020 11:23:26 -0800 | ||
| 4 | Subject: [PATCH 48/52] bfd/elf*-microblaze.c: Remove obsolete entries | ||
| 5 | |||
| 6 | Replace microblaze_elf_merge_private_bfd_data with a direct call to | ||
| 7 | _bfd_generic_verify_endian_match, this simplifies the implementation. | ||
| 8 | |||
| 9 | Remove microblaze_elf_gc_sweep_hook, removed in 2017. | ||
| 10 | |||
| 11 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 12 | --- | ||
| 13 | bfd/elf64-microblaze.c | 29 +---------------------------- | ||
| 14 | 1 file changed, 1 insertion(+), 28 deletions(-) | ||
| 15 | |||
| 16 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | ||
| 17 | index cf84e0db4e..786f659232 100644 | ||
| 18 | --- a/bfd/elf64-microblaze.c | ||
| 19 | +++ b/bfd/elf64-microblaze.c | ||
| 20 | @@ -1690,21 +1690,6 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 21 | return ret; | ||
| 22 | } | ||
| 23 | |||
| 24 | -/* Merge backend specific data from an object file to the output | ||
| 25 | - object file when linking. | ||
| 26 | - | ||
| 27 | - Note: We only use this hook to catch endian mismatches. */ | ||
| 28 | -static bfd_boolean | ||
| 29 | -microblaze_elf_merge_private_bfd_data (bfd * ibfd, bfd * obfd) | ||
| 30 | -{ | ||
| 31 | - /* Check if we have the same endianess. */ | ||
| 32 | - if (! _bfd_generic_verify_endian_match (ibfd, obfd)) | ||
| 33 | - return FALSE; | ||
| 34 | - | ||
| 35 | - return TRUE; | ||
| 36 | -} | ||
| 37 | - | ||
| 38 | - | ||
| 39 | /* Calculate fixup value for reference. */ | ||
| 40 | |||
| 41 | static int | ||
| 42 | @@ -2427,17 +2412,6 @@ microblaze_elf_gc_mark_hook (asection *sec, | ||
| 43 | return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym); | ||
| 44 | } | ||
| 45 | |||
| 46 | -/* Update the got entry reference counts for the section being removed. */ | ||
| 47 | - | ||
| 48 | -static bfd_boolean | ||
| 49 | -microblaze_elf_gc_sweep_hook (bfd * abfd ATTRIBUTE_UNUSED, | ||
| 50 | - struct bfd_link_info * info ATTRIBUTE_UNUSED, | ||
| 51 | - asection * sec ATTRIBUTE_UNUSED, | ||
| 52 | - const Elf_Internal_Rela * relocs ATTRIBUTE_UNUSED) | ||
| 53 | -{ | ||
| 54 | - return TRUE; | ||
| 55 | -} | ||
| 56 | - | ||
| 57 | /* PIC support. */ | ||
| 58 | |||
| 59 | #define PLT_ENTRY_SIZE 16 | ||
| 60 | @@ -3704,11 +3678,10 @@ microblaze_elf_add_symbol_hook (bfd *abfd, | ||
| 61 | #define bfd_elf64_bfd_is_local_label_name microblaze_elf_is_local_label_name | ||
| 62 | #define elf_backend_relocate_section microblaze_elf_relocate_section | ||
| 63 | #define bfd_elf64_bfd_relax_section microblaze_elf_relax_section | ||
| 64 | -#define bfd_elf64_bfd_merge_private_bfd_data microblaze_elf_merge_private_bfd_data | ||
| 65 | +#define bfd_elf64_bfd_merge_private_bfd_data _bfd_generic_verify_endian_match | ||
| 66 | #define bfd_elf64_bfd_reloc_name_lookup microblaze_elf_reloc_name_lookup | ||
| 67 | |||
| 68 | #define elf_backend_gc_mark_hook microblaze_elf_gc_mark_hook | ||
| 69 | -#define elf_backend_gc_sweep_hook microblaze_elf_gc_sweep_hook | ||
| 70 | #define elf_backend_check_relocs microblaze_elf_check_relocs | ||
| 71 | #define elf_backend_copy_indirect_symbol microblaze_elf_copy_indirect_symbol | ||
| 72 | #define bfd_elf64_bfd_link_hash_table_create microblaze_elf_link_hash_table_create | ||
| 73 | -- | ||
| 74 | 2.17.1 | ||
| 75 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0049-bfd-elf64-microblaze.c-Resolve-various-compiler-warn.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0049-bfd-elf64-microblaze.c-Resolve-various-compiler-warn.patch deleted file mode 100644 index 5f4a2714..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0049-bfd-elf64-microblaze.c-Resolve-various-compiler-warn.patch +++ /dev/null | |||
| @@ -1,45 +0,0 @@ | |||
| 1 | From a86506136a738c3ab64d42a876fbfdfa1d46ad64 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | ||
| 3 | Date: Thu, 3 Dec 2020 12:02:25 -0800 | ||
| 4 | Subject: [PATCH 49/52] bfd/elf64-microblaze.c: Resolve various compiler | ||
| 5 | warnings | ||
| 6 | |||
| 7 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 8 | --- | ||
| 9 | bfd/elf64-microblaze.c | 4 ++-- | ||
| 10 | 1 file changed, 2 insertions(+), 2 deletions(-) | ||
| 11 | |||
| 12 | diff --git a/bfd/elf64-microblaze.c b/bfd/elf64-microblaze.c | ||
| 13 | index 786f659232..70cd80cdf2 100644 | ||
| 14 | --- a/bfd/elf64-microblaze.c | ||
| 15 | +++ b/bfd/elf64-microblaze.c | ||
| 16 | @@ -1258,6 +1258,7 @@ microblaze_elf_relocate_section (bfd *output_bfd, | ||
| 17 | goto dogot; | ||
| 18 | case (int) R_MICROBLAZE_TLSLD: | ||
| 19 | tls_type = (TLS_TLS | TLS_LD); | ||
| 20 | + /* Fall through. */ | ||
| 21 | dogot: | ||
| 22 | case (int) R_MICROBLAZE_GOT_64: | ||
| 23 | { | ||
| 24 | @@ -2569,6 +2570,7 @@ microblaze_elf_check_relocs (bfd * abfd, | ||
| 25 | tls_type |= (TLS_TLS | TLS_LD); | ||
| 26 | dogottls: | ||
| 27 | sec->has_tls_reloc = 1; | ||
| 28 | + /* Fall through. */ | ||
| 29 | case R_MICROBLAZE_GOT_64: | ||
| 30 | if (htab->sgot == NULL) | ||
| 31 | { | ||
| 32 | @@ -2802,10 +2804,8 @@ microblaze_elf_adjust_dynamic_symbol (struct bfd_link_info *info, | ||
| 33 | struct elf64_mb_link_hash_table *htab; | ||
| 34 | struct elf64_mb_link_hash_entry * eh; | ||
| 35 | struct elf64_mb_dyn_relocs *p; | ||
| 36 | - asection *sdynbss; | ||
| 37 | asection *s, *srel; | ||
| 38 | unsigned int power_of_two; | ||
| 39 | - bfd *dynobj; | ||
| 40 | |||
| 41 | htab = elf64_mb_hash_table (info); | ||
| 42 | if (htab == NULL) | ||
| 43 | -- | ||
| 44 | 2.17.1 | ||
| 45 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0050-opcodes-microblaze-dis.c-Fix-compile-warnings.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0050-opcodes-microblaze-dis.c-Fix-compile-warnings.patch deleted file mode 100644 index 475a53ba..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0050-opcodes-microblaze-dis.c-Fix-compile-warnings.patch +++ /dev/null | |||
| @@ -1,37 +0,0 @@ | |||
| 1 | From de38a354e40a9dcc486c93faf02bee4b059fa34a Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | ||
| 3 | Date: Thu, 3 Dec 2020 12:30:09 -0800 | ||
| 4 | Subject: [PATCH 50/52] opcodes/microblaze-dis.c: Fix compile warnings | ||
| 5 | |||
| 6 | Two compiler warnings were evident, it appears both are likely real bugs. | ||
| 7 | |||
| 8 | Missing type declaration for a function, and a case statement without a break. | ||
| 9 | |||
| 10 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 11 | --- | ||
| 12 | opcodes/microblaze-dis.c | 2 ++ | ||
| 13 | 1 file changed, 2 insertions(+) | ||
| 14 | |||
| 15 | diff --git a/opcodes/microblaze-dis.c b/opcodes/microblaze-dis.c | ||
| 16 | index 90d2328659..f1c33dca14 100644 | ||
| 17 | --- a/opcodes/microblaze-dis.c | ||
| 18 | +++ b/opcodes/microblaze-dis.c | ||
| 19 | @@ -130,6 +130,7 @@ get_field_imm15 (struct string_buf *buf, long instr) | ||
| 20 | return p; | ||
| 21 | } | ||
| 22 | |||
| 23 | +static char * | ||
| 24 | get_field_imm16 (struct string_buf *buf, long instr) | ||
| 25 | { | ||
| 26 | char *p = strbuf (buf); | ||
| 27 | @@ -329,6 +330,7 @@ print_insn_microblaze (bfd_vma memaddr, struct disassemble_info * info) | ||
| 28 | print_func (stream, "\t%s, %s, %s", get_field_rd (&buf, inst), | ||
| 29 | get_field_r1 (&buf, inst), get_field_imm (&buf, inst)); | ||
| 30 | /* TODO: Also print symbol */ | ||
| 31 | + break; | ||
| 32 | case INST_TYPE_RD_R1_IMMS: | ||
| 33 | print_func (stream, "\t%s, %s, %s", get_field_rd (&buf, inst), | ||
| 34 | get_field_r1(&buf, inst), get_field_imms (&buf, inst)); | ||
| 35 | -- | ||
| 36 | 2.17.1 | ||
| 37 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0051-gdb-microblaze-tdep.c-Remove-unused-functions.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0051-gdb-microblaze-tdep.c-Remove-unused-functions.patch deleted file mode 100644 index 263f0a9b..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0051-gdb-microblaze-tdep.c-Remove-unused-functions.patch +++ /dev/null | |||
| @@ -1,99 +0,0 @@ | |||
| 1 | From f1686db8735972637d2bbcc6e2fbf391c1e848d9 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@xilinx.com> | ||
| 3 | Date: Thu, 3 Dec 2020 14:51:37 -0800 | ||
| 4 | Subject: [PATCH 51/52] gdb/microblaze-tdep.c: Remove unused functions | ||
| 5 | |||
| 6 | Compiler warns the removed functions are not referenced anywhere. | ||
| 7 | |||
| 8 | Signed-off-by: Mark Hatle <mark.hatle@xilinx.com> | ||
| 9 | --- | ||
| 10 | gdb/microblaze-tdep.c | 45 ------------------------------------------- | ||
| 11 | 1 file changed, 45 deletions(-) | ||
| 12 | |||
| 13 | diff --git a/gdb/microblaze-tdep.c b/gdb/microblaze-tdep.c | ||
| 14 | index 041ebf1fca..28f79f9ffc 100644 | ||
| 15 | --- a/gdb/microblaze-tdep.c | ||
| 16 | +++ b/gdb/microblaze-tdep.c | ||
| 17 | @@ -140,14 +140,6 @@ microblaze_fetch_instruction (CORE_ADDR pc) | ||
| 18 | constexpr gdb_byte microblaze_break_insn[] = MICROBLAZE_BREAKPOINT; | ||
| 19 | |||
| 20 | typedef BP_MANIPULATION (microblaze_break_insn) microblaze_breakpoint; | ||
| 21 | -static CORE_ADDR | ||
| 22 | -microblaze_store_arguments (struct regcache *regcache, int nargs, | ||
| 23 | - struct value **args, CORE_ADDR sp, | ||
| 24 | - int struct_return, CORE_ADDR struct_addr) | ||
| 25 | -{ | ||
| 26 | - error (_("store_arguments not implemented")); | ||
| 27 | - return sp; | ||
| 28 | -} | ||
| 29 | #if 0 | ||
| 30 | static int | ||
| 31 | microblaze_linux_memory_remove_breakpoint (struct gdbarch *gdbarch, | ||
| 32 | @@ -555,12 +547,6 @@ microblaze_frame_base_address (struct frame_info *next_frame, | ||
| 33 | return cache->base; | ||
| 34 | } | ||
| 35 | |||
| 36 | -static const struct frame_unwind * | ||
| 37 | -microblaze_frame_sniffer (struct frame_info *next_frame) | ||
| 38 | -{ | ||
| 39 | - return µblaze_frame_unwind; | ||
| 40 | -} | ||
| 41 | - | ||
| 42 | static const struct frame_base microblaze_frame_base = | ||
| 43 | { | ||
| 44 | µblaze_frame_unwind, | ||
| 45 | @@ -759,12 +745,6 @@ microblaze_software_single_step (struct regcache *regcache) | ||
| 46 | } | ||
| 47 | #endif | ||
| 48 | |||
| 49 | -static void | ||
| 50 | -microblaze_write_pc (struct regcache *regcache, CORE_ADDR pc) | ||
| 51 | -{ | ||
| 52 | - regcache_cooked_write_unsigned (regcache, MICROBLAZE_PC_REGNUM, pc); | ||
| 53 | -} | ||
| 54 | - | ||
| 55 | static int dwarf2_to_reg_map[78] = | ||
| 56 | { 0 /* r0 */, 1 /* r1 */, 2 /* r2 */, 3 /* r3 */, /* 0- 3 */ | ||
| 57 | 4 /* r4 */, 5 /* r5 */, 6 /* r6 */, 7 /* r7 */, /* 4- 7 */ | ||
| 58 | @@ -796,19 +776,6 @@ microblaze_dwarf2_reg_to_regnum (struct gdbarch *gdbarch, int reg) | ||
| 59 | return -1; | ||
| 60 | } | ||
| 61 | |||
| 62 | -static void | ||
| 63 | -microblaze_register_g_packet_guesses (struct gdbarch *gdbarch) | ||
| 64 | -{ | ||
| 65 | - | ||
| 66 | - register_remote_g_packet_guess (gdbarch, | ||
| 67 | - 4 * MICROBLAZE_NUM_REGS, | ||
| 68 | - tdesc_microblaze64); | ||
| 69 | - | ||
| 70 | - register_remote_g_packet_guess (gdbarch, | ||
| 71 | - 4 * MICROBLAZE_NUM_REGS, | ||
| 72 | - tdesc_microblaze64_with_stack_protect); | ||
| 73 | -} | ||
| 74 | - | ||
| 75 | void | ||
| 76 | microblaze_supply_gregset (const struct microblaze_gregset *gregset, | ||
| 77 | struct regcache *regcache, | ||
| 78 | @@ -873,18 +840,6 @@ microblaze_regset_from_core_section (struct gdbarch *gdbarch, | ||
| 79 | } | ||
| 80 | |||
| 81 | |||
| 82 | -static void | ||
| 83 | -make_regs (struct gdbarch *arch) | ||
| 84 | -{ | ||
| 85 | - struct gdbarch_tdep *tdep = gdbarch_tdep (arch); | ||
| 86 | - int mach = gdbarch_bfd_arch_info (arch)->mach; | ||
| 87 | - | ||
| 88 | - if (mach == bfd_mach_microblaze64) | ||
| 89 | - { | ||
| 90 | - set_gdbarch_ptr_bit (arch, 64); | ||
| 91 | - } | ||
| 92 | -} | ||
| 93 | - | ||
| 94 | static struct gdbarch * | ||
| 95 | microblaze_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) | ||
| 96 | { | ||
| 97 | -- | ||
| 98 | 2.17.1 | ||
| 99 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0052-sim-Allow-microblaze-architecture.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0052-sim-Allow-microblaze-architecture.patch deleted file mode 100644 index ee5caf0a..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0052-sim-Allow-microblaze-architecture.patch +++ /dev/null | |||
| @@ -1,40 +0,0 @@ | |||
| 1 | From 5fa859e73662f96c9cfaf21bd2cf01b92afc9c1c Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@kernel.crashing.org> | ||
| 3 | Date: Thu, 6 Aug 2020 15:37:52 -0500 | ||
| 4 | Subject: [PATCH 52/52] sim: Allow microblaze* architecture | ||
| 5 | |||
| 6 | Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org> | ||
| 7 | --- | ||
| 8 | sim/configure | 2 +- | ||
| 9 | sim/configure.tgt | 2 +- | ||
| 10 | 2 files changed, 2 insertions(+), 2 deletions(-) | ||
| 11 | |||
| 12 | diff --git a/sim/configure b/sim/configure | ||
| 13 | index 72f95cd5c7..9e28cc7868 100755 | ||
| 14 | --- a/sim/configure | ||
| 15 | +++ b/sim/configure | ||
| 16 | @@ -3795,7 +3795,7 @@ subdirs="$subdirs aarch64" | ||
| 17 | |||
| 18 | |||
| 19 | ;; | ||
| 20 | - microblaze-*-*) | ||
| 21 | + microblaze*-*-*) | ||
| 22 | |||
| 23 | sim_arch=microblaze | ||
| 24 | subdirs="$subdirs microblaze" | ||
| 25 | diff --git a/sim/configure.tgt b/sim/configure.tgt | ||
| 26 | index 8a8e03d96f..f6743fe8d4 100644 | ||
| 27 | --- a/sim/configure.tgt | ||
| 28 | +++ b/sim/configure.tgt | ||
| 29 | @@ -59,7 +59,7 @@ case "${target}" in | ||
| 30 | mcore-*-*) | ||
| 31 | SIM_ARCH(mcore) | ||
| 32 | ;; | ||
| 33 | - microblaze-*-*) | ||
| 34 | + microblaze*-*-*) | ||
| 35 | SIM_ARCH(microblaze) | ||
| 36 | ;; | ||
| 37 | mips*-*-*) | ||
| 38 | -- | ||
| 39 | 2.17.1 | ||
| 40 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0053-gdb-Fix-microblaze-target-compilation.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0053-gdb-Fix-microblaze-target-compilation.patch deleted file mode 100644 index af0e3268..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0053-gdb-Fix-microblaze-target-compilation.patch +++ /dev/null | |||
| @@ -1,288 +0,0 @@ | |||
| 1 | From efa3750ffda1ae16caf071b8b8ea31f752a3324a Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mark Hatle <mark.hatle@kernel.crashing.org> | ||
| 3 | Date: Mon, 7 Dec 2020 12:03:25 -0600 | ||
| 4 | Subject: [PATCH] gdb: Fix microblaze target compilation | ||
| 5 | |||
| 6 | Add microblaze-linux-nat.c to configure.nat | ||
| 7 | |||
| 8 | Transition microblaze-linux-nat.c to use the new gdb C++ style functions. | ||
| 9 | |||
| 10 | Signed-off-by: Mark Hatle <mark.hatle@kernel.crashing.org> | ||
| 11 | --- | ||
| 12 | gdb/configure.nat | 5 ++ | ||
| 13 | gdb/microblaze-linux-nat.c | 96 ++++++++++++++------------------------ | ||
| 14 | gdb/microblaze-tdep.h | 3 ++ | ||
| 15 | 3 files changed, 43 insertions(+), 61 deletions(-) | ||
| 16 | |||
| 17 | diff --git a/gdb/configure.nat b/gdb/configure.nat | ||
| 18 | index 6ea2583495..1fba80f6c9 100644 | ||
| 19 | --- a/gdb/configure.nat | ||
| 20 | +++ b/gdb/configure.nat | ||
| 21 | @@ -261,6 +261,11 @@ case ${gdb_host} in | ||
| 22 | # Host: Motorola m68k running GNU/Linux. | ||
| 23 | NATDEPFILES="${NATDEPFILES} m68k-linux-nat.o" | ||
| 24 | ;; | ||
| 25 | + microblaze) | ||
| 26 | + # Host: Microblaze running GNU/Linux. | ||
| 27 | + NATDEPFILES="${NATDEPFILES} microblaze-linux-nat.o" | ||
| 28 | + NAT_CDEPS= | ||
| 29 | + ;; | ||
| 30 | mips) | ||
| 31 | # Host: Linux/MIPS | ||
| 32 | NATDEPFILES="${NATDEPFILES} linux-nat-trad.o \ | ||
| 33 | diff --git a/gdb/microblaze-linux-nat.c b/gdb/microblaze-linux-nat.c | ||
| 34 | index e9b8c9c522..bac4697e1e 100644 | ||
| 35 | --- a/gdb/microblaze-linux-nat.c | ||
| 36 | +++ b/gdb/microblaze-linux-nat.c | ||
| 37 | @@ -36,13 +36,14 @@ | ||
| 38 | #include "dwarf2-frame.h" | ||
| 39 | #include "osabi.h" | ||
| 40 | |||
| 41 | -#include "gdb_assert.h" | ||
| 42 | -#include "gdb_string.h" | ||
| 43 | +#include "gdbsupport/gdb_assert.h" | ||
| 44 | +#include <string.h> | ||
| 45 | #include "target-descriptions.h" | ||
| 46 | #include "opcodes/microblaze-opcm.h" | ||
| 47 | #include "opcodes/microblaze-dis.h" | ||
| 48 | |||
| 49 | #include "linux-nat.h" | ||
| 50 | +#include "linux-tdep.h" | ||
| 51 | #include "target-descriptions.h" | ||
| 52 | |||
| 53 | #include <sys/user.h> | ||
| 54 | @@ -61,22 +62,17 @@ | ||
| 55 | /* Defines ps_err_e, struct ps_prochandle. */ | ||
| 56 | #include "gdb_proc_service.h" | ||
| 57 | |||
| 58 | -/* On GNU/Linux, threads are implemented as pseudo-processes, in which | ||
| 59 | - case we may be tracing more than one process at a time. In that | ||
| 60 | - case, inferior_ptid will contain the main process ID and the | ||
| 61 | - individual thread (process) ID. get_thread_id () is used to get | ||
| 62 | - the thread id if it's available, and the process id otherwise. */ | ||
| 63 | - | ||
| 64 | -int | ||
| 65 | -get_thread_id (ptid_t ptid) | ||
| 66 | +class microblaze_linux_nat_target final : public linux_nat_target | ||
| 67 | { | ||
| 68 | - int tid = TIDGET (ptid); | ||
| 69 | - if (0 == tid) | ||
| 70 | - tid = PIDGET (ptid); | ||
| 71 | - return tid; | ||
| 72 | -} | ||
| 73 | +public: | ||
| 74 | + /* Add our register access methods. */ | ||
| 75 | + void fetch_registers (struct regcache *, int) override; | ||
| 76 | + void store_registers (struct regcache *, int) override; | ||
| 77 | + | ||
| 78 | + const struct target_desc *read_description () override; | ||
| 79 | +}; | ||
| 80 | |||
| 81 | -#define GET_THREAD_ID(PTID) get_thread_id (PTID) | ||
| 82 | +static microblaze_linux_nat_target the_microblaze_linux_nat_target; | ||
| 83 | |||
| 84 | /* Non-zero if our kernel may support the PTRACE_GETREGS and | ||
| 85 | PTRACE_SETREGS requests, for reading and writing the | ||
| 86 | @@ -88,7 +84,6 @@ static int | ||
| 87 | microblaze_register_u_addr (struct gdbarch *gdbarch, int regno) | ||
| 88 | { | ||
| 89 | int u_addr = -1; | ||
| 90 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 91 | /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace | ||
| 92 | interface, and not the wordsize of the program's ABI. */ | ||
| 93 | int wordsize = sizeof (long); | ||
| 94 | @@ -105,18 +100,16 @@ microblaze_register_u_addr (struct gdbarch *gdbarch, int regno) | ||
| 95 | static void | ||
| 96 | fetch_register (struct regcache *regcache, int tid, int regno) | ||
| 97 | { | ||
| 98 | - struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 99 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 100 | + struct gdbarch *gdbarch = regcache->arch (); | ||
| 101 | /* This isn't really an address. But ptrace thinks of it as one. */ | ||
| 102 | CORE_ADDR regaddr = microblaze_register_u_addr (gdbarch, regno); | ||
| 103 | int bytes_transferred; | ||
| 104 | - unsigned int offset; /* Offset of registers within the u area. */ | ||
| 105 | - char buf[MAX_REGISTER_SIZE]; | ||
| 106 | + char buf[MICROBLAZE_MAX_REGISTER_SIZE]; | ||
| 107 | |||
| 108 | if (regaddr == -1) | ||
| 109 | { | ||
| 110 | memset (buf, '\0', register_size (gdbarch, regno)); /* Supply zeroes */ | ||
| 111 | - regcache_raw_supply (regcache, regno, buf); | ||
| 112 | + regcache->raw_supply (regno, buf); | ||
| 113 | return; | ||
| 114 | } | ||
| 115 | |||
| 116 | @@ -149,14 +142,14 @@ fetch_register (struct regcache *regcache, int tid, int regno) | ||
| 117 | { | ||
| 118 | /* Little-endian values are always found at the left end of the | ||
| 119 | bytes transferred. */ | ||
| 120 | - regcache_raw_supply (regcache, regno, buf); | ||
| 121 | + regcache->raw_supply (regno, buf); | ||
| 122 | } | ||
| 123 | else if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) | ||
| 124 | { | ||
| 125 | /* Big-endian values are found at the right end of the bytes | ||
| 126 | transferred. */ | ||
| 127 | size_t padding = (bytes_transferred - register_size (gdbarch, regno)); | ||
| 128 | - regcache_raw_supply (regcache, regno, buf + padding); | ||
| 129 | + regcache->raw_supply (regno, buf + padding); | ||
| 130 | } | ||
| 131 | else | ||
| 132 | internal_error (__FILE__, __LINE__, | ||
| 133 | @@ -175,8 +168,6 @@ fetch_register (struct regcache *regcache, int tid, int regno) | ||
| 134 | static int | ||
| 135 | fetch_all_gp_regs (struct regcache *regcache, int tid) | ||
| 136 | { | ||
| 137 | - struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 138 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 139 | gdb_gregset_t gregset; | ||
| 140 | |||
| 141 | if (ptrace (PTRACE_GETREGS, tid, 0, (void *) &gregset) < 0) | ||
| 142 | @@ -204,8 +195,6 @@ fetch_all_gp_regs (struct regcache *regcache, int tid) | ||
| 143 | static void | ||
| 144 | fetch_gp_regs (struct regcache *regcache, int tid) | ||
| 145 | { | ||
| 146 | - struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 147 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 148 | int i; | ||
| 149 | |||
| 150 | if (have_ptrace_getsetregs) | ||
| 151 | @@ -223,13 +212,12 @@ fetch_gp_regs (struct regcache *regcache, int tid) | ||
| 152 | static void | ||
| 153 | store_register (const struct regcache *regcache, int tid, int regno) | ||
| 154 | { | ||
| 155 | - struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 156 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 157 | + struct gdbarch *gdbarch = regcache->arch (); | ||
| 158 | /* This isn't really an address. But ptrace thinks of it as one. */ | ||
| 159 | CORE_ADDR regaddr = microblaze_register_u_addr (gdbarch, regno); | ||
| 160 | int i; | ||
| 161 | size_t bytes_to_transfer; | ||
| 162 | - char buf[MAX_REGISTER_SIZE]; | ||
| 163 | + char buf[MICROBLAZE_MAX_REGISTER_SIZE]; | ||
| 164 | |||
| 165 | if (regaddr == -1) | ||
| 166 | return; | ||
| 167 | @@ -242,13 +230,13 @@ store_register (const struct regcache *regcache, int tid, int regno) | ||
| 168 | if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_LITTLE) | ||
| 169 | { | ||
| 170 | /* Little-endian values always sit at the left end of the buffer. */ | ||
| 171 | - regcache_raw_collect (regcache, regno, buf); | ||
| 172 | + regcache->raw_collect (regno, buf); | ||
| 173 | } | ||
| 174 | else if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) | ||
| 175 | { | ||
| 176 | /* Big-endian values sit at the right end of the buffer. */ | ||
| 177 | size_t padding = (bytes_to_transfer - register_size (gdbarch, regno)); | ||
| 178 | - regcache_raw_collect (regcache, regno, buf + padding); | ||
| 179 | + regcache->raw_collect (regno, buf + padding); | ||
| 180 | } | ||
| 181 | |||
| 182 | for (i = 0; i < bytes_to_transfer; i += sizeof (long)) | ||
| 183 | @@ -281,8 +269,6 @@ store_register (const struct regcache *regcache, int tid, int regno) | ||
| 184 | static int | ||
| 185 | store_all_gp_regs (const struct regcache *regcache, int tid, int regno) | ||
| 186 | { | ||
| 187 | - struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 188 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 189 | gdb_gregset_t gregset; | ||
| 190 | |||
| 191 | if (ptrace (PTRACE_GETREGS, tid, 0, (void *) &gregset) < 0) | ||
| 192 | @@ -319,8 +305,6 @@ store_all_gp_regs (const struct regcache *regcache, int tid, int regno) | ||
| 193 | static void | ||
| 194 | store_gp_regs (const struct regcache *regcache, int tid, int regno) | ||
| 195 | { | ||
| 196 | - struct gdbarch *gdbarch = get_regcache_arch (regcache); | ||
| 197 | - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); | ||
| 198 | int i; | ||
| 199 | |||
| 200 | if (have_ptrace_getsetregs) | ||
| 201 | @@ -339,12 +323,12 @@ store_gp_regs (const struct regcache *regcache, int tid, int regno) | ||
| 202 | regno == -1, otherwise fetch all general registers or all floating | ||
| 203 | point registers depending upon the value of regno. */ | ||
| 204 | |||
| 205 | -static void | ||
| 206 | -microblaze_linux_fetch_inferior_registers (struct target_ops *ops, | ||
| 207 | - struct regcache *regcache, int regno) | ||
| 208 | +void | ||
| 209 | +microblaze_linux_nat_target::fetch_registers (struct regcache * regcache, | ||
| 210 | + int regno) | ||
| 211 | { | ||
| 212 | /* Get the thread id for the ptrace call. */ | ||
| 213 | - int tid = GET_THREAD_ID (inferior_ptid); | ||
| 214 | + int tid = regcache->ptid ().lwp (); | ||
| 215 | |||
| 216 | if (regno == -1) | ||
| 217 | fetch_gp_regs (regcache, tid); | ||
| 218 | @@ -356,12 +340,12 @@ microblaze_linux_fetch_inferior_registers (struct target_ops *ops, | ||
| 219 | regno == -1, otherwise store all general registers or all floating | ||
| 220 | point registers depending upon the value of regno. */ | ||
| 221 | |||
| 222 | -static void | ||
| 223 | -microblaze_linux_store_inferior_registers (struct target_ops *ops, | ||
| 224 | - struct regcache *regcache, int regno) | ||
| 225 | +void | ||
| 226 | +microblaze_linux_nat_target::store_registers (struct regcache *regcache, | ||
| 227 | + int regno) | ||
| 228 | { | ||
| 229 | /* Get the thread id for the ptrace call. */ | ||
| 230 | - int tid = GET_THREAD_ID (inferior_ptid); | ||
| 231 | + int tid = regcache->ptid ().lwp (); | ||
| 232 | |||
| 233 | if (regno >= 0) | ||
| 234 | store_register (regcache, tid, regno); | ||
| 235 | @@ -398,12 +382,12 @@ supply_fpregset (struct regcache *regcache, const gdb_fpregset_t *fpregsetp) | ||
| 236 | /* FIXME. */ | ||
| 237 | } | ||
| 238 | |||
| 239 | -static const struct target_desc * | ||
| 240 | -microblaze_linux_read_description (struct target_ops *ops) | ||
| 241 | +const struct target_desc * | ||
| 242 | +microblaze_linux_nat_target::read_description () | ||
| 243 | { | ||
| 244 | - CORE_ADDR microblaze_hwcap = 0; | ||
| 245 | + CORE_ADDR microblaze_hwcap = linux_get_hwcap (this); | ||
| 246 | |||
| 247 | - if (target_auxv_search (ops, AT_HWCAP, µblaze_hwcap) != 1) | ||
| 248 | + if (microblaze_hwcap != 1) | ||
| 249 | return NULL; | ||
| 250 | |||
| 251 | return NULL; | ||
| 252 | @@ -415,17 +399,7 @@ void _initialize_microblaze_linux_nat (void); | ||
| 253 | void | ||
| 254 | _initialize_microblaze_linux_nat (void) | ||
| 255 | { | ||
| 256 | - struct target_ops *t; | ||
| 257 | - | ||
| 258 | - /* Fill in the generic GNU/Linux methods. */ | ||
| 259 | - t = linux_target (); | ||
| 260 | - | ||
| 261 | - /* Add our register access methods. */ | ||
| 262 | - t->to_fetch_registers = microblaze_linux_fetch_inferior_registers; | ||
| 263 | - t->to_store_registers = microblaze_linux_store_inferior_registers; | ||
| 264 | - | ||
| 265 | - t->to_read_description = microblaze_linux_read_description; | ||
| 266 | - | ||
| 267 | /* Register the target. */ | ||
| 268 | - linux_nat_add_target (t); | ||
| 269 | + linux_target = &the_microblaze_linux_nat_target; | ||
| 270 | + add_inf_child_target (&the_microblaze_linux_nat_target); | ||
| 271 | } | ||
| 272 | diff --git a/gdb/microblaze-tdep.h b/gdb/microblaze-tdep.h | ||
| 273 | index c0fc900733..c777d93a95 100644 | ||
| 274 | --- a/gdb/microblaze-tdep.h | ||
| 275 | +++ b/gdb/microblaze-tdep.h | ||
| 276 | @@ -106,6 +106,9 @@ enum microblaze_regnum | ||
| 277 | MICROBLAZE_NUM_REGS, MICROBLAZE_NUM_CORE_REGS = MICROBLAZE_NUM_REGS | ||
| 278 | }; | ||
| 279 | |||
| 280 | +/* Big enough to hold the size of the largest register in bytes. */ | ||
| 281 | +#define MICROBLAZE_MAX_REGISTER_SIZE 64 | ||
| 282 | + | ||
| 283 | struct microblaze_frame_cache | ||
| 284 | { | ||
| 285 | /* Base address. */ | ||
| 286 | -- | ||
| 287 | 2.17.1 | ||
| 288 | |||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0054-Patch-MicroBlaze.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0054-Patch-MicroBlaze.patch deleted file mode 100644 index d5cf929a..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0054-Patch-MicroBlaze.patch +++ /dev/null | |||
| @@ -1,173 +0,0 @@ | |||
| 1 | From 75272152884a0cb003a8e45f8ca9ffa0ac43eea2 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Thu, 15 Apr 2021 16:16:11 +0530 | ||
| 4 | Subject: [PATCH 54] [Patch,MicroBlaze]: 1. set BFD machine to | ||
| 5 | bfd_mach_microblaze64 for 64 bit elf. 2. XSDB and QEMU : agreed to append r | ||
| 6 | to all special registers except slr/shr | ||
| 7 | |||
| 8 | --- | ||
| 9 | bfd/elf64-microblaze.c | 11 +++++++++++ | ||
| 10 | gdb/features/microblaze-core.xml | 4 ++-- | ||
| 11 | gdb/features/microblaze-stack-protect.xml | 4 ++-- | ||
| 12 | gdb/features/microblaze-with-stack-protect.c | 4 ++-- | ||
| 13 | gdb/features/microblaze.c | 4 ++-- | ||
| 14 | gdb/features/microblaze64-core.xml | 4 ++-- | ||
| 15 | gdb/features/microblaze64-stack-protect.xml | 4 ++-- | ||
| 16 | gdb/features/microblaze64-with-stack-protect.c | 4 ++-- | ||
| 17 | gdb/features/microblaze64.c | 4 ++-- | ||
| 18 | gdb/microblaze-tdep.c | 2 +- | ||
| 19 | 10 files changed, 28 insertions(+), 17 deletions(-) | ||
| 20 | |||
| 21 | Index: gdb-9.2/bfd/elf64-microblaze.c | ||
| 22 | =================================================================== | ||
| 23 | --- gdb-9.2.orig/bfd/elf64-microblaze.c | ||
| 24 | +++ gdb-9.2/bfd/elf64-microblaze.c | ||
| 25 | @@ -3631,6 +3631,16 @@ microblaze_elf_finish_dynamic_sections ( | ||
| 26 | return TRUE; | ||
| 27 | } | ||
| 28 | |||
| 29 | +static bfd_boolean | ||
| 30 | +microblaze_elf64_object_p (bfd *abfd) | ||
| 31 | +{ | ||
| 32 | + bfd_default_set_arch_mach (abfd, bfd_arch_microblaze, | ||
| 33 | + bfd_mach_microblaze64); | ||
| 34 | + return TRUE; | ||
| 35 | +} | ||
| 36 | + | ||
| 37 | + | ||
| 38 | + | ||
| 39 | /* Hook called by the linker routine which adds symbols from an object | ||
| 40 | file. We use it to put .comm items in .sbss, and not .bss. */ | ||
| 41 | |||
| 42 | @@ -3698,5 +3708,6 @@ microblaze_elf_add_symbol_hook (bfd *abf | ||
| 43 | #define elf_backend_finish_dynamic_symbol microblaze_elf_finish_dynamic_symbol | ||
| 44 | #define elf_backend_size_dynamic_sections microblaze_elf_size_dynamic_sections | ||
| 45 | #define elf_backend_add_symbol_hook microblaze_elf_add_symbol_hook | ||
| 46 | +/* #define elf_backend_object_p microblaze_elf64_object_p */ | ||
| 47 | |||
| 48 | #include "elf64-target.h" | ||
| 49 | Index: gdb-9.2/gdb/features/microblaze-core.xml | ||
| 50 | =================================================================== | ||
| 51 | --- gdb-9.2.orig/gdb/features/microblaze-core.xml | ||
| 52 | +++ gdb-9.2/gdb/features/microblaze-core.xml | ||
| 53 | @@ -64,6 +64,6 @@ | ||
| 54 | <reg name="rtlbsx" bitsize="32"/> | ||
| 55 | <reg name="rtlblo" bitsize="32"/> | ||
| 56 | <reg name="rtlbhi" bitsize="32"/> | ||
| 57 | - <reg name="rslr" bitsize="32"/> | ||
| 58 | - <reg name="rshr" bitsize="32"/> | ||
| 59 | + <reg name="slr" bitsize="32"/> | ||
| 60 | + <reg name="shr" bitsize="32"/> | ||
| 61 | </feature> | ||
| 62 | Index: gdb-9.2/gdb/features/microblaze-stack-protect.xml | ||
| 63 | =================================================================== | ||
| 64 | --- gdb-9.2.orig/gdb/features/microblaze-stack-protect.xml | ||
| 65 | +++ gdb-9.2/gdb/features/microblaze-stack-protect.xml | ||
| 66 | @@ -7,6 +7,6 @@ | ||
| 67 | |||
| 68 | <!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 69 | <feature name="org.gnu.gdb.microblaze.stack-protect"> | ||
| 70 | - <reg name="rslr" bitsize="32"/> | ||
| 71 | - <reg name="rshr" bitsize="32"/> | ||
| 72 | + <reg name="slr" bitsize="32"/> | ||
| 73 | + <reg name="shr" bitsize="32"/> | ||
| 74 | </feature> | ||
| 75 | Index: gdb-9.2/gdb/features/microblaze-with-stack-protect.c | ||
| 76 | =================================================================== | ||
| 77 | --- gdb-9.2.orig/gdb/features/microblaze-with-stack-protect.c | ||
| 78 | +++ gdb-9.2/gdb/features/microblaze-with-stack-protect.c | ||
| 79 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze_with_stack_p | ||
| 80 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 81 | |||
| 82 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze.stack-protect"); | ||
| 83 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 32, "int"); | ||
| 84 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 32, "int"); | ||
| 85 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 32, "int"); | ||
| 86 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 32, "int"); | ||
| 87 | |||
| 88 | tdesc_microblaze_with_stack_protect = result; | ||
| 89 | } | ||
| 90 | Index: gdb-9.2/gdb/features/microblaze.c | ||
| 91 | =================================================================== | ||
| 92 | --- gdb-9.2.orig/gdb/features/microblaze.c | ||
| 93 | +++ gdb-9.2/gdb/features/microblaze.c | ||
| 94 | @@ -70,8 +70,8 @@ initialize_tdesc_microblaze (void) | ||
| 95 | tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 96 | tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 97 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 98 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 64, "uint64"); | ||
| 99 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 64, "uint64"); | ||
| 100 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 101 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 102 | |||
| 103 | tdesc_microblaze = result; | ||
| 104 | } | ||
| 105 | Index: gdb-9.2/gdb/features/microblaze64-core.xml | ||
| 106 | =================================================================== | ||
| 107 | --- gdb-9.2.orig/gdb/features/microblaze64-core.xml | ||
| 108 | +++ gdb-9.2/gdb/features/microblaze64-core.xml | ||
| 109 | @@ -64,6 +64,6 @@ | ||
| 110 | <reg name="rtlbsx" bitsize="32"/> | ||
| 111 | <reg name="rtlblo" bitsize="32"/> | ||
| 112 | <reg name="rtlbhi" bitsize="32"/> | ||
| 113 | - <reg name="rslr" bitsize="64"/> | ||
| 114 | - <reg name="rshr" bitsize="64"/> | ||
| 115 | + <reg name="slr" bitsize="64"/> | ||
| 116 | + <reg name="shr" bitsize="64"/> | ||
| 117 | </feature> | ||
| 118 | Index: gdb-9.2/gdb/features/microblaze64-stack-protect.xml | ||
| 119 | =================================================================== | ||
| 120 | --- gdb-9.2.orig/gdb/features/microblaze64-stack-protect.xml | ||
| 121 | +++ gdb-9.2/gdb/features/microblaze64-stack-protect.xml | ||
| 122 | @@ -7,6 +7,6 @@ | ||
| 123 | |||
| 124 | <!DOCTYPE feature SYSTEM "gdb-target.dtd"> | ||
| 125 | <feature name="org.gnu.gdb.microblaze64.stack-protect"> | ||
| 126 | - <reg name="rslr" bitsize="64"/> | ||
| 127 | - <reg name="rshr" bitsize="64"/> | ||
| 128 | + <reg name="slr" bitsize="64"/> | ||
| 129 | + <reg name="shr" bitsize="64"/> | ||
| 130 | </feature> | ||
| 131 | Index: gdb-9.2/gdb/features/microblaze64-with-stack-protect.c | ||
| 132 | =================================================================== | ||
| 133 | --- gdb-9.2.orig/gdb/features/microblaze64-with-stack-protect.c | ||
| 134 | +++ gdb-9.2/gdb/features/microblaze64-with-stack-protect.c | ||
| 135 | @@ -72,8 +72,8 @@ initialize_tdesc_microblaze64_with_stack | ||
| 136 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 137 | |||
| 138 | feature = tdesc_create_feature (result, "org.gnu.gdb.microblaze64.stack-protect"); | ||
| 139 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 64, "uint64"); | ||
| 140 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 64, "uint64"); | ||
| 141 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 142 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 143 | |||
| 144 | tdesc_microblaze64_with_stack_protect = result; | ||
| 145 | } | ||
| 146 | Index: gdb-9.2/gdb/features/microblaze64.c | ||
| 147 | =================================================================== | ||
| 148 | --- gdb-9.2.orig/gdb/features/microblaze64.c | ||
| 149 | +++ gdb-9.2/gdb/features/microblaze64.c | ||
| 150 | @@ -70,8 +70,8 @@ initialize_tdesc_microblaze64 (void) | ||
| 151 | tdesc_create_reg (feature, "rtlbsx", 54, 1, NULL, 32, "int"); | ||
| 152 | tdesc_create_reg (feature, "rtlblo", 55, 1, NULL, 32, "int"); | ||
| 153 | tdesc_create_reg (feature, "rtlbhi", 56, 1, NULL, 32, "int"); | ||
| 154 | - tdesc_create_reg (feature, "rslr", 57, 1, NULL, 64, "uint64"); | ||
| 155 | - tdesc_create_reg (feature, "rshr", 58, 1, NULL, 64, "uint64"); | ||
| 156 | + tdesc_create_reg (feature, "slr", 57, 1, NULL, 64, "uint64"); | ||
| 157 | + tdesc_create_reg (feature, "shr", 58, 1, NULL, 64, "uint64"); | ||
| 158 | |||
| 159 | tdesc_microblaze64 = result; | ||
| 160 | } | ||
| 161 | Index: gdb-9.2/gdb/microblaze-tdep.c | ||
| 162 | =================================================================== | ||
| 163 | --- gdb-9.2.orig/gdb/microblaze-tdep.c | ||
| 164 | +++ gdb-9.2/gdb/microblaze-tdep.c | ||
| 165 | @@ -77,7 +77,7 @@ static const char *microblaze_register_n | ||
| 166 | "rpvr0", "rpvr1", "rpvr2", "rpvr3", "rpvr4", "rpvr5", "rpvr6", | ||
| 167 | "rpvr7", "rpvr8", "rpvr9", "rpvr10", "rpvr11", | ||
| 168 | "redr", "rpid", "rzpr", "rtlbx", "rtlbsx", "rtlblo", "rtlbhi", | ||
| 169 | - "rslr", "rshr" | ||
| 170 | + "slr", "shr" | ||
| 171 | }; | ||
| 172 | |||
| 173 | #define MICROBLAZE_NUM_REGS ARRAY_SIZE (microblaze_register_names) | ||
diff --git a/meta-microblaze/recipes-devtools/binutils/binutils/0055-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch b/meta-microblaze/recipes-devtools/binutils/binutils/0055-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch deleted file mode 100644 index 320d6ecb..00000000 --- a/meta-microblaze/recipes-devtools/binutils/binutils/0055-Patch-MicroBlaze-these-changes-will-make-64-bit-vect.patch +++ /dev/null | |||
| @@ -1,31 +0,0 @@ | |||
| 1 | From 6b29e1a8ff62e01299ee07840b4443cbda5b8c61 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Mahesh Bodapati <mbodapat@xilinx.com> | ||
| 3 | Date: Mon, 19 Apr 2021 14:33:27 +0530 | ||
| 4 | Subject: [PATCH 55] [Patch,MicroBlaze] : these changes will make 64 bit | ||
| 5 | vectors as default target types when we built gdb with microblaze 64 bit type | ||
| 6 | targets,for instance microblaze-xilinx-elf64/microblazeel-xilinx-elf64 | ||
| 7 | |||
| 8 | --- | ||
| 9 | bfd/config.bfd | 8 ++++++++ | ||
| 10 | 1 file changed, 8 insertions(+) | ||
| 11 | |||
| 12 | Index: gdb-9.2/bfd/config.bfd | ||
| 13 | =================================================================== | ||
| 14 | --- gdb-9.2.orig/bfd/config.bfd | ||
| 15 | +++ gdb-9.2/bfd/config.bfd | ||
| 16 | @@ -838,7 +838,15 @@ case "${targ}" in | ||
| 17 | targ_defvec=metag_elf32_vec | ||
| 18 | targ_underscore=yes | ||
| 19 | ;; | ||
| 20 | + microblazeel*-*64) | ||
| 21 | + targ_defvec=microblaze_elf64_le_vec | ||
| 22 | + targ_selvecs=microblaze_elf64_vec | ||
| 23 | + ;; | ||
| 24 | |||
| 25 | + microblaze*-*64) | ||
| 26 | + targ_defvec=microblaze_elf64_vec | ||
| 27 | + targ_selvecs=microblaze_elf64_le_vec | ||
| 28 | + ;; | ||
| 29 | microblazeel*-*) | ||
| 30 | targ_defvec=microblaze_elf32_le_vec | ||
| 31 | targ_selvecs=microblaze_elf32_vec | ||
