* configure.in (AC_C_BIGENDIAN): Invoke.
authorAlan Modra <amodra@gmail.com>
Tue, 1 Mar 2005 00:43:58 +0000 (00:43 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 1 Mar 2005 00:43:58 +0000 (00:43 +0000)
* configure: Regenerate.
* write.c (write_object_file <!BFD_ASSEMBLER>): Don't use sizeof
host variable to set string header size.
* config/obj-aout.c (obj_header_append): Don't use host structs.
(obj_symbol_to_chars): Likewise.
(obj_emit_strings): Likewise.  Use the passed in output pointer.
* config/obj-aout.h (H_GET_FILE_SIZE): Include H_GET_LINENO_SIZE.
* config/obj-bout.c (obj_emit_relocations): Use md_reloc_size,
not sizeof host struct.
(obj_header_append, obj_symbol_to_chars): Don't use host structs.
(obj_emit_strings): Likewise.
* config/obj-bout.h (EXEC_BYTES_SIZE): Define.
(N_TXTOFF, H_GET_FILE_SIZE, H_GET_HEADER_SIZE): Use instead of
sizeof host struct.
(H_SET_SYMBOL_TABLE_SIZE): Hard code sym size rather than using
sizeof host struct.
(host_number_to_chars): Define.
* config/obj-hp300.c (hp300_header_append): Don't use sizeof
host internal struct to set header sizes.
* config/tc-i960.c (md_number_to_field): Warning fix.
(md_ri_to_chars): Use host byte order.
(get_cdisp, md_apply_fix3): Warning fix.

gas/ChangeLog
gas/config/obj-aout.c
gas/config/obj-aout.h
gas/config/obj-bout.c
gas/config/obj-bout.h
gas/config/obj-hp300.c
gas/config/tc-i960.c
gas/configure
gas/configure.in
gas/write.c

index 69b6cbc..a75c8ca 100644 (file)
@@ -1,3 +1,29 @@
+2005-03-01  Alan Modra  <amodra@bigpond.net.au>
+
+       * configure.in (AC_C_BIGENDIAN): Invoke.
+       * configure: Regenerate.
+       * write.c (write_object_file <!BFD_ASSEMBLER>): Don't use sizeof
+       host variable to set string header size.
+       * config/obj-aout.c (obj_header_append): Don't use host structs.
+       (obj_symbol_to_chars): Likewise.
+       (obj_emit_strings): Likewise.  Use the passed in output pointer.
+       * config/obj-aout.h (H_GET_FILE_SIZE): Include H_GET_LINENO_SIZE.
+       * config/obj-bout.c (obj_emit_relocations): Use md_reloc_size,
+       not sizeof host struct.
+       (obj_header_append, obj_symbol_to_chars): Don't use host structs.
+       (obj_emit_strings): Likewise.
+       * config/obj-bout.h (EXEC_BYTES_SIZE): Define.
+       (N_TXTOFF, H_GET_FILE_SIZE, H_GET_HEADER_SIZE): Use instead of
+       sizeof host struct.
+       (H_SET_SYMBOL_TABLE_SIZE): Hard code sym size rather than using
+       sizeof host struct.
+       (host_number_to_chars): Define.
+       * config/obj-hp300.c (hp300_header_append): Don't use sizeof
+       host internal struct to set header sizes.
+       * config/tc-i960.c (md_number_to_field): Warning fix.
+       (md_ri_to_chars): Use host byte order.
+       (get_cdisp, md_apply_fix3): Warning fix.
+
 2005-02-28  Ramana Radhakrishnan  <ramana.radhakrishnan@codito.com>
 
        * doc/c-arc.texi: Update documentation about ARC's extension
index 74e52a5..6a47a9b 100644 (file)
@@ -1,6 +1,6 @@
 /* a.out object file format
    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1999, 2000,
-   2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
 
 This file is part of GAS, the GNU Assembler.
 
@@ -265,36 +265,39 @@ obj_emit_relocations (where, fixP, segment_address_in_file)
 
 #ifndef obj_header_append
 /* Aout file generation & utilities */
+
+/* An AOUT header on disk is laid out in target byte order.  */
+
 void
 obj_header_append (where, headers)
      char **where;
      object_headers *headers;
 {
-  tc_headers_hook (headers);
+  char *p;
 
-#ifdef CROSS_COMPILE
-  md_number_to_chars (*where, headers->header.a_info, sizeof (headers->header.a_info));
-  *where += sizeof (headers->header.a_info);
-  md_number_to_chars (*where, headers->header.a_text, sizeof (headers->header.a_text));
-  *where += sizeof (headers->header.a_text);
-  md_number_to_chars (*where, headers->header.a_data, sizeof (headers->header.a_data));
-  *where += sizeof (headers->header.a_data);
-  md_number_to_chars (*where, headers->header.a_bss, sizeof (headers->header.a_bss));
-  *where += sizeof (headers->header.a_bss);
-  md_number_to_chars (*where, headers->header.a_syms, sizeof (headers->header.a_syms));
-  *where += sizeof (headers->header.a_syms);
-  md_number_to_chars (*where, headers->header.a_entry, sizeof (headers->header.a_entry));
-  *where += sizeof (headers->header.a_entry);
-  md_number_to_chars (*where, headers->header.a_trsize, sizeof (headers->header.a_trsize));
-  *where += sizeof (headers->header.a_trsize);
-  md_number_to_chars (*where, headers->header.a_drsize, sizeof (headers->header.a_drsize));
-  *where += sizeof (headers->header.a_drsize);
-
-#else /* CROSS_COMPILE */
-
-  append (where, (char *) &headers->header, sizeof (headers->header));
-#endif /* CROSS_COMPILE */
+  tc_headers_hook (headers);
 
+#ifdef __A_OUT_GNU_H__
+#define SIZEOF_HEADER(PIECE) (sizeof (((struct exec_bytes *) 0)->PIECE))
+#else
+#define SIZEOF_HEADER(PIECE) 4
+#endif
+#define DO(PIECE) \
+  md_number_to_chars (p, headers->header.PIECE, SIZEOF_HEADER (PIECE)); \
+  p += SIZEOF_HEADER (PIECE);
+
+  p = *where;
+  DO (a_info);
+  DO (a_text);
+  DO (a_data);
+  DO (a_bss);
+  DO (a_syms);
+  DO (a_entry);
+  DO (a_trsize);
+  DO (a_drsize);
+  *where = p;
+#undef DO
+#undef SIZEOF_HEADER
 }
 #endif /* ! defined (obj_header_append) */
 
@@ -303,11 +306,17 @@ obj_symbol_to_chars (where, symbolP)
      char **where;
      symbolS *symbolP;
 {
-  md_number_to_chars ((char *) &(S_GET_OFFSET (symbolP)), S_GET_OFFSET (symbolP), sizeof (S_GET_OFFSET (symbolP)));
-  md_number_to_chars ((char *) &(S_GET_DESC (symbolP)), S_GET_DESC (symbolP), sizeof (S_GET_DESC (symbolP)));
-  md_number_to_chars ((char *) &(symbolP->sy_symbol.n_value), S_GET_VALUE (symbolP), sizeof (symbolP->sy_symbol.n_value));
-
-  append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type));
+  char *p = *where;
+  md_number_to_chars (p, S_GET_OFFSET (symbolP), 4);
+  p += 4;
+  /* Can't use S_GET_TYPE here as it masks.  */
+  *p++ = symbolP->sy_symbol.n_type;
+  *p++ = symbolP->sy_symbol.n_other;
+  md_number_to_chars (p, S_GET_DESC (symbolP), 2);
+  p += 2;
+  md_number_to_chars (p, S_GET_VALUE (symbolP), 4);
+  p += 4;
+  *where = p;
 }
 
 void
