# Copyright (C) 2009-2013 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/>.

if {[skip_shlib_tests]} {
    return 0
}

standard_testfile .c
set executable ${testfile}
set staticexecutable ${executable}-static
set staticbinfile [standard_output_file ${staticexecutable}]

set libfile "${testfile}-lib"
set libsrc ${libfile}.c
set lib_so [standard_output_file ${libfile}.so]
# $lib_o must not have {debug}, it would override the STT_GNU_IFUNC ELF markers.
set lib_o [standard_output_file ${libfile}.o]

# We need DWARF for the "final" function as we "step" into the function and GDB
# would step-over the "final" function if there would be no line number debug
# information (DWARF) available.
#
# We must not have DWARF for the "gnu_ifunc" function as DWARF has no way to
# express the STT_GNU_IFUNC type and it would be considered as a regular
# function due to DWARF by GDB.  In ELF gnu-ifunc is expressed by the
# STT_GNU_IFUNC type.
#
# Both functions need to be in the same shared library file but
# gdb_compile_shlib has no way to specify source-specific compilation options.
#
# Therefore $libfile contains only the STT_GNU_IFUNC function with no DWARF
# referencing all the other parts from the main executable with DWARF.

set lib_opts {}
set exec_opts [list debug shlib=$lib_so]

if [get_compiler_info] {
    return -1
}

if { [gdb_compile_shlib ${srcdir}/${subdir}/$libsrc $lib_so $lib_opts] != ""
     || [gdb_compile ${srcdir}/${subdir}/$srcfile $binfile executable $exec_opts] != ""} {
    untested "Could not compile dynamic executable $binfile."
    return -1
}

# Start with a fresh gdb.

clean_restart $executable
gdb_load_shlibs ${lib_so}

if ![runto_main] then {
    fail "Can't run to main"
    return 1
}

# The "if" condition is artifical to test regression of a former patch.
gdb_breakpoint "[gdb_get_line_number "break-at-nextcall"] if i && gnu_ifunc (i) != 42"

gdb_breakpoint [gdb_get_line_number "break-at-call"]
gdb_continue_to_breakpoint "break-at-call" ".*break-at-call.*"

# Test GDB will automatically indirect the call.

gdb_test "p gnu_ifunc (3)" " = 4"

# Test GDB will skip the gnu_ifunc resolver on first call.

gdb_test "step" "\r\nfinal .*"

# Test GDB will not break before the final chosen implementation.

# Also test a former patch regression:
# Continuing.
# Error in testing breakpoint condition:
# Attempt to take address of value not located in memory.
# 
# Breakpoint 2, main () at ./gdb.base/gnu-ifunc.c:33

gdb_test "continue" "Continuing.\r\n\r\nBreakpoint .* (at|in) .*break-at-nextcall.*" \
	 "continue to break-at-nextcall"

gdb_breakpoint "gnu_ifunc"

gdb_continue_to_breakpoint "nextcall gnu_ifunc"

gdb_test "frame" "#0 +(0x\[0-9a-f\]+ in +)?final \\(.*" "nextcall gnu_ifunc skipped"


# Check any commands not doing an inferior call access the address of the
# STT_GNU_IFUNC resolver, not the target function.

if {[istarget powerpc64-*] && [is_lp64_target]} {
    # With only minimal symbols GDB provides the function descriptors.  With
    # full debug info the function code would be displayed.
    set func_prefix {\.}
} else {
    set func_prefix {}
}

gdb_test "p gnu_ifunc" " = {<text gnu-indirect-function variable, no debug info>} 0x\[0-9a-f\]+ <${func_prefix}gnu_ifunc>" "p gnu_ifunc executing"
gdb_test "info sym gnu_ifunc" "gnu_ifunc in section .*" "info sym gnu_ifunc executing"

set test "info addr gnu_ifunc"
gdb_test_multiple $test $test {
    -re "Symbol \"gnu_ifunc\" is at (0x\[0-9a-f\]+) in .*$gdb_prompt $" {
	pass $test
    }
}
gdb_test "info sym $expect_out(1,string)" "gnu_ifunc in section .*" "info sym <gnu_ifunc-address>"


# Test statically linked ifunc resolving during inferior start.
# https://bugzilla.redhat.com/show_bug.cgi?id=624967

# Compile $staticbinfile separately as it may exit on error (ld/12595).

if { [gdb_compile ${srcdir}/${subdir}/$libsrc $lib_o object {}] != ""
     || [gdb_compile "${srcdir}/${subdir}/$srcfile $lib_o" $staticbinfile executable {debug}] != "" } {
    untested "Could not compile static executable $staticbinfile."
    return -1
}

clean_restart $staticexecutable

gdb_breakpoint "gnu_ifunc"
gdb_breakpoint "main"
gdb_run_cmd
gdb_test "" "Breakpoint \[0-9\]*, main .*" "static gnu_ifunc"
