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 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 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}}" +#undef LIB_SPEC +#define LIB_SPEC GNU_USER_TARGET_LIB_SPEC -#undef LINK_SPEC -#define LINK_SPEC "\ +#undef GNU_USER_TARGET_LINK_SPEC +#define GNU_USER_TARGET_LINK_SPEC "\ %{G*} %{EB} %{EL} %{mips1} %{mips2} %{mips3} %{mips4} \ %{shared} \ %(endian_spec) \ @@ -49,6 +51,8 @@ %{mabi=n32:-m" GNU_USER_LINK_EMULATIONN32 "} \ %{mabi=64:-m" GNU_USER_LINK_EMULATION64 "} \ %{mabi=32:-m" GNU_USER_LINK_EMULATION32 "}" +#undef LINK_SPEC +#define LINK_SPEC GNU_USER_TARGET_LINK_SPEC #undef LOCAL_LABEL_PREFIX #define LOCAL_LABEL_PREFIX (TARGET_OLDABI ? "$" : ".") Index: gcc/config/mips/linux-common.h =================================================================== --- gcc/config/mips/linux-common.h (revision 0) +++ gcc/config/mips/linux-common.h (revision 0) @@ -0,0 +1,58 @@ +/* Definitions for MIPS running Linux-based GNU systems with ELF format. + Copyright (C) 2012 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 3, or (at your option) +any later version. + +GCC is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING3. If not see +<http://www.gnu.org/licenses/>. */ + +#undef TARGET_OS_CPP_BUILTINS +#define TARGET_OS_CPP_BUILTINS() \ + do { \ + GNU_USER_TARGET_OS_CPP_BUILTINS(); \ + /* The GNU C++ standard library requires this. */ \ + if (c_dialect_cxx ()) \ + builtin_define ("_GNU_SOURCE"); \ + ANDROID_TARGET_OS_CPP_BUILTINS(); \ + } while (0) + +#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_MATHFILE_SPEC " " \ + GNU_USER_TARGET_ENDFILE_SPEC, \ + GNU_USER_TARGET_MATHFILE_SPEC " " \ + ANDROID_ENDFILE_SPEC)