+2015-02-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * compile/compile-c-symbols.c (convert_one_symbol, convert_symbol_bmsym)
+       (gcc_symbol_address): Call gnu_ifunc_resolve_addr.
+
 2015-02-26  Antoine Tremblay  <antoine.tremblay@ericsson.com>
 
        * gdb/infcmd.c (print_return_value): use type_to_string to print type.
 
        case LOC_BLOCK:
          kind = GCC_C_SYMBOL_FUNCTION;
          addr = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+         if (is_global && TYPE_GNU_IFUNC (SYMBOL_TYPE (sym)))
+           addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
          break;
 
        case LOC_CONST:
   gcc_decl decl;
   CORE_ADDR addr;
 
+  addr = MSYMBOL_VALUE_ADDRESS (objfile, msym);
+
   /* Conversion copied from write_exp_msymbol.  */
   switch (MSYMBOL_TYPE (msym))
     {
       break;
 
     case mst_text_gnu_ifunc:
-      type = objfile_type (objfile)->nodebug_text_gnu_ifunc_symbol;
+      /* nodebug_text_gnu_ifunc_symbol would cause:
+        function return type cannot be function  */
+      type = objfile_type (objfile)->nodebug_text_symbol;
       kind = GCC_C_SYMBOL_FUNCTION;
+      addr = gnu_ifunc_resolve_addr (target_gdbarch (), addr);
       break;
 
     case mst_data:
     }
 
   sym_type = convert_type (context, type);
-  addr = MSYMBOL_VALUE_ADDRESS (objfile, msym);
   decl = C_CTX (context)->c_ops->build_decl (C_CTX (context),
                                             MSYMBOL_NATURAL_NAME (msym),
                                             kind, sym_type, NULL, addr,
                                "gcc_symbol_address \"%s\": full symbol\n",
                                identifier);
          result = BLOCK_START (SYMBOL_BLOCK_VALUE (sym));
+         if (TYPE_GNU_IFUNC (SYMBOL_TYPE (sym)))
+           result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
          found = 1;
        }
       else
                                    "symbol\n",
                                    identifier);
              result = BMSYMBOL_VALUE_ADDRESS (msym);
+             if (MSYMBOL_TYPE (msym.minsym) == mst_text_gnu_ifunc)
+               result = gnu_ifunc_resolve_addr (target_gdbarch (), result);
              found = 1;
            }
        }
 
+2015-02-26  Jan Kratochvil  <jan.kratochvil@redhat.com>
+
+       * gdb.compile/compile-ifunc.c: New file.
+       * gdb.compile/compile-ifunc.exp: New file.
+
 2015-02-26  Antoine Tremblay  <antoine.tremblay@ericsson.com>
 
        * gdb.base/structs.exp: Check for correct struct on finish.
 
--- /dev/null
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2015 Free Software Foundation, Inc.
+
+   This program 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 of the License, or
+   (at your option) any later version.
+
+   This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <stdlib.h>
+
+typedef int (*final_t) (int arg);
+
+int
+final (int arg)
+{
+  return arg + 1;
+}
+
+asm (".type gnu_ifunc, %gnu_indirect_function");
+
+final_t
+gnu_ifunc (void)
+{
+  return final;
+}
+
+extern int gnu_ifunc_alias (int arg) __attribute__ ((alias ("gnu_ifunc")));
+
+static int resultvar;
+
+int
+main (void)
+{
+  if (gnu_ifunc_alias (10) != 11)
+    abort ();
+  return resultvar;
+}
 
--- /dev/null
+# Copyright 2015 Free Software Foundation, Inc.
+
+# This program 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 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+with_test_prefix "nodebug" {
+
+    if { [prepare_for_testing ${testfile}.exp "$testfile-nodebug" $srcfile {}] } {
+       return -1
+    }
+
+    if ![runto_main] {
+       return -1
+    }
+
+    if {[skip_compile_feature_tests]} {
+       untested "compile command not supported (could not find libcc1 shared library?)"
+       return -1
+    }
+
+    gdb_test_no_output "compile code resultvar = gnu_ifunc (10);"
+
+    gdb_test "p resultvar" " = 11"
+
+}
+
+with_test_prefix "debug" {
+
+    if { [prepare_for_testing ${testfile}.exp "$testfile-debug" $srcfile] } {
+       return -1
+    }
+
+    if ![runto_main] {
+       return -1
+    }
+
+    # gnu_ifunc (10): error: too many arguments to function 'gnu_ifunc'
+    gdb_test_no_output "compile code resultvar = gnu_ifunc_alias (10);"
+
+    gdb_test "p resultvar" " = 11"
+
+}