This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
GAS patch for sh*-unknown-linux-gnu
- To: binutils at sources dot redhat dot com
- Subject: GAS patch for sh*-unknown-linux-gnu
- From: NIIBE Yutaka <gniibe at m17n dot org>
- Date: Wed, 3 Oct 2001 18:34:41 +0900 (JST)
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
--