Message ID | 201402081644.s18GiGWw011298@d06av02.portsmouth.uk.ibm.com |
---|---|
State | New |
Headers | show |
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
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 }, \