summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-23 03:05:47 +0000
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2010-10-23 03:05:47 +0000
commitf6e5e45643c1d764440adf5c6d65e0995619c6ce (patch)
tree3d3cfc3c02f0c38bb0e407da7fd4e15a6393c11b
parent8658e08626b301a519308b806f52f93afce6ae03 (diff)
downloadgcc-f6e5e45643c1d764440adf5c6d65e0995619c6ce.tar.gz
gcc/
* cppbuiltin.c (define_builtin_macros_for_type_sizes): Define __BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__, and __ORDER_PDP_ENDIAN__. * libgcc2.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. (struct DWstruct): Define based on __BYTE_ORDER__. * config/fixed-bit.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. (struct INTstruct): Define based on __BYTE_ORDER__. * config/dfp-bit.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Test __BYTE_ORDER__. * system.h (LIBGCC2_WORDS_BIG_ENDIAN): Poison identifier. * config/arc/arc.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/arm/arm.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/ia64/ia64.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/iq2000/iq2000.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/lm32/lm32.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/m32r/m32r.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/mcore/mcore.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/mep/mep.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/mips/mips.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/rs6000/sysv4.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/rx/rx.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/score/score.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/sh/sh.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/sparc/sparc.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * config/xtensa/xtensa.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * doc/tm.texi.in (LIBGCC2_WORDS_BIG_ENDIAN): Delete. * doc/tm.texi: Regenerate. * doc/cpp.texi (__BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__): Document. (__ORDER_BIG_ENDIAN__, __ORDER_PDP_ENDIAN__): Likewise. libdecnumber/ * dconfig.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Test __BYTE_ORDER__. libgcc/ * config/libbid/bid_gcc_intrinsics.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete. (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Test __BYTE_ORDER__. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@165881 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog32
-rw-r--r--gcc/config/arc/arc.h8
-rw-r--r--gcc/config/arm/arm.h8
-rw-r--r--gcc/config/dfp-bit.h7
-rw-r--r--gcc/config/fixed-bit.h10
-rw-r--r--gcc/config/ia64/ia64.h6
-rw-r--r--gcc/config/iq2000/iq2000.h1
-rw-r--r--gcc/config/lm32/lm32.h1
-rw-r--r--gcc/config/m32r/m32r.h6
-rw-r--r--gcc/config/mcore/mcore.h6
-rw-r--r--gcc/config/mep/mep.h6
-rw-r--r--gcc/config/mips/mips.h8
-rw-r--r--gcc/config/rs6000/sysv4.h8
-rw-r--r--gcc/config/rx/rx.h6
-rw-r--r--gcc/config/score/score.h8
-rw-r--r--gcc/config/sh/sh.h8
-rw-r--r--gcc/config/sparc/sparc.h8
-rw-r--r--gcc/config/xtensa/xtensa.h7
-rw-r--r--gcc/cppbuiltin.c18
-rw-r--r--gcc/doc/cpp.texi24
-rw-r--r--gcc/doc/tm.texi7
-rw-r--r--gcc/doc/tm.texi.in7
-rw-r--r--gcc/libgcc2.h12
-rw-r--r--gcc/system.h2
-rw-r--r--libdecnumber/ChangeLog5
-rw-r--r--libdecnumber/dconfig.h7
-rw-r--r--libgcc/ChangeLog6
-rw-r--r--libgcc/config/libbid/bid_gcc_intrinsics.h7
28 files changed, 95 insertions, 144 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d42ef04abea..53b43f020a9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,35 @@
+2010-10-23 Nathan Froyd <froydnj@codesourcery.com>
+
+ * cppbuiltin.c (define_builtin_macros_for_type_sizes): Define
+ __BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__, and
+ __ORDER_PDP_ENDIAN__.
+ * libgcc2.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ (struct DWstruct): Define based on __BYTE_ORDER__.
+ * config/fixed-bit.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ (struct INTstruct): Define based on __BYTE_ORDER__.
+ * config/dfp-bit.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Test __BYTE_ORDER__.
+ * system.h (LIBGCC2_WORDS_BIG_ENDIAN): Poison identifier.
+ * config/arc/arc.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/arm/arm.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/ia64/ia64.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/iq2000/iq2000.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/lm32/lm32.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/m32r/m32r.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/mcore/mcore.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/mep/mep.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/mips/mips.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/rs6000/sysv4.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/rx/rx.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/score/score.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/sh/sh.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/sparc/sparc.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * config/xtensa/xtensa.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * doc/tm.texi.in (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ * doc/tm.texi: Regenerate.
+ * doc/cpp.texi (__BYTE_ORDER__, __ORDER_LITTLE_ENDIAN__): Document.
+ (__ORDER_BIG_ENDIAN__, __ORDER_PDP_ENDIAN__): Likewise.
+
2010-10-23 Jie Zhang <jie@codesourcery.com>
PR rtl-optimization/37360
diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
index ff7e5b73226..93f5a7feccf 100644
--- a/gcc/config/arc/arc.h
+++ b/gcc/config/arc/arc.h
@@ -99,14 +99,6 @@ extern int arc_cpu_type;
numbered. */
#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
-/* Define this to set the endianness to use in libgcc2.c, which can
- not depend on target_flags. */
-#ifdef __big_endian__
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
/* Width of a word, in units (bytes). */
#define UNITS_PER_WORD 4
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 4b6717f2c3b..c3dc3b91121 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -556,14 +556,6 @@ extern int arm_arch_hwdiv;
This is always false, even when in big-endian mode. */
#define WORDS_BIG_ENDIAN (BYTES_BIG_ENDIAN && ! TARGET_LITTLE_WORDS)
-/* LIBGCC2_WORDS_BIG_ENDIAN has to be a constant, so we define this based
- on processor pre-defineds when compiling libgcc2.c. */
-#if defined(__ARMEB__) && !defined(__ARMWEL__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
/* Define this if most significant word of doubles is the lowest numbered.
The rules are different based on whether or not we use FPA-format,
VFP-format or some other floating point co-processor's format doubles. */
diff --git a/gcc/config/dfp-bit.h b/gcc/config/dfp-bit.h
index f093785bf54..20688b19a1e 100644
--- a/gcc/config/dfp-bit.h
+++ b/gcc/config/dfp-bit.h
@@ -33,12 +33,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "coretypes.h"
#include "tm.h"
-#ifndef LIBGCC2_WORDS_BIG_ENDIAN
-#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
-#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
+#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN \
+ (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)
#endif
#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
diff --git a/gcc/config/fixed-bit.h b/gcc/config/fixed-bit.h
index ce5b96e7850..9d53ce783b2 100644
--- a/gcc/config/fixed-bit.h
+++ b/gcc/config/fixed-bit.h
@@ -41,14 +41,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
Ex: If we define FROM_QQ and TO_SI, the conversion from QQ to SI is
generated. */
-/* Permit the tm.h file to select the endianness to use just for this
- file. This is used when the endianness is determined when the
- compiler is run. */
-
-#ifndef LIBGCC2_WORDS_BIG_ENDIAN
-#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
#endif
@@ -428,7 +420,7 @@ typedef int word_type __attribute__ ((mode (__word__)));
/* The following defines are based on the previous defines. */
#if defined (HINT_C_TYPE)
-#if LIBGCC2_WORDS_BIG_ENDIAN
+#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
struct INTstruct {HINT_C_TYPE high, low;};
#else
struct INTstruct {HINT_C_TYPE low, high;};
diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h
index b4c3758f996..6fdcb97bcd6 100644
--- a/gcc/config/ia64/ia64.h
+++ b/gcc/config/ia64/ia64.h
@@ -148,12 +148,6 @@ extern enum processor_type ia64_tune;
#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
-#if defined(__BIG_ENDIAN__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
#define UNITS_PER_WORD 8
#define POINTER_SIZE (TARGET_ILP32 ? 32 : 64)
diff --git a/gcc/config/iq2000/iq2000.h b/gcc/config/iq2000/iq2000.h
index d07bf31a755..91c5173416d 100644
--- a/gcc/config/iq2000/iq2000.h
+++ b/gcc/config/iq2000/iq2000.h
@@ -74,7 +74,6 @@
#define BITS_BIG_ENDIAN 0
#define BYTES_BIG_ENDIAN 1
#define WORDS_BIG_ENDIAN 1
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
#define BITS_PER_WORD 32
#define MAX_BITS_PER_WORD 64
#define UNITS_PER_WORD 4
diff --git a/gcc/config/lm32/lm32.h b/gcc/config/lm32/lm32.h
index 6800e0f0200..cec835106a9 100644
--- a/gcc/config/lm32/lm32.h
+++ b/gcc/config/lm32/lm32.h
@@ -84,7 +84,6 @@
#define BITS_BIG_ENDIAN 0
#define BYTES_BIG_ENDIAN 1
#define WORDS_BIG_ENDIAN 1
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
#define BITS_PER_UNIT 8
#define BITS_PER_WORD 32
diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h
index 3c0c85d7302..a645518cbc1 100644
--- a/gcc/config/m32r/m32r.h
+++ b/gcc/config/m32r/m32r.h
@@ -319,12 +319,6 @@ extern enum m32r_sdata m32r_sdata;
numbered. */
#define WORDS_BIG_ENDIAN (TARGET_LITTLE_ENDIAN == 0)
-/* Define this macro if WORDS_BIG_ENDIAN is not constant. This must
- be a constant value with the same meaning as WORDS_BIG_ENDIAN,
- which will be used only when compiling libgcc2.c. Typically the
- value will be set based on preprocessor defines. */
-/*#define LIBGCC2_WORDS_BIG_ENDIAN 1*/
-
/* Width of a word, in units (bytes). */
#define UNITS_PER_WORD 4
diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h
index a149eb13e1d..8efe64f2bf0 100644
--- a/gcc/config/mcore/mcore.h
+++ b/gcc/config/mcore/mcore.h
@@ -106,12 +106,6 @@ extern char * mcore_current_function_name;
numbered. */
#define WORDS_BIG_ENDIAN (! TARGET_LITTLE_END)
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#ifdef __MCORELE__
-#undef LIBGCC2_WORDS_BIG_ENDIAN
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
#define MAX_BITS_PER_WORD 32
/* Width of a word, in units (bytes). */
diff --git a/gcc/config/mep/mep.h b/gcc/config/mep/mep.h
index b6a64995827..fa00098d7c4 100644
--- a/gcc/config/mep/mep.h
+++ b/gcc/config/mep/mep.h
@@ -165,12 +165,6 @@ crtbegin.o%s"
#define BYTES_BIG_ENDIAN (TARGET_LITTLE_ENDIAN ? 0 : 1)
#define WORDS_BIG_ENDIAN (TARGET_LITTLE_ENDIAN ? 0 : 1)
-#ifdef __LITTLE_ENDIAN__
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#endif
-
#define UNITS_PER_WORD 4
#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 1b4747f7b59..d6d909b7756 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -1287,14 +1287,6 @@ enum mips_code_readable_setting {
#define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN != 0)
-/* Define this to set the endianness to use in libgcc2.c, which can
- not depend on target_flags. */
-#if !defined(MIPSEL) && !defined(__MIPSEL__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
#define MAX_BITS_PER_WORD 64
/* Width of a word, in units (bytes). */
diff --git a/gcc/config/rs6000/sysv4.h b/gcc/config/rs6000/sysv4.h
index 25584b2f502..6d88e324e88 100644
--- a/gcc/config/rs6000/sysv4.h
+++ b/gcc/config/rs6000/sysv4.h
@@ -258,14 +258,6 @@ do { \
#define BYTES_BIG_ENDIAN (TARGET_BIG_ENDIAN)
#define WORDS_BIG_ENDIAN (TARGET_BIG_ENDIAN)
-/* Define this to set the endianness to use in libgcc2.c, which can
- not depend on target_flags. */
-#if !defined(__LITTLE_ENDIAN__) && !defined(__sun__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
/* Define cutoff for using external functions to save floating point.
When optimizing for size, use external functions when profitable. */
#define FP_SAVE_INLINE(FIRST_REG) (optimize_size \
diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h
index b39c1e5abca..f320beb260a 100644
--- a/gcc/config/rx/rx.h
+++ b/gcc/config/rx/rx.h
@@ -96,12 +96,6 @@ extern enum rx_cpu_types rx_cpu_type;
#define BYTES_BIG_ENDIAN TARGET_BIG_ENDIAN_DATA
#define WORDS_BIG_ENDIAN TARGET_BIG_ENDIAN_DATA
-#ifdef __RX_BIG_ENDIAN__
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
#define UNITS_PER_WORD 4
#define INT_TYPE_SIZE 32
diff --git a/gcc/config/score/score.h b/gcc/config/score/score.h
index 0db4c6c10c6..98f6d7dbe03 100644
--- a/gcc/config/score/score.h
+++ b/gcc/config/score/score.h
@@ -103,14 +103,6 @@
#define BYTES_BIG_ENDIAN (TARGET_LITTLE_ENDIAN == 0)
#define WORDS_BIG_ENDIAN (TARGET_LITTLE_ENDIAN == 0)
-/* Define this to set the endianness to use in libgcc2.c, which can
- not depend on target_flags. */
-#if defined(__scorele__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#endif
-
/* Width of a word, in units (bytes). */
#define UNITS_PER_WORD 4
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index 969636822da..0dfdd3a7b50 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -516,14 +516,6 @@ extern enum sh_divide_strategy_e sh_div_strategy;
numbered. */
#define WORDS_BIG_ENDIAN (TARGET_LITTLE_ENDIAN == 0)
-/* Define this to set the endianness to use in libgcc2.c, which can
- not depend on target_flags. */
-#if defined(__LITTLE_ENDIAN__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#endif
-
#define MAX_BITS_PER_WORD 64
/* Width in bits of an `int'. We want just 32-bits, even if words are
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 8919542e315..3df147218a1 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -582,14 +582,6 @@ extern struct sparc_cpu_select sparc_select[];
numbered. */
#define WORDS_BIG_ENDIAN 1
-/* Define this to set the endianness to use in libgcc2.c, which can
- not depend on target_flags. */
-#if defined (__LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN_DATA__)
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#endif
-
#define MAX_BITS_PER_WORD 64
/* Width of a word, in units (bytes). */
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 96173eebda3..ee528efbac3 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -94,13 +94,6 @@ extern unsigned xtensa_current_frame_size;
#define EXTRA_SPECS \
{ "subtarget_cpp_spec", SUBTARGET_CPP_SPEC },
-#ifdef __XTENSA_EB__
-#define LIBGCC2_WORDS_BIG_ENDIAN 1
-#else
-#define LIBGCC2_WORDS_BIG_ENDIAN 0
-#endif
-
-
/* Target machine storage layout */
/* Define this if most significant bit is lowest numbered
diff --git a/gcc/cppbuiltin.c b/gcc/cppbuiltin.c
index 89b0f418be6..7ac4071c322 100644
--- a/gcc/cppbuiltin.c
+++ b/gcc/cppbuiltin.c
@@ -138,6 +138,24 @@ define_builtin_macros_for_type_sizes (cpp_reader *pfile)
cpp_define_formatted (pfile, "__BIGGEST_ALIGNMENT__=%d",
BIGGEST_ALIGNMENT / BITS_PER_UNIT);
+ /* Define constants useful for implementing endian.h. */
+ cpp_define (pfile, "__ORDER_LITTLE_ENDIAN__=1234");
+ cpp_define (pfile, "__ORDER_BIG_ENDIAN__=4321");
+ cpp_define (pfile, "__ORDER_PDP_ENDIAN__=3412");
+
+ if (WORDS_BIG_ENDIAN == BYTES_BIG_ENDIAN)
+ cpp_define_formatted (pfile, "__BYTE_ORDER__=%s",
+ (WORDS_BIG_ENDIAN
+ ? "__ORDER_BIG_ENDIAN__"
+ : "__ORDER_LITTLE_ENDIAN__"));
+ else
+ {
+ /* Assert that we're only dealing with the PDP11 case. */
+ gcc_assert (!BYTES_BIG_ENDIAN && WORDS_BIG_ENDIAN);
+
+ cpp_define (pfile, "__BYTE_ORDER__=__ORDER_PDP_ENDIAN__");
+ }
+
/* ptr_type_node can't be used here since ptr_mode is only set when
toplev calls backend_init which is not done with -E switch. */
cpp_define_formatted (pfile, "__SIZEOF_POINTER__=%d",
diff --git a/gcc/doc/cpp.texi b/gcc/doc/cpp.texi
index a580e6108c8..ddcf81467f6 100644
--- a/gcc/doc/cpp.texi
+++ b/gcc/doc/cpp.texi
@@ -2265,6 +2265,30 @@ Defined to the number of bytes of the C standard data types: @code{int},
@code{double}, @code{long double}, @code{size_t}, @code{wchar_t}, @code{wint_t}
and @code{ptrdiff_t}.
+@item __BYTE_ORDER__
+@itemx __ORDER_LITTLE_ENDIAN__
+@itemx __ORDER_BIG_ENDIAN__
+@itemx __ORDER_PDP_ENDIAN__
+@code{__BYTE_ORDER__} is defined to one of the values
+@code{__ORDER_LITTLE_ENDIAN__}, @code{__ORDER_BIG_ENDIAN__}, or
+@code{__ORDER_PDP_ENDIAN__} to reflect the layout of multi-byte and
+multi-word quantities in memory. If @code{__BYTE_ORDER__} is equal to
+@code{__ORDER_LITTLE_ENDIAN__} or @code{__ORDER_BIG_ENDIAN__}, then
+multi-byte and multi-word quantities are laid out identically: the
+byte (word) at the lowest address is the least significant or most
+significant byte (word) of the quantity, respectively. If
+@code{__BYTE_ORDER__} is equal to @code{__ORDER_PDP_ENDIAN__}, then
+bytes in 16-bit words are laid out in a little-endian fashion, whereas
+the 16-bit subwords of a 32-bit quantity are laid out in big-endian
+fashion.
+
+You should use these macros for testing like this:
+
+@smallexample
+/* @r{Test for a little-endian machine} */
+#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
+@end smallexample
+
@item __DEPRECATED
This macro is defined, with value 1, when compiling a C++ source file
with warnings about deprecated constructs enabled. These warnings are
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index dd319e14069..66a092fbc1a 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -918,13 +918,6 @@ order of words in memory is the same as the order in registers. This
macro need not be a constant.
@end defmac
-@defmac LIBGCC2_WORDS_BIG_ENDIAN
-Define this macro if @code{WORDS_BIG_ENDIAN} is not constant. This must be a
-constant value with the same meaning as @code{WORDS_BIG_ENDIAN}, which will be
-used only when compiling @file{libgcc2.c}. Typically the value will be set
-based on preprocessor defines.
-@end defmac
-
@defmac FLOAT_WORDS_BIG_ENDIAN
Define this macro to have the value 1 if @code{DFmode}, @code{XFmode} or
@code{TFmode} floating point numbers are stored in memory with the word
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index a0855c0c6e1..a5fb0007920 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -912,13 +912,6 @@ order of words in memory is the same as the order in registers. This
macro need not be a constant.
@end defmac
-@defmac LIBGCC2_WORDS_BIG_ENDIAN
-Define this macro if @code{WORDS_BIG_ENDIAN} is not constant. This must be a
-constant value with the same meaning as @code{WORDS_BIG_ENDIAN}, which will be
-used only when compiling @file{libgcc2.c}. Typically the value will be set
-based on preprocessor defines.
-@end defmac
-
@defmac FLOAT_WORDS_BIG_ENDIAN
Define this macro to have the value 1 if @code{DFmode}, @code{XFmode} or
@code{TFmode} floating point numbers are stored in memory with the word
diff --git a/gcc/libgcc2.h b/gcc/libgcc2.h
index d2d86ef8a2d..8b131a35e54 100644
--- a/gcc/libgcc2.h
+++ b/gcc/libgcc2.h
@@ -35,14 +35,6 @@ extern void __clear_cache (char *, char *);
extern void __eprintf (const char *, const char *, unsigned int, const char *)
__attribute__ ((__noreturn__));
-/* Permit the tm.h file to select the endianness to use just for this
- file. This is used when the endianness is determined when the
- compiler is run. */
-
-#ifndef LIBGCC2_WORDS_BIG_ENDIAN
-#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE
#define LIBGCC2_LONG_DOUBLE_TYPE_SIZE LONG_DOUBLE_TYPE_SIZE
#endif
@@ -407,9 +399,9 @@ extern TCtype __multc3 (TFtype, TFtype, TFtype, TFtype);
#define int bogus_type
/* DWstructs are pairs of Wtype values in the order determined by
- LIBGCC2_WORDS_BIG_ENDIAN. */
+ __BYTE_ORDER__. */
-#if LIBGCC2_WORDS_BIG_ENDIAN
+#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
struct DWstruct {Wtype high, low;};
#else
struct DWstruct {Wtype low, high;};
diff --git a/gcc/system.h b/gcc/system.h
index 7ca0c88bc5d..ef0c4628b43 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -790,7 +790,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
TARGET_HANDLE_OFAST TARGET_OPTION_OPTIMIZATION
/* Hooks into libgcc2. */
- #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE
+ #pragma GCC poison LIBGCC2_DOUBLE_TYPE_SIZE LIBGCC2_WORDS_BIG_ENDIAN
/* Miscellaneous macros that are no longer used. */
#pragma GCC poison USE_MAPPED_LOCATION
diff --git a/libdecnumber/ChangeLog b/libdecnumber/ChangeLog
index 0d7765ea189..d2d6d5947ec 100644
--- a/libdecnumber/ChangeLog
+++ b/libdecnumber/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-23 Nathan Froyd <froydnj@codesourcery.com>
+
+ * dconfig.h (LIBGCC2_WORDS_BIG_ENDIAN): Delete.
+ (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Test __BYTE_ORDER__.
+
2010-09-10 Kai Tietz <kai.tietz@onevision.com>
* configure: Regenerated.
diff --git a/libdecnumber/dconfig.h b/libdecnumber/dconfig.h
index 91aa3341c6c..26b963c9480 100644
--- a/libdecnumber/dconfig.h
+++ b/libdecnumber/dconfig.h
@@ -28,12 +28,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "coretypes.h"
#include "tm.h"
-#ifndef LIBGCC2_WORDS_BIG_ENDIAN
-#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
-#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
+#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN \
+ (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)
#endif
#if LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog
index 1564feb2cd1..ea864d33dcb 100644
--- a/libgcc/ChangeLog
+++ b/libgcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-10-23 Nathan Froyd <froydnj@codesourcery.com>
+
+ * config/libbid/bid_gcc_intrinsics.h (LIBGCC2_WORDS_BIG_ENDIAN):
+ Delete.
+ (LIBGCC2_FLOAT_WORDS_BIG_ENDIAN): Test __BYTE_ORDER__.
+
2010-10-14 Nathan Froyd <froydnj@codesourcery.com>
* config/arm/bpabi.h: New file.
diff --git a/libgcc/config/libbid/bid_gcc_intrinsics.h b/libgcc/config/libbid/bid_gcc_intrinsics.h
index f5bd8d04a96..f536e3b1bd4 100644
--- a/libgcc/config/libbid/bid_gcc_intrinsics.h
+++ b/libgcc/config/libbid/bid_gcc_intrinsics.h
@@ -30,12 +30,9 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "coretypes.h"
#include "tm.h"
-#ifndef LIBGCC2_WORDS_BIG_ENDIAN
-#define LIBGCC2_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
-#endif
-
#ifndef LIBGCC2_FLOAT_WORDS_BIG_ENDIAN
-#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN LIBGCC2_WORDS_BIG_ENDIAN
+#define LIBGCC2_FLOAT_WORDS_BIG_ENDIAN \
+ (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__)
#endif
#ifndef LIBGCC2_LONG_DOUBLE_TYPE_SIZE