# 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
}

set testfile "gnu-ifunc"
set executable ${testfile}
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${executable}
set staticexecutable ${executable}-static
set staticbinfile ${objdir}/${subdir}/${staticexecutable}

set libfile "${testfile}-lib"
set libsrc ${libfile}.c
set lib_so ${objdir}/${subdir}/${libfile}.so
# $lib_o must not have {debug}, it would override the STT_GNU_IFUNC ELF markers.
set lib_o ${objdir}/${subdir}/${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"
