This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Patch, moxie] bi-endian support for moxie port


Here are some changes in support of a little-endian moxie soft-core
implementation.  This includes changes to some common files, but they
are so trivial that I will just commit them.

Anthony Green


Index: bfd/ChangeLog

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.


Index: gas/ChangeLog

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.

Index: opcodes/ChangeLog

2012-09-13  Anthony Green  <green@moxielogic.com>

	* moxie-dis.c (print_insn_moxie): Handle bi-endian encodings.



Index: bfd/config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.295
diff -u -r1.295 config.bfd
--- bfd/config.bfd	13 Aug 2012 15:01:13 -0000	1.295
+++ bfd/config.bfd	13 Sep 2012 21:36:52 -0000
@@ -419,7 +419,8 @@
     ;;

   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: bfd/configure
===================================================================
RCS file: /cvs/src/src/bfd/configure,v
retrieving revision 1.370
diff -u -r1.370 configure
--- bfd/configure	13 Aug 2012 14:52:35 -0000	1.370
+++ bfd/configure	13 Sep 2012 21:37:02 -0000
@@ -15214,6 +15214,7 @@
     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" ;;
@@ -15225,7 +15226,6 @@
     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" ;;
@@ -15256,6 +15256,7 @@
     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: bfd/configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.318
diff -u -r1.318 configure.in
--- bfd/configure.in	13 Aug 2012 14:52:36 -0000	1.318
+++ bfd/configure.in	13 Sep 2012 21:37:03 -0000
@@ -704,6 +704,7 @@
     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 @@
     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 @@
     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: bfd/elf32-moxie.c
===================================================================
RCS file: /cvs/src/src/bfd/elf32-moxie.c,v
retrieving revision 1.6
diff -u -r1.6 elf32-moxie.c
--- bfd/elf32-moxie.c	7 May 2012 03:27:50 -0000	1.6
+++ bfd/elf32-moxie.c	13 Sep 2012 21:37:03 -0000
@@ -366,8 +366,10 @@
 #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: bfd/targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.218
diff -u -r1.218 targets.c
--- bfd/targets.c	13 Aug 2012 14:52:40 -0000	1.218
+++ bfd/targets.c	13 Sep 2012 21:37:04 -0000
@@ -606,6 +606,7 @@
 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_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_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 @@
 	&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 @@
 	&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 @@
 	&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: gas/config/tc-moxie.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-moxie.c,v
retrieving revision 1.8
diff -u -r1.8 tc-moxie.c
--- gas/config/tc-moxie.c	8 Sep 2012 01:20:28 -0000	1.8
+++ gas/config/tc-moxie.c	13 Sep 2012 21:37:06 -0000
@@ -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 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 @@
 	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 @@

   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 @@
   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 @@
     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: gas/config/tc-moxie.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-moxie.h,v
retrieving revision 1.1
diff -u -r1.1 tc-moxie.h
--- gas/config/tc-moxie.h	16 Apr 2009 15:39:44 -0000	1.1
+++ gas/config/tc-moxie.h	13 Sep 2012 21:37:06 -0000
@@ -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
Index: opcodes/moxie-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/moxie-dis.c,v
retrieving revision 1.4
diff -u -r1.4 moxie-dis.c
--- opcodes/moxie-dis.c	17 May 2012 15:13:25 -0000	1.4
+++ opcodes/moxie-dis.c	13 Sep 2012 21:37:21 -0000
@@ -53,7 +53,11 @@

   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 @@
 	    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 @@
 	    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 @@
 	    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 @@
 	    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 @@
 	    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 @@
 	    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)],


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]