diff mbox

MIPS Android patch

Message ID 7C6479EB2BF52547AC332FD6034646DA01448CB550@exchdb03.mips.com
State New
Headers show

Commit Message

Fu, Chao-Ying April 20, 2012, 1:34 a.m. UTC
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  <fu@mips.com>

	* unwind-dw2-fde-dip.c: Define USE_PT_GNU_EH_FRAME for BIONIC.

gcc/ChangeLog
2012-04-19  Chao-ying Fu  <fu@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.

Comments

Richard Sandiford April 20, 2012, 7:58 a.m. UTC | #1
"Fu, Chao-Ying" <fu@mips.com> writes:
> 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.

> @@ -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.

> @@ -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.

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.

Richard
Maxim Kuvyrkov April 21, 2012, 1:15 a.m. UTC | #2
On 20/04/2012, at 1:34 PM, Fu, Chao-Ying wrote:

> 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  <fu@mips.com>
> 
> 	* unwind-dw2-fde-dip.c: Define USE_PT_GNU_EH_FRAME for BIONIC.

This piece is trivial, so, given that Richard approved the MIPS changes, you are clear to check in after amending the patch per Richard's comments.  Please check in the patch to unwind-dw2-fde-dip.c separately, as it is a change on its own.

Thank you,

--
Maxim Kuvyrkov
CodeSourcery / Mentor Graphics



> 
> gcc/ChangeLog
> 2012-04-19  Chao-ying Fu  <fu@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)
H.J. Lu Aug. 9, 2012, 3:45 p.m. UTC | #3
On Fri, Apr 20, 2012 at 6:15 PM, Maxim Kuvyrkov <maxim@codesourcery.com> wrote:
> On 20/04/2012, at 1:34 PM, Fu, Chao-Ying wrote:
>
>> 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  <fu@mips.com>
>>
>>       * unwind-dw2-fde-dip.c: Define USE_PT_GNU_EH_FRAME for BIONIC.
>
> This piece is trivial, so, given that Richard approved the MIPS changes, you are clear to check in after amending the patch per Richard's comments.  Please check in the patch to unwind-dw2-fde-dip.c separately, as it is a change on its own.
>
> Thank you,
>

This breaks Android/x86 build:

#if defined(USE_PT_GNU_EH_FRAME)

#include <link.h>

but Bionic/x86 doesn't have link.h
H.J. Lu Aug. 9, 2012, 3:56 p.m. UTC | #4
On Thu, Aug 9, 2012 at 8:45 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Fri, Apr 20, 2012 at 6:15 PM, Maxim Kuvyrkov <maxim@codesourcery.com> wrote:
>> On 20/04/2012, at 1:34 PM, Fu, Chao-Ying wrote:
>>
>>> 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  <fu@mips.com>
>>>
>>>       * unwind-dw2-fde-dip.c: Define USE_PT_GNU_EH_FRAME for BIONIC.
>>
>> This piece is trivial, so, given that Richard approved the MIPS changes, you are clear to check in after amending the patch per Richard's comments.  Please check in the patch to unwind-dw2-fde-dip.c separately, as it is a change on its own.
>>
>> Thank you,
>>
>
> This breaks Android/x86 build:
>
> #if defined(USE_PT_GNU_EH_FRAME)
>
> #include <link.h>
>
> but Bionic/x86 doesn't have link.h
>
> --
> H.J.

I opened:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54209
diff mbox

Patch

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)