diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 138fc99398981326785c231e11ace798edb86f45..9678b50258ca01bdb95e02a2e10a363210dfa932 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2010-09-26  Richard Sandiford  <rdsandiford@googlemail.com>
+
+	* config/mips/mips.c (mips_builtin_decls): Declare.
+	(mips_init_builtins): Store function declarations in
+	mips_builtin_decls.
+	(mips_builtin_decl): New function.
+	(TARGET_BUILTIN_DECL): Define.
+
 2010-09-25  Kai Tietz  <kai.tietz@onevision.com>
 	    Richard Henderson  <rth@redhat.com>
 
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index d26990e593bae0004e3ab0b62a5720db1aed9b22..56e4f2da16fd60592049143acea65a9bc8ee37db 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -13025,6 +13025,10 @@ static const struct mips_builtin_description mips_builtins[] = {
   DIRECT_NO_TARGET_BUILTIN (cache, MIPS_VOID_FTYPE_SI_CVPOINTER, cache)
 };
 
+/* Index I is the function declaration for mips_builtins[I], or null if the
+   function isn't defined on this target.  */
+static GTY(()) tree mips_builtin_decls[ARRAY_SIZE (mips_builtins)];
+
 /* MODE is a vector mode whose elements have type TYPE.  Return the type
    of the vector itself.  */
 
@@ -13141,12 +13145,23 @@ mips_init_builtins (void)
     {
       d = &mips_builtins[i];
       if (d->avail ())
-	add_builtin_function (d->name,
-			      mips_build_function_type (d->function_type),
-			      i, BUILT_IN_MD, NULL, NULL);
+	mips_builtin_decls[i]
+	  = add_builtin_function (d->name,
+				  mips_build_function_type (d->function_type),
+				  i, BUILT_IN_MD, NULL, NULL);
     }
 }
 
+/* Implement TARGET_BUILTIN_DECL.  */
+
+static tree
+mips_builtin_decl (unsigned int code, bool initialize_p ATTRIBUTE_UNUSED)
+{
+  if (code >= ARRAY_SIZE (mips_builtins))
+    return error_mark_node;
+  return mips_builtin_decls[code];
+}
+
 /* Take argument ARGNO from EXP's argument list and convert it into a
    form suitable for input operand OPNO of instruction ICODE.  Return the
    value.  */
@@ -16519,6 +16534,8 @@ mips_shift_truncation_mask (enum machine_mode mode)
 
 #undef TARGET_INIT_BUILTINS
 #define TARGET_INIT_BUILTINS mips_init_builtins
+#undef TARGET_BUILTIN_DECL
+#define TARGET_BUILTIN_DECL mips_builtin_decl
 #undef TARGET_EXPAND_BUILTIN
 #define TARGET_EXPAND_BUILTIN mips_expand_builtin