PR 83097 Use __BYTE_ORDER__ predefined macro instead of runtime check
authorJanne Blomqvist <jb@gcc.gnu.org>
Wed, 22 Nov 2017 19:19:13 +0000 (21:19 +0200)
committerJanne Blomqvist <jb@gcc.gnu.org>
Wed, 22 Nov 2017 19:19:13 +0000 (21:19 +0200)
By using the __BYTE_ORDER__ predefined macro we don't need the
determine_endianness function anymore.

Regtested on x86_64-pc-linux-gnu.

libgfortran/ChangeLog:

2017-11-22  Janne Blomqvist  <jb@gcc.gnu.org>

        PR libfortran/83097
* io/inquire.c (inquire_via_unit): Use __BYTE_ORDER__ predefined
macro.
* io/open.c (st_open): Likewise.
* io/transfer.c (data_transfer_init): Likewise.
* io/write.c (btoa_big): Likewise.
(otoa_big): Likewise.
(ztoa_big): Likewise.
* libgfortran.h (big_endian): Remove variable.
(GFOR_POINTER_TO_L1): Use __BYTE_ORDER__ macro.
* runtime/main.c (determine_endianness): Remove function.
(init): Remove call to determine_endianness.
* runtime/minimal.c: Remove setting big_endian variable.

From-SVN: r255072

libgfortran/ChangeLog
libgfortran/io/inquire.c
libgfortran/io/open.c
libgfortran/io/transfer.c
libgfortran/io/write.c
libgfortran/libgfortran.h
libgfortran/runtime/main.c
libgfortran/runtime/minimal.c

index 85d73951ac676a8b48c8d78ae2d1fdba9f6fc2f1..6df2843b9fb5ca68c16db458d7b72305681c2954 100644 (file)
@@ -1,3 +1,19 @@
+2017-11-22  Janne Blomqvist  <jb@gcc.gnu.org>
+
+       PR libfortran/83097
+       * io/inquire.c (inquire_via_unit): Use __BYTE_ORDER__ predefined
+       macro.
+       * io/open.c (st_open): Likewise.
+       * io/transfer.c (data_transfer_init): Likewise.
+       * io/write.c (btoa_big): Likewise.
+       (otoa_big): Likewise.
+       (ztoa_big): Likewise.
+       * libgfortran.h (big_endian): Remove variable.
+       (GFOR_POINTER_TO_L1): Use __BYTE_ORDER__ macro.
+       * runtime/main.c (determine_endianness): Remove function.
+       (init): Remove call to determine_endianness.
+       * runtime/minimal.c: Remove setting big_endian variable.
+
 2017-11-22  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/36313
index 4cf87d339a7f249cd042b1f409944842f58044f2..fe353c553145504ab893e5a9a944642c6f148db8 100644 (file)
@@ -612,13 +612,12 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
       else
        switch (u->flags.convert)
          {
-           /*  big_endian is 0 for little-endian, 1 for big-endian.  */
          case GFC_CONVERT_NATIVE:
-           p = big_endian ? "BIG_ENDIAN" : "LITTLE_ENDIAN";
+           p = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? "BIG_ENDIAN" : "LITTLE_ENDIAN";
            break;
 
          case GFC_CONVERT_SWAP:
-           p = big_endian ? "LITTLE_ENDIAN" : "BIG_ENDIAN";
+           p = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? "LITTLE_ENDIAN" : "BIG_ENDIAN";
            break;
 
          default:
index 9d3988a7c2180b8f11e1306a0c12d46e73567fd9..fab20653c77a39b0c17a542626d92a944e628088 100644 (file)
@@ -805,8 +805,6 @@ st_open (st_parameter_open *opp)
        conv = compile_options.convert;
     }
   
