mirror of git://gcc.gnu.org/git/gcc.git
PR 83097 Use __BYTE_ORDER__ predefined macro instead of runtime check
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
This commit is contained in:
parent
90b415f686
commit
5675291ddb
|
|
@ -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>
|
2017-11-22 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/36313
|
PR fortran/36313
|
||||||
|
|
|
||||||
|
|
@ -612,13 +612,12 @@ inquire_via_unit (st_parameter_inquire *iqp, gfc_unit *u)
|
||||||
else
|
else
|
||||||
switch (u->flags.convert)
|
switch (u->flags.convert)
|
||||||
{
|
{
|
||||||
/* big_endian is 0 for little-endian, 1 for big-endian. */
|
|
||||||
case GFC_CONVERT_NATIVE:
|
case GFC_CONVERT_NATIVE:
|
||||||
p = big_endian ? "BIG_ENDIAN" : "LITTLE_ENDIAN";
|
p = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? "BIG_ENDIAN" : "LITTLE_ENDIAN";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GFC_CONVERT_SWAP:
|
case GFC_CONVERT_SWAP:
|
||||||
p = big_endian ? "LITTLE_ENDIAN" : "BIG_ENDIAN";
|
p = __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ? "LITTLE_ENDIAN" : "BIG_ENDIAN";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -805,8 +805,6 @@ st_open (st_parameter_open *opp)
|
||||||
conv = compile_options.convert;
|
conv = compile_options.convert;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We use big_endian, which is 0 on little-endian machines
|
|
||||||
and 1 on big-endian machines. */
|
|
||||||
switch (conv)
|
switch (conv)
|
||||||
{
|
{
|
||||||
case GFC_CONVERT_NATIVE:
|
case GFC_CONVERT_NATIVE:
|
||||||
|
|
@ -814,11 +812,11 @@ st_open (st_parameter_open *opp)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GFC_CONVERT_BIG:
|
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;
|
break;
|
||||||
|
|
||||||
case GFC_CONVERT_LITTLE:
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -2723,8 +2723,6 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
|
||||||
if (conv == GFC_CONVERT_NONE)
|
if (conv == GFC_CONVERT_NONE)
|
||||||
conv = compile_options.convert;
|
conv = compile_options.convert;
|
||||||
|
|
||||||
/* We use big_endian, which is 0 on little-endian machines
|
|
||||||
and 1 on big-endian machines. */
|
|
||||||
switch (conv)
|
switch (conv)
|
||||||
{
|
{
|
||||||
case GFC_CONVERT_NATIVE:
|
case GFC_CONVERT_NATIVE:
|
||||||
|
|
@ -2732,11 +2730,11 @@ data_transfer_init (st_parameter_dt *dtp, int read_flag)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GFC_CONVERT_BIG:
|
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;
|
break;
|
||||||
|
|
||||||
case GFC_CONVERT_LITTLE:
|
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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -986,7 +986,7 @@ btoa_big (const char *s, char *buffer, int len, GFC_UINTEGER_LARGEST *n)
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
q = buffer;
|
q = buffer;
|
||||||
if (big_endian)
|
if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||||
{
|
{
|
||||||
const char *p = s;
|
const char *p = s;
|
||||||
for (i = 0; i < len; i++)
|
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';
|
*q = '\0';
|
||||||
i = k = octet = 0;
|
i = k = octet = 0;
|
||||||
|
|
||||||
if (big_endian)
|
if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||||
{
|
{
|
||||||
const char *p = s + len - 1;
|
const char *p = s + len - 1;
|
||||||
char c = *p;
|
char c = *p;
|
||||||
|
|
@ -1126,7 +1126,7 @@ ztoa_big (const char *s, char *buffer, int len, GFC_UINTEGER_LARGEST *n)
|
||||||
|
|
||||||
q = buffer;
|
q = buffer;
|
||||||
|
|
||||||
if (big_endian)
|
if (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
||||||
{
|
{
|
||||||
const char *p = s;
|
const char *p = s;
|
||||||
for (i = 0; i < len; i++)
|
for (i = 0; i < len; i++)
|
||||||
|
|
|
||||||
|
|
@ -266,12 +266,8 @@ typedef GFC_UINTEGER_4 gfc_char4_t;
|
||||||
simply equal to the kind parameter itself. */
|
simply equal to the kind parameter itself. */
|
||||||
#define GFC_SIZE_OF_CHAR_KIND(kind) (kind)
|
#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) \
|
#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 \
|
#define GFC_INTEGER_1_HUGE \
|
||||||
(GFC_INTEGER_1)((((GFC_UINTEGER_1)1) << 7) - 1)
|
(GFC_INTEGER_1)((((GFC_UINTEGER_1)1) << 7) - 1)
|
||||||
|
|
|
||||||
|
|
@ -33,31 +33,6 @@ stupid_function_name_for_static_linking (void)
|
||||||
return;
|
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 int argc_save;
|
||||||
static char **argv_save;
|
static char **argv_save;
|
||||||
|
|
@ -89,9 +64,6 @@ get_args (int *argc, char ***argv)
|
||||||
static void __attribute__((constructor))
|
static void __attribute__((constructor))
|
||||||
init (void)
|
init (void)
|
||||||
{
|
{
|
||||||
/* Figure out the machine endianness. */
|
|
||||||
determine_endianness ();
|
|
||||||
|
|
||||||
/* Must be first */
|
/* Must be first */
|
||||||
init_variables ();
|
init_variables ();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,13 +40,6 @@ stupid_function_name_for_static_linking (void)
|
||||||
|
|
||||||
options_t options;
|
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 int argc_save;
|
||||||
static char **argv_save;
|
static char **argv_save;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue