# Copyright 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/>.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2.
if {![dwarf2_support]} {
    return 0
}

standard_testfile main.c

if { [prepare_for_testing "${testfile}.exp" "${testfile}" \
	  [list ${srcfile}]] } {
    return -1
}

# Add a .gdb_index section to PROGRAM.
# PROGRAM is assumed to be the output of standard_output_file.
# Returns the path of the program or "" if there is a failure.
# If there is a failure it will have already been logged.

proc add_gdb_index { program } {
    set index_file ${program}.gdb-index
    verbose -log "index_file: ${index_file}"
    remote_file host delete ${index_file}
    gdb_test_no_output "save gdb-index [file dirname ${index_file}]" \
	"save gdb-index for file [file tail ${program}]"

    # No point in continuing if generating the index failed.
    # N.B.: There are times when gdb won't create an index, and it's not a
    # failure.  However, in our case we need an index.  So if you find one
    # not being generated, you'll either have to tweak the .c file or maybe
    # add a flag to force an index to be generated.
    if { [remote_file host exists ${index_file}] } {
	pass "gdb-index file created"
    } else {
	fail "gdb-index file created"
	return ""
    }

    set program_with_index ${program}.with-index
    if {[run_on_host "objcopy" [gdb_find_objcopy] "--remove-section .gdb_index --add-section .gdb_index=$index_file --set-section-flags .gdb_index=readonly ${program} ${program_with_index}"]} {
	return ""
    }
    return ${program_with_index}
}

# Build a copy of the program with .gdb_index.
# But only if the toolchain didn't already create one: gdb doesn't support
# building an index from a program already using one.

set test "check if index present"
gdb_test_multiple "mt print objfiles ${testfile}" $test {
    -re "gdb_index.*${gdb_prompt} $" {
	set binfile_with_index $binfile
    }
    -re "Psymtabs.*${gdb_prompt} $" {
	set binfile_with_index [add_gdb_index $binfile]
	if { ${binfile_with_index} == "" } {
	    return -1
	}
    }
}

# Ok, we have a copy of $binfile with .gdb_index.
# Restart gdb and verify the index was used.

clean_restart ${binfile_with_index}
gdb_test "mt print objfiles ${testfile}" \
    "gdb_index.*" \
    ".gdb_index used"

# Make gdb re-read symbols and see if .gdb_index still gets used.
# symtab/15885

# There is gdb_touch_execfile, but it doesn't handle remote hosts.
# Is touch portable enough?
# First make sure enough time has passed, file mtime resolution is seconds.
gdb_test_no_output "shell sleep 1"
if {[run_on_host "touch binary" touch ${binfile_with_index}]} {
    return -1
}

if ![runto_main] {
    return -1
}
gdb_test "mt print objfiles ${testfile}" \
    "gdb_index.*" \
    ".gdb_index used after symbol reloading"
