From e202fa84e706abb043aed457473a764c76672297 Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Thu, 13 Sep 2012 22:24:51 +0000 Subject: [PATCH] Bi-endian patches for moxie --- bfd/ChangeLog | 10 ++++ bfd/config.bfd | 3 +- bfd/configure | 3 +- bfd/configure.in | 3 +- bfd/elf32-moxie.c | 6 +- bfd/targets.c | 6 +- gas/ChangeLog | 11 ++++ gas/config/tc-moxie.c | 113 ++++++++++++++++++++++++++++-------- gas/config/tc-moxie.h | 10 ++-- ld/ChangeLog | 7 +++ ld/emulparams/elf32moxie.sh | 5 +- opcodes/ChangeLog | 4 ++ opcodes/moxie-dis.c | 36 +++++++++--- 13 files changed, 172 insertions(+), 45 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e33ab1acd2..9a0d5104ac 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,13 @@ +2012-09-13 Anthony Green + + * targets.c (bfd_elf32_bigmoxie_vec, bfd_elf32_littlemoxie_vec): + Define. + (bfd_elf32_moxie_vec): Remove. + * config.bfd, configure.in: Add bi-endian support for moxie. + * configure: Rebuilt. + * elf32-moxie.c (TARGET_LITTLE_NAME, TARGET_LITTLE_SYM): Define. + (TARGET_BIG_NAME, TARGET_BIG_SYM): Update for bi-endian support. + 2012-09-12 Doug Kwan * elf64-ppc.c (ppc64_elf_relocate_section): Use pre-adjusted diff --git a/bfd/config.bfd b/bfd/config.bfd index 6025f2641b..218f1dd2ee 100644 --- a/bfd/config.bfd +++ b/bfd/config.bfd @@ -419,7 +419,8 @@ case "${targ}" in ;; moxie-*-elf | moxie-*-rtems | moxie-*-uclinux) - targ_defvec=bfd_elf32_moxie_vec + targ_defvec=bfd_elf32_bigmoxie_vec + targ_selvecs=bfd_elf32_littlemoxie_vec ;; h8300*-*-rtemscoff*) diff --git a/bfd/configure b/bfd/configure index a6f61c582f..ea0694955c 100755 --- a/bfd/configure +++ b/bfd/configure @@ -15221,6 +15221,7 @@ do bfd_elf32_bigmips_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; bfd_elf32_bigmips_vxworks_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; + bfd_elf32_bigmoxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;; bfd_elf32_cr16_vec) tb="$tb elf32-cr16.lo elf32.lo $elf" ;; bfd_elf32_cr16c_vec) tb="$tb elf32-cr16c.lo elf32.lo $elf" ;; bfd_elf32_cris_vec) tb="$tb elf32-cris.lo elf32.lo $elf" ;; @@ -15232,7 +15233,6 @@ do bfd_elf32_fr30_vec) tb="$tb elf32-fr30.lo elf32.lo $elf" ;; bfd_elf32_frv_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;; bfd_elf32_frvfdpic_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;; - bfd_elf32_moxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;; bfd_elf32_h8300_vec) tb="$tb elf32-h8300.lo elf32.lo $elf" ;; bfd_elf32_hppa_linux_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;; bfd_elf32_hppa_nbsd_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;; @@ -15263,6 +15263,7 @@ do bfd_elf32_littlemips_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; bfd_elf32_littlemips_vxworks_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; + bfd_elf32_littlemoxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;; bfd_elf32_m32c_vec) tb="$tb elf32-m32c.lo elf32.lo $elf" ;; bfd_elf32_m32r_vec) tb="$tb elf32-m32r.lo elf32.lo $elf" ;; bfd_elf32_m32rle_vec) tb="$tb elf32-m32r.lo elf32.lo $elf" ;; diff --git a/bfd/configure.in b/bfd/configure.in index 36261737a7..612d032fb3 100644 --- a/bfd/configure.in +++ b/bfd/configure.in @@ -704,6 +704,7 @@ do bfd_elf32_bigmips_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; bfd_elf32_bigmips_vxworks_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; + bfd_elf32_bigmoxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;; bfd_elf32_cr16_vec) tb="$tb elf32-cr16.lo elf32.lo $elf" ;; bfd_elf32_cr16c_vec) tb="$tb elf32-cr16c.lo elf32.lo $elf" ;; bfd_elf32_cris_vec) tb="$tb elf32-cris.lo elf32.lo $elf" ;; @@ -715,7 +716,6 @@ do bfd_elf32_fr30_vec) tb="$tb elf32-fr30.lo elf32.lo $elf" ;; bfd_elf32_frv_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;; bfd_elf32_frvfdpic_vec) tb="$tb elf32-frv.lo elf32.lo $elf" ;; - bfd_elf32_moxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;; bfd_elf32_h8300_vec) tb="$tb elf32-h8300.lo elf32.lo $elf" ;; bfd_elf32_hppa_linux_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;; bfd_elf32_hppa_nbsd_vec) tb="$tb elf32-hppa.lo elf32.lo $elf" ;; @@ -746,6 +746,7 @@ do bfd_elf32_littlemips_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; bfd_elf32_littlemips_vxworks_vec) tb="$tb elf32-mips.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo" ;; + bfd_elf32_littlemoxie_vec) tb="$tb elf32-moxie.lo elf32.lo $elf" ;; bfd_elf32_m32c_vec) tb="$tb elf32-m32c.lo elf32.lo $elf" ;; bfd_elf32_m32r_vec) tb="$tb elf32-m32r.lo elf32.lo $elf" ;; bfd_elf32_m32rle_vec) tb="$tb elf32-m32r.lo elf32.lo $elf" ;; diff --git a/bfd/elf32-moxie.c b/bfd/elf32-moxie.c index c1a793e50f..9a031b498f 100644 --- a/bfd/elf32-moxie.c +++ b/bfd/elf32-moxie.c @@ -366,8 +366,10 @@ moxie_elf_check_relocs (bfd *abfd, #define ELF_MACHINE_CODE EM_MOXIE #define ELF_MAXPAGESIZE 0x1 -#define TARGET_BIG_SYM bfd_elf32_moxie_vec -#define TARGET_BIG_NAME "elf32-moxie" +#define TARGET_BIG_SYM bfd_elf32_bigmoxie_vec +#define TARGET_BIG_NAME "elf32-bigmoxie" +#define TARGET_LITTLE_SYM bfd_elf32_littlemoxie_vec +#define TARGET_LITTLE_NAME "elf32-littlemoxie" #define elf_info_to_howto_rel NULL #define elf_info_to_howto moxie_info_to_howto_rela diff --git a/bfd/targets.c b/bfd/targets.c index fa206d24be..621bf8d5f5 100644 --- a/bfd/targets.c +++ b/bfd/targets.c @@ -606,6 +606,7 @@ extern const bfd_target bfd_elf32_bigarm_symbian_vec; extern const bfd_target bfd_elf32_bigarm_vxworks_vec; extern const bfd_target bfd_elf32_bigmips_vec; extern const bfd_target bfd_elf32_bigmips_vxworks_vec; +extern const bfd_target bfd_elf32_bigmoxie_vec; extern const bfd_target bfd_elf32_cr16_vec; extern const bfd_target bfd_elf32_cr16c_vec; extern const bfd_target bfd_elf32_cris_vec; @@ -617,7 +618,6 @@ extern const bfd_target bfd_elf32_epiphany_vec; extern const bfd_target bfd_elf32_fr30_vec; extern const bfd_target bfd_elf32_frv_vec; extern const bfd_target bfd_elf32_frvfdpic_vec; -extern const bfd_target bfd_elf32_moxie_vec; extern const bfd_target bfd_elf32_h8300_vec; extern const bfd_target bfd_elf32_hppa_linux_vec; extern const bfd_target bfd_elf32_hppa_nbsd_vec; @@ -645,6 +645,7 @@ extern const bfd_target bfd_elf32_littlearm_symbian_vec; extern const bfd_target bfd_elf32_littlearm_vxworks_vec; extern const bfd_target bfd_elf32_littlemips_vec; extern const bfd_target bfd_elf32_littlemips_vxworks_vec; +extern const bfd_target bfd_elf32_littlemoxie_vec; extern const bfd_target bfd_elf32_m32c_vec; extern const bfd_target bfd_elf32_m32r_vec; extern const bfd_target bfd_elf32_m32rle_vec; @@ -979,6 +980,7 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_bigarm_vxworks_vec, &bfd_elf32_bigmips_vec, &bfd_elf32_bigmips_vxworks_vec, + &bfd_elf32_bigmoxie_vec, &bfd_elf32_cr16_vec, &bfd_elf32_cr16c_vec, &bfd_elf32_cris_vec, @@ -990,7 +992,6 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_fr30_vec, &bfd_elf32_frv_vec, &bfd_elf32_frvfdpic_vec, - &bfd_elf32_moxie_vec, &bfd_elf32_h8300_vec, &bfd_elf32_hppa_linux_vec, &bfd_elf32_hppa_nbsd_vec, @@ -1020,6 +1021,7 @@ static const bfd_target * const _bfd_target_vector[] = &bfd_elf32_littlearm_vxworks_vec, &bfd_elf32_littlemips_vec, &bfd_elf32_littlemips_vxworks_vec, + &bfd_elf32_littlemoxie_vec, &bfd_elf32_m32c_vec, &bfd_elf32_m32r_vec, &bfd_elf32_m32rle_vec, diff --git a/gas/ChangeLog b/gas/ChangeLog index 030494138e..999e20b564 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,14 @@ +2012-09-13 Anthony Green + + * config/tc-moxie.h (DEFAULT_TARGET_FORMAT): Define. + (TARGET_FORMAT): Don't hard-code endian-ness. + * config/tc-moxie.c (target_big_endian, moxie_target_format): + Define. + (md_assemble): Handle bi-endian encodings. + (md_shortopts, md_parse_option, md_show_usage, md_apply_fix) + (md_number_to_chars, md_chars_to_number): Update for bi-endian + support. + 2012-09-12 Chris Schlumberger-Socha * config/tc-aarch64.c diff --git a/gas/config/tc-moxie.c b/gas/config/tc-moxie.c index e73887dc9c..fa8ace588b 100644 --- a/gas/config/tc-moxie.c +++ b/gas/config/tc-moxie.c @@ -1,5 +1,5 @@ /* tc-moxie.c -- Assemble code for moxie - Copyright 2009 + Copyright 2009, 2012 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -43,7 +43,11 @@ const pseudo_typeS md_pseudo_table[] = const char FLT_CHARS[] = "rRsSfFdDxXpP"; const char EXP_CHARS[] = "eE"; -static int md_chars_to_number (char *val, int n); +static valueT md_chars_to_number (char * buf, int n); + +/* Byte order. */ +extern int target_big_endian; +const char *moxie_target_format = DEFAULT_TARGET_FORMAT; void md_operand (expressionS *op __attribute__((unused))) @@ -203,7 +207,7 @@ md_assemble (char *str) op_end++; op_end = parse_exp_save_ilp (op_end, &arg); fix_new_exp (frag_now, - ((p+1) - frag_now->fr_literal), + ((p + (target_big_endian ? 1 : 0)) - frag_now->fr_literal), 1, &arg, 0, @@ -589,26 +593,50 @@ md_atof (int type, char *litP, int *sizeP) return NULL; } - -const char *md_shortopts = ""; + +enum options +{ + OPTION_EB = OPTION_MD_BASE, + OPTION_EL, +}; struct option md_longopts[] = { - {NULL, no_argument, NULL, 0} + { "EB", no_argument, NULL, OPTION_EB}, + { "EL", no_argument, NULL, OPTION_EL}, + { NULL, no_argument, NULL, 0} }; + size_t md_longopts_size = sizeof (md_longopts); + +const char *md_shortopts = ""; -/* We have no target specific options yet, so these next - two functions are empty. */ int md_parse_option (int c ATTRIBUTE_UNUSED, char *arg ATTRIBUTE_UNUSED) { - return 0; + switch (c) + { + case OPTION_EB: + target_big_endian = 1; + moxie_target_format = "elf32-bigmoxie"; + break; + case OPTION_EL: + target_big_endian = 0; + moxie_target_format = "elf32-littlemoxie"; + break; + default: + return 0; + } + + return 1; } void md_show_usage (FILE *stream ATTRIBUTE_UNUSED) { + fprintf (stream, _("\ + -EB assemble for a big endian system (default)\n\ + -EL assemble for a little endian system\n")); } /* Apply a fixup to the object file. */ @@ -626,15 +654,35 @@ md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, switch (fixP->fx_r_type) { case BFD_RELOC_32: - *buf++ = val >> 24; - *buf++ = val >> 16; - *buf++ = val >> 8; - *buf++ = val >> 0; + if (target_big_endian) + { + buf[0] = val >> 24; + buf[1] = val >> 16; + buf[2] = val >> 8; + buf[3] = val >> 0; + } + else + { + buf[3] = val >> 24; + buf[2] = val >> 16; + buf[1] = val >> 8; + buf[0] = val >> 0; + } + buf += 4; break; case BFD_RELOC_16: - *buf++ = val >> 8; - *buf++ = val >> 0; + if (target_big_endian) + { + buf[0] = val >> 8; + buf[1] = val >> 0; + } + else + { + buf[1] = val >> 8; + buf[0] = val >> 0; + } + buf += 2; break; case BFD_RELOC_8: @@ -665,28 +713,43 @@ md_apply_fix (fixS *fixP ATTRIBUTE_UNUSED, fixP->fx_done = 1; } -/* Put number into target byte order (big endian). */ +/* Put number into target byte order. */ void -md_number_to_chars (char *ptr, valueT use, int nbytes) +md_number_to_chars (char * ptr, valueT use, int nbytes) { - number_to_chars_bigendian (ptr, use, nbytes); + if (target_big_endian) + number_to_chars_bigendian (ptr, use, nbytes); + else + number_to_chars_littleendian (ptr, use, nbytes); } /* Convert from target byte order to host byte order. */ -static int -md_chars_to_number (char *val, int n) +static valueT +md_chars_to_number (char * buf, int n) { - int retval = 0; + valueT result = 0; + unsigned char * where = (unsigned char *) buf; - while (n--) + if (target_big_endian) + { + while (n--) + { + result <<= 8; + result |= (*where++ & 255); + } + } + else { - retval <<= 8; - retval |= (*val++ & 255); + while (n--) + { + result <<= 8; + result |= (where[n] & 255); + } } - return retval; + return result; } /* Generate a machine-dependent relocation. */ diff --git a/gas/config/tc-moxie.h b/gas/config/tc-moxie.h index db1d01aa8c..af4fe510f5 100644 --- a/gas/config/tc-moxie.h +++ b/gas/config/tc-moxie.h @@ -1,6 +1,6 @@ /* tc-moxie.h -- Header file for tc-moxie.c. - Copyright 2009 Free Software Foundation, Inc. + Copyright 2009, 2012 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -22,11 +22,11 @@ #define TARGET_BYTES_BIG_ENDIAN 1 #define WORKING_DOT_WORD -/* This macro is the BFD target name to use when creating the output - file. This will normally depend upon the `OBJ_FMT' macro. */ -#define TARGET_FORMAT "elf32-moxie" - /* This macro is the BFD architecture to pass to `bfd_set_arch_mach'. */ +const char *moxie_target_format; +#define DEFAULT_TARGET_FORMAT "elf32-bigmoxie" +#define TARGET_FORMAT moxie_target_format + #define TARGET_ARCH bfd_arch_moxie #define md_undefined_symbol(NAME) 0 diff --git a/ld/ChangeLog b/ld/ChangeLog index 02d437c1c7..724b4c7f68 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2012-09-13 Anthony Green + + * emulparams/elf32moxie.sh (BIG_OUTPUT_FORMAT, + LITTLE_OUTPUT_FORMAT): Define. + (OUTPUT_FORMAT): Change to elf32-bigmoxie. + (EMBEDDED): Define. + 2012-09-12 DJ Delorie * emulparams/elf32rx.sh (OTHER_READONLY_SECTIONS): Add W_* sections. diff --git a/ld/emulparams/elf32moxie.sh b/ld/emulparams/elf32moxie.sh index a1f9e45c40..cfa261dab2 100644 --- a/ld/emulparams/elf32moxie.sh +++ b/ld/emulparams/elf32moxie.sh @@ -1,8 +1,11 @@ SCRIPT_NAME=elf TEMPLATE_NAME=generic EXTRA_EM_FILE=genelf -OUTPUT_FORMAT="elf32-moxie" +OUTPUT_FORMAT="elf32-bigmoxie" +BIG_OUTPUT_FORMAT="elf32-bigmoxie" +LITTLE_OUTPUT_FORMAT="elf32-littlemoxie" TEXT_START_ADDR=0x1000 MAXPAGESIZE="CONSTANT (MAXPAGESIZE)" ARCH=moxie +EMBEDDED=yes STACK_ADDR=0x400000 diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index 13b0173fe0..a1b2bfe5b3 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,7 @@ +2012-09-13 Anthony Green + + * moxie-dis.c (print_insn_moxie): Handle bi-endian encodings. + 2012-09-10 Matthias Klose * config.in: Disable sanity check for kfreebsd. diff --git a/opcodes/moxie-dis.c b/opcodes/moxie-dis.c index 79ef09916f..77821bba78 100644 --- a/opcodes/moxie-dis.c +++ b/opcodes/moxie-dis.c @@ -53,7 +53,11 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) if ((status = info->read_memory_func (addr, buffer, 2, info))) goto fail; - iword = bfd_getb16 (buffer); + + if (info->endian == BFD_ENDIAN_BIG) + iword = bfd_getb16 (buffer); + else + iword = bfd_getl16 (buffer); /* Form 1 instructions have the high bit set to 0. */ if ((iword & (1<<15)) == 0) @@ -79,7 +83,10 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) unsigned imm; if ((status = info->read_memory_func (addr + 2, buffer, 4, info))) goto fail; - imm = bfd_getb32 (buffer); + if (info->endian == BFD_ENDIAN_BIG) + imm = bfd_getb32 (buffer); + else + imm = bfd_getl32 (buffer); fpr (stream, "%s\t%s, 0x%x", opcode->name, reg_names[OP_A(iword)], imm); length = 6; @@ -90,7 +97,10 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) unsigned imm; if ((status = info->read_memory_func (addr + 2, buffer, 4, info))) goto fail; - imm = bfd_getb32 (buffer); + if (info->endian == BFD_ENDIAN_BIG) + imm = bfd_getb32 (buffer); + else + imm = bfd_getl32 (buffer); fpr (stream, "%s\t0x%x", opcode->name, imm); length = 6; } @@ -100,7 +110,10 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) unsigned imm; if ((status = info->read_memory_func (addr + 2, buffer, 4, info))) goto fail; - imm = bfd_getb32 (buffer); + if (info->endian == BFD_ENDIAN_BIG) + imm = bfd_getb32 (buffer); + else + imm = bfd_getl32 (buffer); fpr (stream, "%s\t", opcode->name); info->print_address_func ((bfd_vma) imm, info); length = 6; @@ -119,7 +132,10 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) unsigned imm; if ((status = info->read_memory_func (addr + 2, buffer, 4, info))) goto fail; - imm = bfd_getb32 (buffer); + if (info->endian == BFD_ENDIAN_BIG) + imm = bfd_getb32 (buffer); + else + imm = bfd_getl32 (buffer); fpr (stream, "%s\t0x%x, %s", opcode->name, imm, reg_names[OP_A(iword)]); length = 6; @@ -130,7 +146,10 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) unsigned imm; if ((status = info->read_memory_func (addr+2, buffer, 4, info))) goto fail; - imm = bfd_getb32 (buffer); + if (info->endian == BFD_ENDIAN_BIG) + imm = bfd_getb32 (buffer); + else + imm = bfd_getl32 (buffer); fpr (stream, "%s\t0x%x(%s), %s", opcode->name, imm, reg_names[OP_A(iword)], @@ -143,7 +162,10 @@ print_insn_moxie (bfd_vma addr, struct disassemble_info * info) unsigned imm; if ((status = info->read_memory_func (addr+2, buffer, 4, info))) goto fail; - imm = bfd_getb32 (buffer); + if (info->endian == BFD_ENDIAN_BIG) + imm = bfd_getb32 (buffer); + else + imm = bfd_getl32 (buffer); fpr (stream, "%s\t%s, 0x%x(%s)", opcode->name, reg_names[OP_A(iword)], -- 2.34.1