-  /* We use big_endian, which is 0 on little-endian machines
-     and 1 on big-endian machines.  */
   switch (conv)
     {
     case GFC_CONVERT_NATIVE:
@@ -814,11 +812,11 @@ st_open (st_parameter_open *opp)
       break;
       
     case GFC_CONVERT_BIG:
-      conv = big_endian ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
+      conv = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
       break;
       
     case GFC_CONVERT_LITTLE:
-      conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
+      conv = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
       break;
       
     default:
index 1eb23fb89c8fc065aaabd644dfa9958fcfdd1a45..acaa88a01f9bd3572ab3c79d750bd6b34649aa42 100644 (file)
@@ -2723,8 +2723,6 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
       if (conv == GFC_CONVERT_NONE)
        conv = compile_options.convert;
 
-      /* We use big_endian, which is 0 on little-endian machines
-        and 1 on big-endian machines.  */
       switch (conv)
        {
        case GFC_CONVERT_NATIVE:
@@ -2732,11 +2730,11 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
          break;
 
        case GFC_CONVERT_BIG:
-         conv = big_endian ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
+         conv = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? GFC_CONVERT_NATIVE : GFC_CONVERT_SWAP;
          break;
 
        case GFC_CONVERT_LITTLE:
-         conv = big_endian ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
+         conv = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? GFC_CONVERT_SWAP : GFC_CONVERT_NATIVE;
          break;
 
        default:
index c9aad15009006255c91ca4d6858b4912221a6ec4..f4172029c0ed7dfb49a072b2968437dbe3172d81 100644 (file)
@@ -986,7 +986,7 @@ btoa_big (const char *s, char *buffer, int len, GFC_UINTEGER_LARGEST *n)
   int i, j;
 
   q = buffer;
-  if (big_endian)
+  if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
     {
       const char *p = s;
       for (i = 0; i < len; i++)
@@ -1051,7 +1051,7 @@ otoa_big (const char *s, char *buffer, int len, GFC_UINTEGER_LARGEST *n)
   *q = '\0';
   i = k = octet = 0;
 
-  if (big_endian)
+  if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
     {
       const char *p = s + len - 1;
       char c = *p;
@@ -1126,7 +1126,7 @@ ztoa_big (const char *s, char *buffer, int len, GFC_UINTEGER_LARGEST *n)
 
   q = buffer;
 
-  if (big_endian)
+  if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
     {
       const char *p = s;
       for (i = 0; i < len; i++)
index 52f4764a30711d89c283d63ec34a32713cd2cf03..21ad5fc23fde5ed050b5966aac27dd4bb6a76ec1 100644 (file)
@@ -266,12 +266,8 @@ typedef GFC_UINTEGER_4 gfc_char4_t;
    simply equal to the kind parameter itself.  */
 #define GFC_SIZE_OF_CHAR_KIND(kind) (kind)
 
-/* This will be 0 on little-endian machines and one on big-endian machines.  */
-extern int big_endian;
-internal_proto(big_endian);
-
 #define GFOR_POINTER_TO_L1(p, kind) \
-  (big_endian * (kind - 1) + (GFC_LOGICAL_1 *)(p))
+  ((__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? 1: 0) * (kind - 1) + (GFC_LOGICAL_1 *)(p))
 
 #define GFC_INTEGER_1_HUGE \
   (GFC_INTEGER_1)((((GFC_UINTEGER_1)1) << 7) - 1)
index 8d466d1bba8381ead9f881ad29ce678feab7d4aa..209627151a305e2d661d740b5fbba3a9d957449d 100644 (file)
@@ -33,31 +33,6 @@ stupid_function_name_for_static_linking (void)
   return;
 }
 
-/* This will be 0 for little-endian
-   machines and 1 for big-endian machines.  */
-int big_endian = 0;
-
-
-/* Figure out endianness for this machine.  */
-
-static void
-determine_endianness (void)
-{
-  union
-  {
-    GFC_LOGICAL_8 l8;
-    GFC_LOGICAL_4 l4[2];
-  } u;
-
-  u.l8 = 1;
-  if (u.l4[0])
-    big_endian = 0;
-  else if (u.l4[1])
-    big_endian = 1;
-  else
-    runtime_error ("Unable to determine machine endianness");
-}
-
 
 static int argc_save;
 static char **argv_save;
@@ -89,9 +64,6 @@ get_args (int *argc, char ***argv)
 static void __attribute__((constructor))
 init (void)
 {
-  /* Figure out the machine endianness.  */
-  determine_endianness ();
-
   /* Must be first */
   init_variables ();
 
index 2ef4f159250b52e0df8d8ae4505d6ce34a39b0e3..3c7eca1ba8ea125cd354ed7932a16e55b49b13f6 100644 (file)
@@ -40,13 +40,6 @@ stupid_function_name_for_static_linking (void)
 
 options_t options;
 
-/* This will be 0 for little-endian
-   machines and 1 for big-endian machines.
-
-   Currently minimal libgfortran only runs on little-endian devices
-   which don't support constructors so this is just a constant.  */
-int big_endian = 0;
-
 static int argc_save;
 static char **argv_save;