This is the mail archive of the binutils@sources.redhat.com 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]

GAS patch for sh*-unknown-linux-gnu


Hi there, 

Here's a patch for gas for the target sh*-unknown-linux-gnu.

It does some clean-up for endian handling.  Removing the variable
shl and use target_big_endian directly, let configure define
TARGET_BYTES_BIG_ENDIAN.

Besides, we'd like to set default as little endian for
sh-unknown-linux-gnu, because it's more populer for SH-3 and SH-4.

While only little endian is supported for sh-*-pe, we need
support of big endian, thus, the option -big.


2001-10-03  NIIBE Yutaka  <gniibe@m17n.org>

	* config/tc-sh.c (big): New function.
	(md_show_usage): Add description fo -big.
	(md_parse_option): Handle OPTION_BIG.
	(md_pseudo_table, md_longopts): Added "big".
	(OPTION_BIG): Added.
	
	* configure.in (endian): Default is big, it is little for two
	cases, sh-*-pe* and sh*-*-linux*.
	(cpu_type): Set sh for target sh*.

	* config/tc-sh.c (shl): Removed.
	(little, md_parse_option): Remove shl handling.
	(md_begin): Don't set target_big_endian here (depending shl).

	* config/tc-sh.h (TARGET_BYTES_BIG_ENDIAN): Removed.
	(LISTING_HEADER, COFF_MAGIC, TARGET_FORMAT): Use target_big_endian.
	(shl): Removed.

Index: gas/configure.in
===================================================================
RCS file: /cvs/src/src/gas/configure.in,v
retrieving revision 1.78
diff -u -p -r1.78 configure.in
--- configure.in	2001/09/14 11:46:40	1.78
+++ configure.in	2001/10/03 09:24:25
@@ -144,6 +144,7 @@ changequote([,])dnl
       rs6000*)		cpu_type=ppc ;;
       s390x*)		cpu_type=s390 arch=s390x ;;
       s390*)		cpu_type=s390 arch=s390 ;;
+      sh*)		cpu_type=sh endian=big ;;
       sparclite*)	cpu_type=sparc arch=sparclite ;;
       sparclet*)	cpu_type=sparc arch=sparclet ;;
       sparc64*)		cpu_type=sparc arch=v9-64 ;;
@@ -398,10 +399,11 @@ changequote([,])dnl
       s390x-*-linux-gnu*)   fmt=elf em=linux ;;
       s390-*-linux-gnu*)    fmt=elf em=linux ;;
 
-      sh-*-linux*)	    fmt=elf em=linux ;;
+      sh*eb-*-linux*)	    fmt=elf em=linux endian=big ;;
+      sh*-*-linux*)	    fmt=elf em=linux endian=little ;;
       sh-*-elf*)	    fmt=elf ;;
       sh-*-coff*)           fmt=coff bfd_gas=yes;;
-      sh-*-pe*)             fmt=coff em=pe bfd_gas=yes;;
+      sh-*-pe*)             fmt=coff em=pe bfd_gas=yes endian=little ;;
       sh-*-rtemself*)       fmt=elf ;;
       sh-*-rtems*)	    fmt=coff bfd_gas=yes;;
 
Index: gas/config/tc-sh.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-sh.c,v
retrieving revision 1.43
diff -u -p -r1.43 tc-sh.c
--- tc-sh.c	2001/10/01 00:06:58	1.43
+++ tc-sh.c	2001/10/03 09:24:25
@@ -80,13 +80,17 @@ static void sh_elf_cons PARAMS ((int));
 symbolS *GOT_symbol;		/* Pre-defined "_GLOBAL_OFFSET_TABLE_" */
 #endif
 
-int shl = 0;
+static void
+big (ignore)
+     int ignore ATTRIBUTE_UNUSED;
+{
+  target_big_endian = 1;
+}
 
 static void
 little (ignore)
      int ignore ATTRIBUTE_UNUSED;
 {
-  shl = 1;
   target_big_endian = 0;
 }
 
@@ -107,6 +111,7 @@ const pseudo_typeS md_pseudo_table[] =
   {"int", cons, 4},
   {"word", cons, 2},
 #endif /* OBJ_ELF */
+  {"big", big, 0},
   {"form", listing_psize, 0},
   {"little", little, 0},
   {"heading", listing_title, 0},
@@ -439,14 +444,6 @@ md_begin ()
   char *prev_name = "";
   int target_arch;
 
