diff mbox

[rs6000] Remove most -mcall- options from consideration in ENDIAN_SELECT

Message ID 201402081644.s18GiGWw011298@d06av02.portsmouth.uk.ibm.com
State New
Headers show

Commit Message

Ulrich Weigand Feb. 8, 2014, 4:44 p.m. UTC
Hello,

using the -mcall-linux option on powerpc64le-linux (which should be a no-op)
currently causes the compiler driver to pass -mbig to the linker.  Likewise,
using -mcall-aixdesc (which is allowed when also using -mabi=elfv1, like
certain versions of the Linux kernel do), causes the compiler driver to
pass -mbig to the linker.

While in both cases the incorrect effect can be worked around by using an
explicit -mlittle-endian, this should not be required in a compiler built
for the powerpc64le-linux target.

The reason for this behaviour is use of an ENDIAN_SELECT statement in
ASM_SPEC as defined in sysv4.h, and this ENDIAN_SELECT macro hard-codes
certain byte orders in response to various -mcall- options:
 big-endian for -mcall-aixdesc, -mcall-{free,net,open}bsd and -mcall-linux;
 little-endian for -mcall-i960-old.

Interestingly enough, for the big-endian cases above, this affects only
the *assembler*; the compiler itself will not switch endianness.  However,
for -mcall-i960-old, there is code in SUBTARGET_OVERRIDE_OPTIONS to also
switch the compiler's byte order.

I'm not 100% sure what to do about -mcall-i960-old, but at least the
behaviour is self-consistent, so I left it alone for now.

However, -mcall-aixdesc, -mcall-linux (and possibly in the future
also -mcall-*bsd) should clearly not imply a particular byte order,
and don't work in a consistent manner on little-endian systems today
anyway, so the patch below removes this clause from ENDIAN_SELECT.

As a side-effect, I noticed that there apparently was some attempt
in the past to pass endian options to cc1, as evidenced by specs
substrings like %cc1_endian_default.  However, the current set of
header files never defines any of those specs to any non-empty
value, so this patch removes all of them as well.

Tested on powerpc64-linux (-m64/-m32) and powerpc64le-linux.

OK for mainline?

Bye,
Ulrich


ChangeLog:

	* config/rs6000/sysv4.h (ENDIAN_SELECT): Do not attempt to enforce
	big-endian mode for -mcall-aixdesc, -mcall-freebsd, -mcall-netbsd,
	-mcall-openbsd, or -mcall-linux.
	(CC1_ENDIAN_BIG_SPEC): Remove.
	(CC1_ENDIAN_LITTLE_SPEC): Remove.
	(CC1_ENDIAN_DEFAULT_SPEC): Remove.
	(CC1_SPEC): Remove (always empty) %cc1_endian_... spec.
	(SUBTARGET_EXTRA_SPECS): Remove %cc1_endian_big, %cc1_endian_little,
	and %cc1_endian_default.
	* config/rs6000/sysv4le.h (CC1_ENDIAN_DEFAULT_SPEC): Remove.

Comments

David Edelsohn Feb. 8, 2014, 9:23 p.m. UTC | #1
On Sat, Feb 8, 2014 at 11:44 AM, Ulrich Weigand <uweigand@de.ibm.com> wrote:
> Hello,
>
> using the -mcall-linux option on powerpc64le-linux (which should be a no-op)
> currently causes the compiler driver to pass -mbig to the linker.  Likewise,
> using -mcall-aixdesc (which is allowed when also using -mabi=elfv1, like
> certain versions of the Linux kernel do), causes the compiler driver to
> pass -mbig to the linker.
>
> While in both cases the incorrect effect can be worked around by using an
> explicit -mlittle-endian, this should not be required in a compiler built
> for the powerpc64le-linux target.
>
> The reason for this behaviour is use of an ENDIAN_SELECT statement in
> ASM_SPEC as defined in sysv4.h, and this ENDIAN_SELECT macro hard-codes
> certain byte orders in response to various -mcall- options:
>  big-endian for -mcall-aixdesc, -mcall-{free,net,open}bsd and -mcall-linux;
>  little-endian for -mcall-i960-old.
>
> Interestingly enough, for the big-endian cases above, this affects only
> the *assembler*; the compiler itself will not switch endianness.  However,
> for -mcall-i960-old, there is code in SUBTARGET_OVERRIDE_OPTIONS to also
> switch the compiler's byte order.
>
> I'm not 100% sure what to do about -mcall-i960-old, but at least the
> behaviour is self-consistent, so I left it alone for now.
>
> However, -mcall-aixdesc, -mcall-linux (and possibly in the future
> also -mcall-*bsd) should clearly not imply a particular byte order,
> and don't work in a consistent manner on little-endian systems today
> anyway, so the patch below removes this clause from ENDIAN_SELECT.
>
> As a side-effect, I noticed that there apparently was some attempt
> in the past to pass endian options to cc1, as evidenced by specs
> substrings like %cc1_endian_default.  However, the current set of
> header files never defines any of those specs to any non-empty
> value, so this patch removes all of them as well.
>
> Tested on powerpc64-linux (-m64/-m32) and powerpc64le-linux.
>
> OK for mainline?
>
> Bye,
> Ulrich
>
>
> ChangeLog:
>
>         * config/rs6000/sysv4.h (ENDIAN_SELECT): Do not attempt to enforce
>         big-endian mode for -mcall-aixdesc, -mcall-freebsd, -mcall-netbsd,
>         -mcall-openbsd, or -mcall-linux.
>         (CC1_ENDIAN_BIG_SPEC): Remove.
>         (CC1_ENDIAN_LITTLE_SPEC): Remove.
>         (CC1_ENDIAN_DEFAULT_SPEC): Remove.
>         (CC1_SPEC): Remove (always empty) %cc1_endian_... spec.
>         (SUBTARGET_EXTRA_SPECS): Remove %cc1_endian_big, %cc1_endian_little,
>         and %cc1_endian_default.
>         * config/rs6000/sysv4le.h (CC1_ENDIAN_DEFAULT_SPEC): Remove.

