Bi-endian patches for moxie
authorAnthony Green <green@redhat.com>
Thu, 13 Sep 2012 22:24:51 +0000 (22:24 +0000)
committerAnthony Green <green@redhat.com>
Thu, 13 Sep 2012 22:24:51 +0000 (22:24 +0000)
13 files changed:
bfd/ChangeLog
bfd/config.bfd
bfd/configure
bfd/configure.in
bfd/elf32-moxie.c
bfd/targets.c
gas/ChangeLog
gas/config/tc-moxie.c
gas/config/tc-moxie.h
ld/ChangeLog
ld/emulparams/elf32moxie.sh
opcodes/ChangeLog
opcodes/moxie-dis.c

index e33ab1a..9a0d510 100644 (file)
@@ -1,3 +1,13 @@
+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
index 6025f26..218f1dd 100644 (file)
@@ -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*)
index a6f61c5..ea06949 100755 (executable)
@@ -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" ;;
index 3626173..612d032 100644 (file)
@@ -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" ;;
index c1a793e..9a031b4 100644 (file)
@@ -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
index fa206d2..621bf8d 100644 (file)
@@ -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,
index 0304941..999e20b 100644 (file)
@@ -1,3 +1,14 @@
+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
index e73887d..fa8ace5 100644 (file)
@@ -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;
 }
-\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.  */
@@ -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.  */
index db1d01a..af4fe51 100644 (file)
@@ -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.
 
 #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
index 02d437c..724b4c7 100644 (file)
@@ -1,3 +1,10 @@
+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.
index a1f9e45..cfa261d 100644 (file)
@@ -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
index 13b0173..a1b2bfe 100644 (file)
@@ -1,3 +1,7 @@
+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.
index 79ef099..77821bb 100644 (file)
@@ -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)],