aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorSandra Loosemore <sandra@codesourcery.com>2015-07-01 15:55:28 -0700
committerSandra Loosemore <sandra@codesourcery.com>2015-07-01 15:55:28 -0700
commit965b1d80832fde9ba17a8b5f11b578a8f9e10581 (patch)
tree050d75d12b3342269911e3db42256309a1adaac1 /bfd
parentdfc87947b5ac6d6382c225449d4fdce411c7ee66 (diff)
downloadgdb-965b1d80832fde9ba17a8b5f11b578a8f9e10581.zip
gdb-965b1d80832fde9ba17a8b5f11b578a8f9e10581.tar.gz
gdb-965b1d80832fde9ba17a8b5f11b578a8f9e10581.tar.bz2
Add Nios II arch flags and compatibility tests
2015-07-01 Sandra Loosemore <sandra@codesourcery.com> Cesar Philippidis <cesar@codesourcery.com> bfd/ * archures.c (bfd_mach_nios2r1, bfd_mach_nios2r2): New. * bfd-in2.h: Regenerated. * cpu-nios2.c (nios2_compatible): New. (N): Use nios2_compatible instead of bfd_default_compatible. (NIOS2R1_NEXT, NIOS2R2_NEXT): Define. (arch_info_struct): New. (bfd_nios2_arch): Chain to NIOS2R1_NEXT. * elf32-nios2.c (is_nios2_elf): New. (nios2_elf32_merge_private_bfd_data): New. (nios2_elf32_object_p): New. (bfd_elf32_bfd_merge_private_bfd_data): Define. (elf_backend_object_p): Define. gas/ * config/tc-nios2.c: Adjust includes. (OPTION_MARCH): Define. (md_longopts): Add -march option. (nios2_architecture): New. (nios2_use_arch): New. (md_parse_option): Handle OPTION_MARCH. (md_show_usage): Document -march. (md_begin): Set arch in BFD. (nios2_elf_final_processing): New. * config/tc-nios2.h (elf_tc_final_processing): Define. (nios2_elf_final_processing): New. * doc/c-nios2.texi (-march): Add documentation. include/elf/ * nios2.h (EF_NIOS2_ARCH_R1, EF_NIOS2_ARCH_R2): Define. ld/testsuite/ * ld-nios2/mixed1a.d: New. * ld-nios2/mixed1a.s: New. * ld-nios2/mixed1b.d: New. * ld-nios2/mixed1b.s: New. * ld-nios2/nios2.exp: Build the new compatibility tests.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog16
-rw-r--r--bfd/archures.c6
-rw-r--r--bfd/bfd-in2.h6
-rw-r--r--bfd/cpu-nios2.c34
-rw-r--r--bfd/elf32-nios2.c93
5 files changed, 149 insertions, 6 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 5c1e94c..701f177 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,19 @@
+2015-07-01 Sandra Loosemore <sandra@codesourcery.com>
+ Cesar Philippidis <cesar@codesourcery.com>
+
+ * archures.c (bfd_mach_nios2r1, bfd_mach_nios2r2): New.
+ * bfd-in2.h: Regenerated.
+ * cpu-nios2.c (nios2_compatible): New.
+ (N): Use nios2_compatible instead of bfd_default_compatible.
+ (NIOS2R1_NEXT, NIOS2R2_NEXT): Define.
+ (arch_info_struct): New.
+ (bfd_nios2_arch): Chain to NIOS2R1_NEXT.
+ * elf32-nios2.c (is_nios2_elf): New.
+ (nios2_elf32_merge_private_bfd_data): New.
+ (nios2_elf32_object_p): New.
+ (bfd_elf32_bfd_merge_private_bfd_data): Define.
+ (elf_backend_object_p): Define.
+
2015-07-01 H.J. Lu <hongjiu.lu@intel.com>
* elf64-x86-64.c (elf_x86_64_convert_mov_to_lea): Refactor.
diff --git a/bfd/archures.c b/bfd/archures.c
index 677c470..95433f8 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -501,8 +501,10 @@ DESCRIPTION
. bfd_arch_aarch64, {* AArch64 *}
.#define bfd_mach_aarch64 0
.#define bfd_mach_aarch64_ilp32 32
-. bfd_arch_nios2,
-.#define bfd_mach_nios2 0
+. bfd_arch_nios2, {* Nios II *}
+.#define bfd_mach_nios2 0
+.#define bfd_mach_nios2r1 1
+.#define bfd_mach_nios2r2 2
. bfd_arch_visium, {* Visium *}
.#define bfd_mach_visium 1
. bfd_arch_last
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index ce964bb..83d729e 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -2294,8 +2294,10 @@ enum bfd_architecture
bfd_arch_aarch64, /* AArch64 */
#define bfd_mach_aarch64 0
#define bfd_mach_aarch64_ilp32 32
- bfd_arch_nios2,
-#define bfd_mach_nios2 0
+ bfd_arch_nios2, /* Nios II */
+#define bfd_mach_nios2 0
+#define bfd_mach_nios2r1 1
+#define bfd_mach_nios2r2 2
bfd_arch_visium, /* Visium */
#define bfd_mach_visium 1
bfd_arch_last
diff --git a/bfd/cpu-nios2.c b/bfd/cpu-nios2.c
index 57539db..1e8f521 100644
--- a/bfd/cpu-nios2.c
+++ b/bfd/cpu-nios2.c
@@ -24,6 +24,26 @@
#include "bfd.h"
#include "libbfd.h"
+static const bfd_arch_info_type *
+nios2_compatible (const bfd_arch_info_type *a,
+ const bfd_arch_info_type *b)
+{
+ if (a->arch != b->arch)
+ return NULL;
+
+ if (a->bits_per_word != b->bits_per_word)
+ return NULL;
+
+ if (a->mach == bfd_mach_nios2)
+ return a;
+ else if (b->mach == bfd_mach_nios2)
+ return b;
+ else if (a->mach != b->mach)
+ return NULL;
+
+ return a;
+}
+
#define N(BITS_WORD, BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT) \
{ \
BITS_WORD, /* bits in a word */ \
@@ -35,10 +55,20 @@
PRINT, \
3, \
DEFAULT, \
- bfd_default_compatible, \
+ nios2_compatible, \
bfd_default_scan, \
bfd_arch_default_fill, \
NEXT \
}
-const bfd_arch_info_type bfd_nios2_arch = N (32, 32, 0, "nios2", TRUE, NULL);
+#define NIOS2R1_NEXT &arch_info_struct[0]
+#define NIOS2R2_NEXT &arch_info_struct[1]
+
+static const bfd_arch_info_type arch_info_struct[] =
+{
+ N (32, 32, bfd_mach_nios2r1, "nios2:r1", FALSE, NIOS2R2_NEXT),
+ N (32, 32, bfd_mach_nios2r2, "nios2:r2", FALSE, NULL),
+};
+
+const bfd_arch_info_type bfd_nios2_arch =
+ N (32, 32, 0, "nios2", TRUE, NIOS2R1_NEXT);
diff --git a/bfd/elf32-nios2.c b/bfd/elf32-nios2.c
index 4f992bf..6a1372b 100644
--- a/bfd/elf32-nios2.c
+++ b/bfd/elf32-nios2.c
@@ -2038,6 +2038,72 @@ nios2_elf32_build_stubs (struct bfd_link_info *info)
}
+#define is_nios2_elf(bfd) \
+ (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
+ && elf_object_id (bfd) == NIOS2_ELF_DATA)
+
+/* Merge backend specific data from an object file to the output
+ object file when linking. */
+
+static bfd_boolean
+nios2_elf32_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
+{
+ flagword old_flags;
+ flagword new_flags;
+
+ if (!is_nios2_elf (ibfd) || !is_nios2_elf (obfd))
+ return TRUE;
+
+ /* Check if we have the same endianness. */
+ if (! _bfd_generic_verify_endian_match (ibfd, obfd))
+ return FALSE;
+
+ new_flags = elf_elfheader (ibfd)->e_flags;
+ old_flags = elf_elfheader (obfd)->e_flags;
+ if (!elf_flags_init (obfd))
+ {
+ /* First call, no flags set. */
+ elf_flags_init (obfd) = TRUE;
+ elf_elfheader (obfd)->e_flags = new_flags;
+
+ switch (new_flags)
+ {
+ default:
+ case EF_NIOS2_ARCH_R1:
+ bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r1);
+ break;
+ case EF_NIOS2_ARCH_R2:
+ if (bfd_big_endian (ibfd))
+ {
+ (*_bfd_error_handler)
+ (_("error: %B: Big-endian R2 is not supported."), ibfd);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+ bfd_default_set_arch_mach (obfd, bfd_arch_nios2, bfd_mach_nios2r2);
+ break;
+ }
+ }
+
+ /* Incompatible flags. */
+ else if (new_flags != old_flags)
+ {
+ /* So far, the only incompatible flags denote incompatible
+ architectures. */
+ (*_bfd_error_handler)
+ (_("error: %B: Conflicting CPU architectures %d/%d"),
+ ibfd, new_flags, old_flags);
+ bfd_set_error (bfd_error_bad_value);
+ return FALSE;
+ }
+
+ /* Merge Tag_compatibility attributes and any common GNU ones. */
+ _bfd_elf_merge_object_attributes (ibfd, obfd);
+
+ return TRUE;
+}
+
+
/* Implement bfd_elf32_bfd_reloc_type_lookup:
Given a BFD reloc type, return a howto structure. */
static reloc_howto_type *
@@ -3707,6 +3773,29 @@ nios2_elf32_copy_indirect_symbol (struct bfd_link_info *info,
_bfd_elf_link_hash_copy_indirect (info, dir, ind);
}
+/* Set the right machine number for a NIOS2 ELF file. */
+
+static bfd_boolean
+nios2_elf32_object_p (bfd *abfd)
+{
+ unsigned long mach;
+
+ mach = elf_elfheader (abfd)->e_flags;
+
+ switch (mach)
+ {
+ default:
+ case EF_NIOS2_ARCH_R1:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r1);
+ break;
+ case EF_NIOS2_ARCH_R2:
+ bfd_default_set_arch_mach (abfd, bfd_arch_nios2, bfd_mach_nios2r2);
+ break;
+ }
+
+ return TRUE;
+}
+
/* Implement elf_backend_check_relocs:
Look through the relocs for a section during the first phase. */
static bfd_boolean
@@ -5256,6 +5345,9 @@ const struct bfd_elf_special_section elf32_nios2_special_sections[] =
#define bfd_elf32_bfd_link_hash_table_create \
nios2_elf32_link_hash_table_create
+#define bfd_elf32_bfd_merge_private_bfd_data \
+ nios2_elf32_merge_private_bfd_data
+
/* Relocation table lookup macros. */
#define bfd_elf32_bfd_reloc_type_lookup nios2_elf32_bfd_reloc_type_lookup
@@ -5292,6 +5384,7 @@ const struct bfd_elf_special_section elf32_nios2_special_sections[] =
#define elf_backend_size_dynamic_sections nios2_elf32_size_dynamic_sections
#define elf_backend_add_symbol_hook nios2_elf_add_symbol_hook
#define elf_backend_copy_indirect_symbol nios2_elf32_copy_indirect_symbol
+#define elf_backend_object_p nios2_elf32_object_p
#define elf_backend_grok_prstatus nios2_grok_prstatus
#define elf_backend_grok_psinfo nios2_grok_psinfo