Okay.

Thanks for cleaning this up.

Thanks, David
diff mbox

Patch

Index: gcc/config/rs6000/sysv4le.h
===================================================================
--- gcc/config/rs6000/sysv4le.h	(revision 207578)
+++ gcc/config/rs6000/sysv4le.h	(working copy)
@@ -22,9 +22,6 @@ 
 #undef  TARGET_DEFAULT
 #define TARGET_DEFAULT MASK_LITTLE_ENDIAN
 
-#undef	CC1_ENDIAN_DEFAULT_SPEC
-#define	CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_little)"
-
 #undef	DEFAULT_ASM_ENDIAN
 #define	DEFAULT_ASM_ENDIAN " -mlittle"
 
Index: gcc/config/rs6000/sysv4.h
===================================================================
--- gcc/config/rs6000/sysv4.h	(revision 207578)
+++ gcc/config/rs6000/sysv4.h	(working copy)
@@ -522,8 +522,6 @@ 
 #define ENDIAN_SELECT(BIG_OPT, LITTLE_OPT, DEFAULT_OPT)	\
 "%{mlittle|mlittle-endian:"	LITTLE_OPT ";"	\
   "mbig|mbig-endian:"		BIG_OPT    ";"	\
-  "mcall-aixdesc|mcall-freebsd|mcall-netbsd|"	\
-  "mcall-openbsd|mcall-linux:"	BIG_OPT    ";"	\
   "mcall-i960-old:"		LITTLE_OPT ";"	\
   ":"				DEFAULT_OPT "}"
 
@@ -536,20 +534,12 @@ 
 %{memb|msdata=eabi: -memb}" \
 ENDIAN_SELECT(" -mbig", " -mlittle", DEFAULT_ASM_ENDIAN)
 
-#define	CC1_ENDIAN_BIG_SPEC ""
-
-#define	CC1_ENDIAN_LITTLE_SPEC ""
-
-#define	CC1_ENDIAN_DEFAULT_SPEC "%(cc1_endian_big)"
-
 #ifndef CC1_SECURE_PLT_DEFAULT_SPEC
 #define CC1_SECURE_PLT_DEFAULT_SPEC ""
 #endif
 
-/* Pass -G xxx to the compiler and set correct endian mode.  */
+/* Pass -G xxx to the compiler.  */
 #define	CC1_SPEC "%{G*} %(cc1_cpu)" \
-  ENDIAN_SELECT(" %(cc1_endian_big)", " %(cc1_endian_little)",	\
-		" %(cc1_endian_default)")			\
 "%{meabi: %{!mcall-*: -mcall-sysv }} \
 %{!meabi: %{!mno-eabi: \
     %{mrelocatable: -meabi } \
@@ -903,9 +893,6 @@ 
   { "link_os_netbsd",		LINK_OS_NETBSD_SPEC },			\
   { "link_os_openbsd",		LINK_OS_OPENBSD_SPEC },			\
   { "link_os_default",		LINK_OS_DEFAULT_SPEC },			\
-  { "cc1_endian_big",		CC1_ENDIAN_BIG_SPEC },			\
-  { "cc1_endian_little",	CC1_ENDIAN_LITTLE_SPEC },		\
-  { "cc1_endian_default",	CC1_ENDIAN_DEFAULT_SPEC },		\
   { "cc1_secure_plt_default",	CC1_SECURE_PLT_DEFAULT_SPEC },		\
   { "cpp_os_ads",		CPP_OS_ADS_SPEC },			\
   { "cpp_os_yellowknife",	CPP_OS_YELLOWKNIFE_SPEC },		\