This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, rs6000] Remove most -mcall- options from consideration in ENDIAN_SELECT
- From: David Edelsohn <dje dot gcc at gmail dot com>
- To: Ulrich Weigand <uweigand at de dot ibm dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Sat, 8 Feb 2014 16:23:41 -0500
- Subject: Re: [PATCH, rs6000] Remove most -mcall- options from consideration in ENDIAN_SELECT
- Authentication-results: sourceware.org; auth=none
- References: <201402081644 dot s18GiGWw011298 at d06av02 dot portsmouth dot uk dot ibm dot com>
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