On 28/02/2012, at 3:41 AM, Ilya Enkovich wrote:

>> You should keep those *_SPEC and define them with new
>> GNU_*_SPEC in gnu-user.h since gnu-user.h is also used
>> by other non-linux targets.  In linux.h, you undef *_SPEC
>> before defining them.
>> 
>> 
>> --
>> H.J.
> 
> Thanks for the note. Here is fixed version. Is it OK now?

This version looks mostly OK, but still needs a bit of work and testing.

How did you test this patch?  You should have built before- and after-patch 
compilers for both Linux and Android and run regression testsuites at least for 
Linux, and make sure there are no new failures.

As is, it appears this patch did not see much testing, I'm pretty sure it 
breaks building shared libraries and PIE executable for Linux.


> 
> Thanks,
> Ilya
> --
> 2012-02-27  Enkovich Ilya  <ilya.enkov...@intel.com>
> 
>       * gcc/config/i386/gnu-user.h (GNU_USER_TARGET_CC1_SPEC): New.
>       (CC1_SPEC): Use GNU_USER_TARGET_CC1_SPEC.
>       (GNU_USER_TARGET_LINK_SPEC): New.
>       (LINK_SPEC): Use GNU_USER_TARGET_LINK_SPEC.
>       (GNU_USER_TARGET_MATHFILE_SPEC): New.
>       (ENDFILE_SPEC): Use GNU_USER_TARGET_MATHFILE_SPEC.
> 
>       * gcc/config/i386/linux.h (CC1_SPEC): New.
>       (LINK_SPEC): New.
>       (LIB_SPEC): New.
>       (STARTFILE_SPEC): New.
>       (ENDFILE_SPEC): New.
> 
> 
> diff --git a/gcc/config/i386/gnu-user.h b/gcc/config/i386/gnu-user.h
> index 98d0a25..33ceab7 100644
> --- a/gcc/config/i386/gnu-user.h
> +++ b/gcc/config/i386/gnu-user.h
> @@ -77,8 +77,11 @@ along with GCC; see the file COPYING3.  If not see
> #undef CPP_SPEC
> #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}"
> 
> +#undef GNU_USER_TARGET_CC1_SPEC
> +#define GNU_USER_TARGET_CC1_SPEC "%(cc1_cpu) %{profile:-p}"

Here and in other instances below you use "GNU_USER_TARGET_" prefix.  I would 
prefer using a shorter "GNU_USER_" instead unless there is a good reason to add 
"TARGET" too.

> +
> #undef CC1_SPEC
> -#define CC1_SPEC "%(cc1_cpu) %{profile:-p}"
> +#define CC1_SPEC GNU_USER_TARGET_CC1_SPEC
> 
> /* Provide a LINK_SPEC appropriate for GNU userspace.  Here we provide support
>    for the special GCC options -static and -shared, which allow us to
> @@ -97,22 +100,28 @@ along with GCC; see the file COPYING3.  If not see
>   { "link_emulation", GNU_USER_LINK_EMULATION },\
>   { "dynamic_linker", GNU_USER_DYNAMIC_LINKER }
> 
> -#undef       LINK_SPEC
> -#define LINK_SPEC "-m %(link_emulation) %{shared:-shared} \
> +#define GNU_USER_TARGET_LINK_SPEC \
> +  "-m %(link_emulation) %{shared:-shared} \
>   %{!shared: \
>     %{!static: \
>       %{rdynamic:-export-dynamic} \
>       -dynamic-linker %(dynamic_linker)} \
>       %{static:-static}}"
> 
> +#undef       LINK_SPEC
> +#define LINK_SPEC GNU_USER_TARGET_LINK_SPEC
> +
> /* Similar to standard GNU userspace, but adding -ffast-math support.  */
> -#undef  ENDFILE_SPEC
> -#define ENDFILE_SPEC \
> +#define GNU_USER_TARGET_MATHFILE_SPEC \
>   "%{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
>    %{mpc32:crtprec32.o%s} \
>    %{mpc64:crtprec64.o%s} \
> -   %{mpc80:crtprec80.o%s} \
> -   %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
> +   %{mpc80:crtprec80.o%s}"
> +
> +#undef  ENDFILE_SPEC
> +#define ENDFILE_SPEC \
> +  GNU_USER_TARGET_MATHFILE_SPEC " " \
> +  GNU_USER_TARGET_ENDFILE_SPEC

Here you remove "%{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s".  Presumably, 
you are moving that to GNU_USER[_TARGET]_ENDFILE_SPEC, but you never define it.

> 
> /* A C statement (sans semicolon) to output to the stdio stream
>    FILE the assembler definition of uninitialized global DECL named
> diff --git a/gcc/config/i386/linux.h b/gcc/config/i386/linux.h
> index 73681fe..a832ddc 100644
> --- a/gcc/config/i386/linux.h
> +++ b/gcc/config/i386/linux.h

i386/linux.h is used only for simple x86 32-bit builds; i386/linux64.h is used 
for multilib-enabled x86 toolchains.  Placing below definitions in i386/linux.h 
will not allow adding an Android as an additional multilib to -m32/-m64 x86 
builds.  I improve on this situation I suggest:
- rename i386/linux.h to i386/linux32.h (with corresponding change to 
config.gcc),
- put below definitions to new i386/linux.h (remember to add license notice 
header to the new file),
- include i386/linux.h from both i386/linux32.h and i386/linux64.h.

> @@ -22,3 +22,30 @@ along with GCC; see the file COPYING3.  If not see
> 
> #define GNU_USER_LINK_EMULATION "elf_i386"
> #define GLIBC_DYNAMIC_LINKER "/lib/ld-linux.so.2"
> +
> +#undef CC1_SPEC
> +#define CC1_SPEC \
> +  LINUX_OR_ANDROID_CC (GNU_USER_TARGET_CC1_SPEC, \
> +                    GNU_USER_TARGET_CC1_SPEC " " ANDROID_CC1_SPEC)
> +
> +#undef       LINK_SPEC
> +#define LINK_SPEC \
> +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LINK_SPEC, \
> +                    GNU_USER_TARGET_LINK_SPEC " " ANDROID_LINK_SPEC)
> +
> +#undef  LIB_SPEC
> +#define LIB_SPEC \
> +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LIB_SPEC, \
> +                    GNU_USER_TARGET_LIB_SPEC " " ANDROID_LIB_SPEC)
> +
> +#undef  STARTFILE_SPEC
> +#define STARTFILE_SPEC \
> +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_STARTFILE_SPEC, \
> +                    ANDROID_STARTFILE_SPEC)
> +
> +#undef  ENDFILE_SPEC
> +#define ENDFILE_SPEC \
> +  LINUX_OR_ANDROID_LD (GNU_USER_TARGET_MATHFILE_SPEC " " \
> +                    GNU_USER_TARGET_ENDFILE_SPEC,     \
> +                    GNU_USER_TARGET_MATHFILE_SPEC " " \
> +                    ANDROID_ENDFILE_SPEC)


--
Maxim Kuvyrkov
CodeSourcery / Mentor Graphics


Reply via email to