# Copyright (C) 2009-2012 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"