-#ifdef TE_PE
-  /* The WinCE OS only supports little endian executables.  */
-  target_big_endian = 0;
-#else
-  if (! shl)
-    target_big_endian = 1;
-#endif
-
   target_arch = arch_sh1_up & ~(sh_dsp ? arch_sh3e_up : arch_sh_dsp_up);
   valid_arch = target_arch;
 
@@ -2127,11 +2124,13 @@ CONST char *md_shortopts = "";
 struct option md_longopts[] =
 {
 #define OPTION_RELAX  (OPTION_MD_BASE)
-#define OPTION_LITTLE (OPTION_MD_BASE + 1)
+#define OPTION_BIG (OPTION_MD_BASE + 1)
+#define OPTION_LITTLE (OPTION_BIG + 1)
 #define OPTION_SMALL (OPTION_LITTLE + 1)
 #define OPTION_DSP (OPTION_SMALL + 1)
 
   {"relax", no_argument, NULL, OPTION_RELAX},
+  {"big", no_argument, NULL, OPTION_BIG},
   {"little", no_argument, NULL, OPTION_LITTLE},
   {"small", no_argument, NULL, OPTION_SMALL},
   {"dsp", no_argument, NULL, OPTION_DSP},
@@ -2150,8 +2149,11 @@ md_parse_option (c, arg)
       sh_relax = 1;
       break;
 
+    case OPTION_BIG:
+      target_big_endian = 1;
+      break;
+
     case OPTION_LITTLE:
-      shl = 1;
       target_big_endian = 0;
       break;
 
@@ -2177,6 +2179,7 @@ md_show_usage (stream)
   fprintf (stream, _("\
 SH options:\n\
 -little			generate little endian code\n\
+-big			generate big endian code\n\
 -relax			alter jump instructions for long displacements\n\
 -small			align sections to 4 byte boundaries, not 16\n\
 -dsp			enable sh-dsp insns, and disable sh3e / sh4 insns.\n"));
Index: gas/config/tc-sh.h
===================================================================
RCS file: /cvs/src/src/gas/config/tc-sh.h,v
retrieving revision 1.14
diff -u -p -r1.14 tc-sh.h
--- tc-sh.h	2001/10/01 00:08:36	1.14
+++ tc-sh.h	2001/10/03 09:24:25
@@ -21,8 +21,6 @@
 
 #define TC_SH
 
-#define TARGET_BYTES_BIG_ENDIAN 0
-
 #define TARGET_ARCH bfd_arch_sh
 
 #if ANSI_PROTOTYPES
@@ -30,9 +28,6 @@ struct segment_info_struct;
 struct internal_reloc;
 #endif
 
-/* Whether in little endian mode.  */
-extern int shl;
-
 /* Whether -relax was used.  */
 extern int sh_relax;
 
@@ -81,7 +76,7 @@ extern long md_pcrel_from_section PARAMS
 
 #define IGNORE_NONSTANDARD_ESCAPES
 
-#define LISTING_HEADER (shl ? "Hitachi Super-H GAS Little Endian" : "Hitachi Super-H GAS Big Endian")
+#define LISTING_HEADER (!target_big_endian ? "Hitachi Super-H GAS Little Endian" : "Hitachi Super-H GAS Big Endian")
 
 #define md_operand(x)
 
@@ -123,7 +118,7 @@ extern void sh_frob_file PARAMS ((void))
 
 #define BFD_ARCH TARGET_ARCH
 
-#define COFF_MAGIC (shl ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG)
+#define COFF_MAGIC (!target_big_endian ? SH_ARCH_MAGIC_LITTLE : SH_ARCH_MAGIC_BIG)
 
 /* We need to write out relocs which have not been completed.  */
 #define TC_COUNT_RELOC(fix) ((fix)->fx_addsy != NULL)
@@ -168,9 +163,9 @@ extern int tc_coff_sizemachdep PARAMS ((
 extern int target_big_endian;
 
 #ifdef TE_LINUX
-#define TARGET_FORMAT (shl ? "elf32-sh-linux" : "elf32-shbig-linux")
+#define TARGET_FORMAT (!target_big_endian ? "elf32-sh-linux" : "elf32-shbig-linux")
 #else
-#define TARGET_FORMAT (shl ? "elf32-shl" : "elf32-sh")
+#define TARGET_FORMAT (!target_big_endian ? "elf32-shl" : "elf32-sh")
 #endif
 
 #define elf_tc_final_processing sh_elf_final_processing
-- 


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