@@ -538,18 +547,13 @@ obj_emit_strings (where)
 {
   symbolS *symbolP;
 
-#ifdef CROSS_COMPILE
-  /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
-  md_number_to_chars (*where, string_byte_count, sizeof (string_byte_count));
-  *where += sizeof (string_byte_count);
-#else /* CROSS_COMPILE */
-  append (where, (char *) &string_byte_count, (unsigned long) sizeof (string_byte_count));
-#endif /* CROSS_COMPILE */
+  md_number_to_chars (*where, string_byte_count, 4);
+  *where += 4;
 
   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
     {
       if (S_GET_NAME (symbolP))
-       append (&next_object_file_charP, S_GET_NAME (symbolP),
+       append (where, S_GET_NAME (symbolP),
                (unsigned long) (strlen (S_GET_NAME (symbolP)) + 1));
     }                          /* walk symbol chain */
 }
index 23a2907..2718686 100644 (file)
@@ -1,6 +1,6 @@
 /* obj-aout.h, a.out object file format for gas, the assembler.
    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000,
-   2002, 2003 Free Software Foundation, Inc.
+   2002, 2003, 2005 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -177,9 +177,10 @@ extern void obj_aout_frob_file_before_fix PARAMS ((void));
 #define H_GET_FILE_SIZE(h)     (H_GET_HEADER_SIZE(h) \
                                 + H_GET_TEXT_SIZE(h) \
                                 + H_GET_DATA_SIZE(h) \
-                                + H_GET_SYMBOL_TABLE_SIZE(h) \
                                 + H_GET_TEXT_RELOCATION_SIZE(h) \
                                 + H_GET_DATA_RELOCATION_SIZE(h) \
+                                + H_GET_LINENO_SIZE(h) \
+                                + H_GET_SYMBOL_TABLE_SIZE(h) \
                                 + H_GET_STRING_SIZE(h))
 
 #define H_GET_HEADER_SIZE(h)           (EXEC_BYTES_SIZE)
index 88ea0f1..2163543 100644 (file)
@@ -1,6 +1,6 @@
 /* b.out object file format
-   Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 2000, 2001, 2002
-   Free Software Foundation, Inc.
+   Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1996, 2000, 2001, 2002,
+   2005 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -105,7 +105,7 @@ obj_emit_relocations (where, fixP, segment_address_in_file)
          fixP->fx_addsy = sym;
 
          tc_bout_fix_to_chars (*where, fixP, segment_address_in_file);
-         *where += sizeof (struct relocation_info);
+         *where += md_reloc_size;
        }                       /* if there's a symbol  */
     }                          /* for each fixup  */
 }
