+2012-09-13 Anthony Green <green@moxielogic.com>
+
+ * 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 <dougkwan@google.com>
* elf64-ppc.c (ppc64_elf_relocate_section): Use pre-adjusted
;;
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*)
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" ;;
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" ;;
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" ;;
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" ;;
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" ;;
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" ;;
#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
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;
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;
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;
&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,
&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,
&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,
+2012-09-13 Anthony Green <green@moxielogic.com>
+
+ * 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 <chris.schlumberger-socha@arm.com>
* config/tc-aarch64.c
/* 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.
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)))
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,
return NULL;
}
-\f
-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);
+\f
+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. */
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:
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. */
/* 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.
#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
+2012-09-13 Anthony Green <green@moxielogic.com>
+
+ * emulparams/elf32moxie.sh (BIG_OUTPUT_FORMAT,
+ LITTLE_OUTPUT_FORMAT): Define.
+ (OUTPUT_FORMAT): Change to elf32-bigmoxie.
+ (EMBEDDED): Define.
+
2012-09-12 DJ Delorie <dj@redhat.com>
* emulparams/elf32rx.sh (OTHER_READONLY_SECTIONS): Add W_* sections.
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
+2012-09-13 Anthony Green <green@moxielogic.com>
+
+ * moxie-dis.c (print_insn_moxie): Handle bi-endian encodings.
+
2012-09-10 Matthias Klose <doko@ubuntu.com>
* config.in: Disable sanity check for kfreebsd.
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)
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;
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;
}
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;
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;
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)],
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)],