RE: PATCH: PR bootstrap/54209: [4.8 Regression] Failed to build gcc for Android/x86
Where does mips link.h come from? I didn't see it in AOSP Bionic C library. -- H.J. It's from development/ndk/platforms/android-9/arch-mips/include/link.h from AOSP checkout. Regards, Chao-ying
RE: MIPS Android patch
Richard Sandiford wrote: Index: gcc/config/mips/gnu-user.h === --- gcc/config/mips/gnu-user.h (revision 186580) +++ gcc/config/mips/gnu-user.h (working copy) @@ -45,8 +45,10 @@ /* A standard GNU/Linux mapping. On most targets, it is included in CC1_SPEC itself by config/linux.h, but mips.h overrides CC1_SPEC and provides this hook instead. */ +#undef GNU_USER_SUBTARGET_CC1_SPEC +#define GNU_USER_SUBTARGET_CC1_SPEC %{profile:-p} This is the default GNU_USER_TARGET_CC1_SPEC, so let's remove these two lines and use GNU_USER_TARGET_CC1_SPEC... -#define SUBTARGET_CC1_SPEC %{profile:-p} +#define SUBTARGET_CC1_SPEC GNU_USER_SUBTARGET_CC1_SPEC ...here. Yes. @@ -89,12 +93,14 @@ #undef ASM_OUTPUT_REG_PUSH #undef ASM_OUTPUT_REG_POP -#undef LIB_SPEC -#define LIB_SPEC \ +#undef GNU_USER_TARGET_LIB_SPEC +#define GNU_USER_TARGET_LIB_SPEC \ %{pthread:-lpthread} \ %{shared:-lc} \ %{!shared: \ %{profile:-lc_p} %{!profile:-lc}} This is the default GNU_USER_TARGET_LIB_SPEC, except that the default one has an -mieee-fp rule that would be unnecessary but harmless on MIPS. Let's remove this definition entirely and just have: +#undef LIB_SPEC +#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC ...this bit. Yes. @@ -133,7 +139,10 @@ LINUX_DRIVER_SELF_SPECS /* Similar to standard Linux, but adding -ffast-math support. */ +#undef GNU_USER_TARGET_MATHFILE_SPEC +#define GNU_USER_TARGET_MATHFILE_SPEC \ + %{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} #undef ENDFILE_SPEC #define ENDFILE_SPEC \ - %{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ - %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s + GNU_USER_TARGET_MATHFILE_SPEC \ + GNU_USER_TARGET_ENDFILE_SPEC Nice reuse of GNU_USER_TARGET_ENDFILE_SPEC. More cut--paste gone. :-) Index: gcc/config/mips/gnu-user64.h === --- gcc/config/mips/gnu-user64.h(revision 186580) +++ gcc/config/mips/gnu-user64.h(working copy) @@ -27,15 +27,17 @@ %{!EB:%{!EL:%(endian_spec)}} \ %{!mabi=*: - MULTILIB_ABI_DEFAULT } -#undef LIB_SPEC -#define LIB_SPEC \ +#undef GNU_USER_TARGET_LIB_SPEC +#define GNU_USER_TARGET_LIB_SPEC \ %{pthread:-lpthread} \ %{shared:-lc} \ %{!shared: \ %{profile:-lc_p} %{!profile:-lc}} gnu-user64.h has to be included after gnu-user.h, so it looks like this code was already redundant before your patch. Let's just remove it. Yes. The config/mips parts are OK from my POV with those changes. And with those changes this is a nice cleanup in its own right, thanks. Here is the revised patch without unwind-dw2-fde-dip.c. I will check in this patch and the 2nd patch for unwinding soon. Thanks a lot! Regards, Chao-ying gcc/ChangeLog 2012-04-23 Chao-ying Fu f...@mips.com * config.gcc (mips64*-*-linux*): Append mips/linux-common.h to tm_file. (mips*-*-linux*): Append mips/linux-common.h to tm_file. * config/mips/gnu-user.h (SUBTARGET_CC1_SPEC): Use GNU_USER_TARGET_CC1_SPEC directly. (GNU_USER_TARGET_LINK_SPEC): New define. (LINK_SPEC): Use GNU_USER_TARGET_LINK_SPEC. (LIB_SPEC): Use GNU_USER_TARGET_LIB_SPEC directly. (GNU_USER_TARGET_MATHFILE_SPEC): New define. (ENDFILE_SPEC): Use GNU_USER_TARGET_MATHFILE_SPEC and GNU_USER_TARGET_ENDFILE_SPEC. * config/mips/gnu-user64.h (LIB_SPEC): Remove. (LINK_SPEC): Use GNU_USER_TARGET_LINK_SPEC. (GNU_USER_TARGET_LIB_SPEC): New define. * config/mips/linux-common.h: New file. Index: config.gcc === --- config.gcc (revision 186728) +++ config.gcc (working copy) @@ -1712,7 +1712,7 @@ extra_options=${extra_options} netbsd.opt netbsd-elf.opt ;; mips64*-*-linux* | mipsisa64*-*-linux*) - tm_file=dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h + tm_file=dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h tmake_file=${tmake_file} mips/t-linux64 tm_defines=${tm_defines} MIPS_ABI_DEFAULT=ABI_N32 case ${target} in @@ -1738,6 +1738,7 @@ tm_file=${tm_file} mips/gnu-user64.h mips/linux64.h tmake_file=${tmake_file} mips/t-linux64 fi + tm_file=${tm_file} mips/linux-common.h case ${target} in mipsisa32r2*) tm_defines=${tm_defines} MIPS_ISA_DEFAULT=33 Index: config/mips/gnu-user.h === --- config/mips/gnu-user.h (revision 186728) +++ config/mips/gnu-user.h (working copy)
MIPS Android patch
Hi Maxim, Richard, I built cross-toolchains for 3 different targets as follows. 1. mips-linux-gnu 2. mips-linux-gnu --enable-targets=all 3. mips64-linux-gnu These targets are affected by this MIPS Android patch. Then, I checked the output from gcc -dumpspecs before and after applying the patch. The specs have 6 places of differences for Android due to new defines in linux-common.h. I am also building GCC natively, and will test GCC natively later. Any feedback? Thanks! Regards, Chao-ying libgcc/ChangeLog 2012-04-19 Chao-ying Fu f...@mips.com * unwind-dw2-fde-dip.c: Define USE_PT_GNU_EH_FRAME for BIONIC. gcc/ChangeLog 2012-04-19 Chao-ying Fu f...@mips.com * config.gcc (mips64*-*-linux*): Append mips/linux-common.h to tm_file. (mips*-*-linux*): Append mips/linux-common.h to tm_file. * config/mips/gnu-user.h (GNU_USER_SUBTARGET_CC1_SPEC): New define. (SUBTARGET_CC1_SPEC): Use GNU_USER_SUBTARGET_CC1_SPEC. (GNU_USER_TARGET_LINK_SPEC): New define. (LINK_SPEC): Use GNU_USER_TARGET_LINK_SPEC. (GNU_USER_TARGET_LIB_SPEC): New define. (LIB_SPEC): Use GNU_USER_TARGET_LIB_SPEC. (GNU_USER_TARGET_MATHFILE_SPEC): New define. (ENDFILE_SPEC): Use GNU_USER_TARGET_MATHFILE_SPEC and GNU_USER_TARGET_ENDFILE_SPEC. * config/mips/gnu-user64.h (GNU_USER_TARGET_LIB_SPEC): New define. (LIB_SPEC): Use GNU_USER_TARGET_LIB_SPEC. (LINK_SPEC): Use GNU_USER_TARGET_LINK_SPEC. (GNU_USER_TARGET_LIB_SPEC): New define. * config/mips/linux-common.h: New file. Index: libgcc/unwind-dw2-fde-dip.c === --- libgcc/unwind-dw2-fde-dip.c (revision 186580) +++ libgcc/unwind-dw2-fde-dip.c (working copy) @@ -54,6 +54,11 @@ #endif #if !defined(inhibit_libc) defined(HAVE_LD_EH_FRAME_HDR) \ + defined(__BIONIC__) +# define USE_PT_GNU_EH_FRAME +#endif + +#if !defined(inhibit_libc) defined(HAVE_LD_EH_FRAME_HDR) \ defined(__FreeBSD__) __FreeBSD__ = 7 # define ElfW __ElfN # define USE_PT_GNU_EH_FRAME Index: gcc/config.gcc === --- gcc/config.gcc (revision 186580) +++ gcc/config.gcc (working copy) @@ -1712,7 +1712,7 @@ extra_options=${extra_options} netbsd.opt netbsd-elf.opt ;; mips64*-*-linux* | mipsisa64*-*-linux*) - tm_file=dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h + tm_file=dbxelf.h elfos.h gnu-user.h linux.h glibc-stdint.h ${tm_file} mips/gnu-user.h mips/gnu-user64.h mips/linux64.h mips/linux-common.h tmake_file=${tmake_file} mips/t-linux64 tm_defines=${tm_defines} MIPS_ABI_DEFAULT=ABI_N32 case ${target} in @@ -1738,6 +1738,7 @@ tm_file=${tm_file} mips/gnu-user64.h mips/linux64.h tmake_file=${tmake_file} mips/t-linux64 fi + tm_file=${tm_file} mips/linux-common.h case ${target} in mipsisa32r2*) tm_defines=${tm_defines} MIPS_ISA_DEFAULT=33 Index: gcc/config/mips/gnu-user.h === --- gcc/config/mips/gnu-user.h (revision 186580) +++ gcc/config/mips/gnu-user.h (working copy) @@ -45,8 +45,10 @@ /* A standard GNU/Linux mapping. On most targets, it is included in CC1_SPEC itself by config/linux.h, but mips.h overrides CC1_SPEC and provides this hook instead. */ +#undef GNU_USER_SUBTARGET_CC1_SPEC +#define GNU_USER_SUBTARGET_CC1_SPEC %{profile:-p} #undef SUBTARGET_CC1_SPEC -#define SUBTARGET_CC1_SPEC %{profile:-p} +#define SUBTARGET_CC1_SPEC GNU_USER_SUBTARGET_CC1_SPEC /* -G is incompatible with -KPIC which is the default, so only allow objects in the small data section if the user explicitly asks for it. */ @@ -54,8 +56,8 @@ #define MIPS_DEFAULT_GVALUE 0 /* Borrowed from sparc/linux.h */ -#undef LINK_SPEC -#define LINK_SPEC \ +#undef GNU_USER_TARGET_LINK_SPEC +#define GNU_USER_TARGET_LINK_SPEC \ %(endian_spec) \ %{shared:-shared} \ %{!shared: \ @@ -63,6 +65,8 @@ %{rdynamic:-export-dynamic} \ -dynamic-linker GNU_USER_DYNAMIC_LINKER } \ %{static:-static}} +#undef LINK_SPEC +#define LINK_SPEC GNU_USER_TARGET_LINK_SPEC #undef SUBTARGET_ASM_SPEC #define SUBTARGET_ASM_SPEC \ @@ -89,12 +93,14 @@ #undef ASM_OUTPUT_REG_PUSH #undef ASM_OUTPUT_REG_POP -#undef LIB_SPEC -#define LIB_SPEC \ +#undef GNU_USER_TARGET_LIB_SPEC +#define GNU_USER_TARGET_LIB_SPEC \ %{pthread:-lpthread} \ %{shared:-lc} \ %{!shared: \ %{profile:-lc_p} %{!profile:-lc}} +#undef LIB_SPEC +#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC #ifdef HAVE_AS_NO_SHARED /* Default to -mno-shared for non-PIC. */ @@ -133,7 +139,10 @@ LINUX_DRIVER_SELF_SPECS /* Similar to standard Linux, but adding -ffast-math support. */ +#undef GNU_USER_TARGET_MATHFILE_SPEC +#define
RE: [PATCH, Android] MIPS support
Maxim Kuvyrkov wrote: For now, two MIPS changes in gnu-user.h and unwind-dw2-fde-dip.c can be posted for comment. (I didn't tested this patch, though.) You need to test your patches before posting them for review. Below are a couple of comments on your current version. I can test if this patch doesn't break existing MIPS Linux GCC build. After starting to build toolchains for Android with Bionic, we may find new files to patch. Ex: Comment out getpagesize() for bionic. Any comment? Thanks a lot! Regards, Chao-ying Index: gcc/gcc/config/mips/gnu-user.h === --- gcc.orig/gcc/config/mips/gnu-user.h2012-04-03 17:39:50.0 -0700 +++ gcc/gcc/config/mips/gnu-user.h 2012-04-04 14:31:50.804236000 -0700 @@ -45,8 +45,8 @@ along with GCC; see the file COPYING3. /* A standard GNU/Linux mapping. On most targets, it is included in CC1_SPEC itself by config/linux.h, but mips.h overrides CC1_SPEC and provides this hook instead. */ -#undef SUBTARGET_CC1_SPEC -#define SUBTARGET_CC1_SPEC %{profile:-p} +#undef GNU_USER_SUBTARGET_CC1_SPEC +#define GNU_USER_SUBTARGET_CC1_SPEC %{profile:-p} /* -G is incompatible with -KPIC which is the default, so only allow objects in the small data section if the user explicitly asks for it. */ @@ -54,8 +54,8 @@ along with GCC; see the file COPYING3. #define MIPS_DEFAULT_GVALUE 0 /* Borrowed from sparc/linux.h */ -#undef LINK_SPEC -#define LINK_SPEC \ +#undef GNU_USER_TARGET_LINK_SPEC +#define GNU_USER_TARGET_LINK_SPEC \ %(endian_spec) \ %{shared:-shared} \ %{!shared: \ @@ -89,8 +89,8 @@ along with GCC; see the file COPYING3. #undef ASM_OUTPUT_REG_PUSH #undef ASM_OUTPUT_REG_POP -#undef LIB_SPEC -#define LIB_SPEC \ +#undef GNU_USER_TARGET_LIB_SPEC +#define GNU_USER_TARGET_LIB_SPEC \ %{pthread:-lpthread} \ %{shared:-lc} \ %{!shared: \ @@ -133,7 +133,34 @@ extern const char *host_detect_local_cpu LINUX_DRIVER_SELF_SPECS /* Similar to standard Linux, but adding -ffast-math support. */ -#undef ENDFILE_SPEC -#define ENDFILE_SPEC \ +#undef GNU_USER_TARGET_ENDFILE_SPEC +#define GNN_USER_TARGET_ENDFILE_SPEC \ %{Ofast|ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \ %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s Above definitions are OK. Thanks! + +#undef LINK_SPEC +#define LINK_SPEC \ + LINUX_OR_ANDROID_LD (GNU_USER_TARGET_LINK_SPEC, \ + GNU_USER_TARGET_LINK_SPEC ANDROID_LINK_SPEC) + +#undef SUBTARGET_CC1_SPEC +#define SUBTARGET_CC1_SPEC \ + LINUX_OR_ANDROID_CC (GNU_USER_SUBTARGET_CC1_SPEC, \ + GNU_USER_SUBTARGET_CC1_SPEC ANDROID_CC1_SPEC) + +#undef CC1PLUS_SPEC +#define CC1PLUS_SPEC \ + LINUX_OR_ANDROID_CC (, ANDROID_CC1PLUS_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_ENDFILE_SPEC, ANDROID_ENDFILE_SPEC) The LINUX_OR_ANDROID_* definitions should be moved out of gnu-user.h, as this header is used for systems besides Linux, e.g., kFreeBSD and Hurd. Please move these definitions to mips/linux-common.h, which will be a new file, similarly as i386 did in http://gcc.gnu.org/ml/gcc-patches/2012-04/msg00944.html . I will check this message. Index: gcc/libgcc/unwind-dw2-fde-dip.c === --- gcc.orig/libgcc/unwind-dw2-fde-dip.c 2012-04-03 17:07:28.0 -0700 +++ gcc/libgcc/unwind-dw2-fde-dip.c2012-04-04 14:51:01.338074000 -0700 @@ -48,8 +48,9 @@ #include gthr.h #if !defined(inhibit_libc) defined(HAVE_LD_EH_FRAME_HDR) \ - (__GLIBC__ 2 || (__GLIBC__ == 2 __GLIBC_MINOR__ 2) \ - || (__GLIBC__ == 2 __GLIBC_MINOR__ == 2 defined(DT_CONFIG))) + ((defined(__BIONIC__) (defined(mips) || defined(__mips__))) \ +|| (__GLIBC__ 2 || (__GLIBC__ == 2 __GLIBC_MINOR__ 2) \ + || (__GLIBC__ == 2 __GLIBC_MINOR__ == 2 defined(DT_CONFIG # define USE_PT_GNU_EH_FRAME #endif What is this change for? For stack unwinding, MIPS needs supporting functions in libgcc to work with eh_frame for Android. (Note that ARM has its own
RE: [PATCH] [MIPS] fix mips_prepend insn.
Liu [pro...@gmail.com] wrote: OK, I get. But, sorry, my mips64dspr2 patch has be done... Should I summit it? I just wonder what version of the MIPS64 DSP/DSPr2 spec that you implemented. Do you have a target CPU that has these MIPS64 DSP/DSPr2 instructions? My concern is that the latest spec removed a lot of new instructions. Thanks! Regards, Chao-ying
RE: [PATCH] [MIPS] fix mips_prepend insn.
Richard Sandiford [rdsandif...@googlemail.com] wrote: This pattern maps directly to __builtin_mips_prepend, which is defined to take and return an SI type, so :SI is the correct choice here. I agree it might be nice to have a function that operates on 64-bit values for 64-bit targets though. For compatibility reasons, we'd probably have to define both a new function and a new pattern (or at least an iterator version of the current pattern). There's currently no way of generating PREPENDD or PREPENDW either. I consider this API to be owned by MTI, so we'd need to coordinate with them. Chao-Ying, what do you think? Do you already have something like this internally? As there is no MIPS64 core with dsp/dspr2 in the market, we haven't tested/ported these built-in functions to MIPS64. I think it's better to keep the current prototype of __builtin_mips_prepend to return an SI type. We may need to add new built-in functions for instructions involving accumulators and for new MIPS64 dsp/dspr2 instructions to MIPS64. For existing built-in functions involving only integer registers/immediates, we may not change them. For Liu, is this solution suitable for you? Thanks! Regards, Chao-ying