@@ -120,6 +120,7 @@ obj_header_append (where, headers)
      object_headers *headers;
 {
   /* Always leave in host byte order.  */
+  char *p;
 
   headers->header.a_talign = section_alignment[SEG_TEXT];
 
@@ -138,38 +139,32 @@ obj_header_append (where, headers)
 
   headers->header.a_relaxable = linkrelax;
 
-#ifdef CROSS_COMPILE
-  md_number_to_chars (*where, headers->header.a_magic, sizeof (headers->header.a_magic));
-  *where += sizeof (headers->header.a_magic);
-  md_number_to_chars (*where, headers->header.a_text, sizeof (headers->header.a_text));
-  *where += sizeof (headers->header.a_text);
-  md_number_to_chars (*where, headers->header.a_data, sizeof (headers->header.a_data));
-  *where += sizeof (headers->header.a_data);
-  md_number_to_chars (*where, headers->header.a_bss, sizeof (headers->header.a_bss));
-  *where += sizeof (headers->header.a_bss);
-  md_number_to_chars (*where, headers->header.a_syms, sizeof (headers->header.a_syms));
-  *where += sizeof (headers->header.a_syms);
-  md_number_to_chars (*where, headers->header.a_entry, sizeof (headers->header.a_entry));
-  *where += sizeof (headers->header.a_entry);
-  md_number_to_chars (*where, headers->header.a_trsize, sizeof (headers->header.a_trsize));
-  *where += sizeof (headers->header.a_trsize);
-  md_number_to_chars (*where, headers->header.a_drsize, sizeof (headers->header.a_drsize));
-  *where += sizeof (headers->header.a_drsize);
-  md_number_to_chars (*where, headers->header.a_tload, sizeof (headers->header.a_tload));
-  *where += sizeof (headers->header.a_tload);
-  md_number_to_chars (*where, headers->header.a_dload, sizeof (headers->header.a_dload));
-  *where += sizeof (headers->header.a_dload);
-  md_number_to_chars (*where, headers->header.a_talign, sizeof (headers->header.a_talign));
-  *where += sizeof (headers->header.a_talign);
-  md_number_to_chars (*where, headers->header.a_dalign, sizeof (headers->header.a_dalign));
-  *where += sizeof (headers->header.a_dalign);
-  md_number_to_chars (*where, headers->header.a_balign, sizeof (headers->header.a_balign));
-  *where += sizeof (headers->header.a_balign);
-  md_number_to_chars (*where, headers->header.a_relaxable, sizeof (headers->header.a_relaxable));
-  *where += sizeof (headers->header.a_relaxable);
-#else /* ! CROSS_COMPILE */
-  append (where, (char *) &headers->header, sizeof (headers->header));
-#endif /* ! CROSS_COMPILE */
+  p = *where;
+  host_number_to_chars (p, headers->header.a_magic, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_text, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_data, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_bss, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_syms, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_entry, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_trsize, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_drsize, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_tload, 4);
+  p += 4;
+  host_number_to_chars (p, headers->header.a_dload, 4);
+  p += 4;
+  *p++ = headers->header.a_talign;
+  *p++ = headers->header.a_dalign;
+  *p++ = headers->header.a_balign;
+  *p++ = headers->header.a_relaxable;
+  *where = p;
 }
 
 void
@@ -177,19 +172,17 @@ obj_symbol_to_chars (where, symbolP)
      char **where;
      symbolS *symbolP;
 {
-  md_number_to_chars ((char *) &(S_GET_OFFSET (symbolP)),
-                     S_GET_OFFSET (symbolP),
-                     sizeof (S_GET_OFFSET (symbolP)));
-
-  md_number_to_chars ((char *) &(S_GET_DESC (symbolP)),
-                     S_GET_DESC (symbolP),
-                     sizeof (S_GET_DESC (symbolP)));
-
-  md_number_to_chars ((char *) &symbolP->sy_symbol.n_value,
-                     S_GET_VALUE (symbolP),
-                     sizeof (symbolP->sy_symbol.n_value));
-
-  append (where, (char *) &symbolP->sy_symbol, sizeof (obj_symbol_type));
+  char *p = *where;
+  host_number_to_chars (p, S_GET_OFFSET (symbolP), 4);
+  p += 4;
+  /* Can't use S_GET_TYPE here as it masks.  */
+  *p++ = symbolP->sy_symbol.n_type;
+  *p++ = symbolP->sy_symbol.n_other;
+  host_number_to_chars (p, S_GET_DESC (symbolP), 2);
+  p += 2;
+  host_number_to_chars (p, S_GET_VALUE (symbolP), 4);
+  p += 4;
+  *where = p;
 }
 
 void
@@ -336,14 +329,8 @@ obj_emit_strings (where)
 {
   symbolS *symbolP;
 
-#ifdef CROSS_COMPILE
-  /* Gotta do md_ byte-ordering stuff for string_byte_count first - KWK */
-  md_number_to_chars (*where, string_byte_count, sizeof (string_byte_count));
-  *where += sizeof (string_byte_count);
-#else /* CROSS_COMPILE */
-  append (where, (char *) &string_byte_count,
-         (unsigned long) sizeof (string_byte_count));
-#endif /* CROSS_COMPILE */
+  md_number_to_chars (*where, string_byte_count, 4);
+  *where += 4;
 
   for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
     {
index aaa9d9b..278fcc4 100644 (file)
@@ -1,6 +1,6 @@
 /* b.out object file format
    Copyright 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 2000,
-   2002, 2003 Free Software Foundation, Inc.
+   2002, 2003, 2005 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -106,8 +106,10 @@ struct exec
     unsigned char a_relaxable; /* Contains enough info to relax     */
   };
 
+#define        EXEC_BYTES_SIZE (10 * 4 + 4 * 1)
+
 #define N_BADMAG(x)    (((x).a_magic)!=BMAGIC)
-#define N_TXTOFF(x)    ( sizeof (struct exec) )
+#define N_TXTOFF(x)    EXEC_BYTES_SIZE
 #define N_DATOFF(x)    ( N_TXTOFF(x) + (x).a_text )
 #define N_TROFF(x)     ( N_DATOFF(x) + (x).a_data )
 #define N_DROFF(x)     ( N_TROFF(x) + (x).a_trsize )
@@ -245,14 +247,14 @@ struct relocation_info
 
 /* File header macro and type definition */
 
-#define H_GET_FILE_SIZE(h)     (sizeof (struct exec) + \
+#define H_GET_FILE_SIZE(h)     (EXEC_BYTES_SIZE + \
                                 H_GET_TEXT_SIZE(h) + H_GET_DATA_SIZE(h) + \
                                 H_GET_SYMBOL_TABLE_SIZE(h) + \
                                 H_GET_TEXT_RELOCATION_SIZE(h) + \
                                 H_GET_DATA_RELOCATION_SIZE(h) + \
                                 (h)->string_table_size)
 
-#define H_GET_HEADER_SIZE(h)           (sizeof (struct exec))
+#define H_GET_HEADER_SIZE(h)           EXEC_BYTES_SIZE
 #define H_GET_TEXT_SIZE(h)             ((h)->header.a_text)
 #define H_GET_DATA_SIZE(h)             ((h)->header.a_data)
 #define H_GET_BSS_SIZE(h)              ((h)->header.a_bss)
@@ -280,8 +282,7 @@ struct relocation_info
 
 #define H_SET_TEXT_RELOCATION_SIZE(h,v)        ((h)->header.a_trsize = (v))
 #define H_SET_DATA_RELOCATION_SIZE(h,v)        ((h)->header.a_drsize = (v))
-#define H_SET_SYMBOL_TABLE_SIZE(h,v)   ((h)->header.a_syms = (v) * \
-                                        sizeof (struct nlist))
+#define H_SET_SYMBOL_TABLE_SIZE(h,v)   ((h)->header.a_syms = (v) * 12)
 
 #define H_SET_MAGIC_NUMBER(h,v)                ((h)->header.a_magic = (v))
 
@@ -306,6 +307,12 @@ object_headers;
 #define OBJ_EMIT_LINENO(a, b, c)       {;}
 #define obj_pre_write_hook(a)          {;}
 
+#if WORDS_BIGENDIAN
+#define host_number_to_chars number_to_chars_bigendian
+#else
+#define host_number_to_chars number_to_chars_littleendian
+#endif
+
 #if __STDC__
 struct fix;
 #endif
index 2fc0f25..0dc3435 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is obj-hp300.h
-   Copyright 1993, 2000 Free Software Foundation, Inc.
+   Copyright 1993, 2000, 2005 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -30,8 +30,9 @@ hp300_header_append (where, headers)
 
 #define DO(FIELD)      \
   { \
-    md_number_to_chars (*where, headers->header.FIELD, sizeof (headers->header.FIELD)); \
-    *where += sizeof (headers->header.FIELD); \
+    md_number_to_chars (*where, headers->header.FIELD, \
+                       sizeof (((struct exec_bytes *) 0)->FIELD)); \
+    *where += sizeof (((struct exec_bytes *) 0)->FIELD); \
   }
 
   DO (a_info);
index 8b0a538..1786afe 100644 (file)
@@ -859,7 +859,7 @@ md_number_to_field (instrP, val, bfixP)
 
   /* Surprise! -- we stored the number of bits to be modified rather
      than a pointer to a structure.  */
-  numbits = (int) bfixP;
+  numbits = (int) (size_t) bfixP;
   if (numbits == 1)
     {
       /* This is a no-op, stuck here by reloc_callj() */
@@ -1116,9 +1116,6 @@ md_estimate_size_before_relax (fragP, segment_type)
        executable code is actually downloaded to the i80960).  Therefore,
        we leave it in host byte order.
 
-       The above comment is no longer true.  This routine now really
-       does do the reordering (Ian Taylor 28 Aug 92).
-
   *************************************************************************** */
 static void md_ri_to_chars PARAMS ((char *, struct relocation_info *));
 
@@ -1127,17 +1124,25 @@ md_ri_to_chars (where, ri)
      char *where;
      struct relocation_info *ri;
 {
-  md_number_to_chars (where, ri->r_address,
-                     sizeof (ri->r_address));
-  where[4] = ri->r_index & 0x0ff;
-  where[5] = (ri->r_index >> 8) & 0x0ff;
-  where[6] = (ri->r_index >> 16) & 0x0ff;
-  where[7] = ((ri->r_pcrel << 0)
-             | (ri->r_length << 1)
-             | (ri->r_extern << 3)
-             | (ri->r_bsr << 4)
-             | (ri->r_disp << 5)
-             | (ri->r_callj << 6));
+  host_number_to_chars (where, ri->r_address, 4);
+  host_number_to_chars (where + 4, ri->r_index, 3);
+#if WORDS_BIGENDIAN
+  where[7] = (ri->r_pcrel << 7
+             | ri->r_length << 5
+             | ri->r_extern << 4
+             | ri->r_bsr << 3
+             | ri->r_disp << 2
+             | ri->r_callj << 1
+             | ri->nuthin << 0);
+#else
+  where[7] = (ri->r_pcrel << 0
+             | ri->r_length << 1
+             | ri->r_extern << 3
+             | ri->r_bsr << 4
+             | ri->r_disp << 5
+             | ri->r_callj << 6
+             | ri->nuthin << 7);
+#endif
 }
 
 #endif /* defined(OBJ_AOUT) | defined(OBJ_BOUT) */
@@ -1508,7 +1513,7 @@ get_cdisp (dispP, ifmtP, instr, numbits, var_frag, callj)
               * bit_fix structure.  So we're going to lie and store
               * the number of bits affected instead of a pointer.
               */
-             fixP->fx_bit_fixP = (bit_fixS *) numbits;
+             fixP->fx_bit_fixP = (bit_fixS *) (size_t) numbits;
            }
        }
       else
@@ -2832,7 +2837,7 @@ md_apply_fix3 (fixP, valP, seg)
 
       md_number_to_imm (place, val, fixP->fx_size);
     }
-  else if ((int) fixP->fx_bit_fixP == 13
+  else if ((int) (size_t) fixP->fx_bit_fixP == 13
           && fixP->fx_addsy != NULL
           && S_GET_SEGMENT (fixP->fx_addsy) == undefined_section)
     {
index 47c8a86..9092d4b 100755 (executable)
@@ -4129,6 +4129,238 @@ case "${host}" in
 esac
 
 
+#We need this for the host.  BOUT header is in host order.
+echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5
+echo $ECHO_N "checking whether byte ordering is bigendian... $ECHO_C" >&6
+if test "${ac_cv_c_bigendian+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  # See if sys/param.h defines the BYTE_ORDER macro.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN
+ bogus endian macros
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  # It does; now see whether it defined to BIG_ENDIAN or not.
+cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+#include <sys/types.h>
+#include <sys/param.h>
+
+int
+main ()
+{
+#if BYTE_ORDER != BIG_ENDIAN
+ not big endian
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_bigendian=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_cv_c_bigendian=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+# It does not; compile a test program.
+if test "$cross_compiling" = yes; then
+  # try to guess the endianness by grepping values into an object file
+  ac_cv_c_bigendian=unknown
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+short ascii_mm[] = { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
+short ascii_ii[] = { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
+void _ascii () { char *s = (char *) ascii_mm; s = (char *) ascii_ii; }
+short ebcdic_ii[] = { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
+short ebcdic_mm[] = { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
+void _ebcdic () { char *s = (char *) ebcdic_mm; s = (char *) ebcdic_ii; }
+int
+main ()
+{
+ _ascii (); _ebcdic ();
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+        { ac_try='test -z "$ac_c_werror_flag"
+                        || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+        { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  if grep BIGenDianSyS conftest.$ac_objext >/dev/null ; then
+  ac_cv_c_bigendian=yes
+fi
+if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
+  if test "$ac_cv_c_bigendian" = unknown; then
+    ac_cv_c_bigendian=no
+  else
+    # finding both strings is unlikely to happen, but who knows?
+    ac_cv_c_bigendian=unknown
+  fi
+fi
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+int
+main ()
+{
+  /* Are we little or big endian?  From Harbison&Steele.  */
+  union
+  {
+    long l;
+    char c[sizeof (long)];
+  } u;
+  u.l = 1;
+  exit (u.c[sizeof (long) - 1] == 1);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_c_bigendian=no
+else
+  echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+( exit $ac_status )
+ac_cv_c_bigendian=yes
+fi
+rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5
+echo "${ECHO_T}$ac_cv_c_bigendian" >&6
+case $ac_cv_c_bigendian in
+  yes)
+
+cat >>confdefs.h <<\_ACEOF
+#define WORDS_BIGENDIAN 1
+_ACEOF
+ ;;
+  no)
+     ;;
+  *)
+    { { echo "$as_me:$LINENO: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&5
+echo "$as_me: error: unknown endianness
+presetting ac_cv_c_bigendian=no (or yes) will help" >&2;}
+   { (exit 1); exit 1; }; } ;;
+esac
+
+
 te_file=generic
 
 # Makefile target for installing gas in $(tooldir)/bin.
index 3296f8c..3bc5a99 100644 (file)
@@ -86,6 +86,9 @@ case "${host}" in
 esac
 AC_SUBST(GDBINIT)
 
+#We need this for the host.  BOUT header is in host order.
+AC_C_BIGENDIAN
+
 te_file=generic
 
 # Makefile target for installing gas in $(tooldir)/bin.
index f6a1c7e..c0749e8 100644 (file)
@@ -1569,11 +1569,11 @@ write_object_file (void)
      Count the number of string-table chars we will emit.
      Put this info into the headers as appropriate.  */
   know (zero_address_frag.fr_address == 0);
-  string_byte_count = sizeof (string_byte_count);
+  string_byte_count = 4;
 
   obj_crawl_symbol_chain (&headers);
 
-  if (string_byte_count == sizeof (string_byte_count))
+  if (string_byte_count == 4)
     string_byte_count = 0;
 
   H_SET_STRING_SIZE (&headers, string_byte_count);