# Copyright (C) 2010-2021 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/>.

# This file is part of the GDB testsuite.
# It tests the Guile symbol table support.

load_lib gdb-guile.exp

standard_testfile scm-symtab.c scm-symtab-2.c

if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2] debug]} {
    return
}

# Skip all tests if Guile scripting is not enabled.
if { [skip_guile_tests] } { continue }

if ![gdb_guile_runto_main] {
    return
}

set debug_types [debug_types]

# Setup and get the symbol table.
set line_no [gdb_get_line_number "Block break here."]
gdb_breakpoint $line_no
gdb_continue_to_breakpoint "Block break here."
gdb_scm_test_silent_cmd "guile (define frame (selected-frame))" \
    "get frame"
gdb_scm_test_silent_cmd "guile (define sal (frame-sal frame))" \
    "get sal"
gdb_scm_test_silent_cmd "guile (define symtab (sal-symtab sal))" \
    "get symtab"
gdb_scm_test_silent_cmd "guile (define global-block (symtab-global-block symtab))" \
    "get global block"
gdb_scm_test_silent_cmd "guile (define static-block (symtab-static-block symtab))" \
    "get static block"

gdb_scm_test_silent_cmd "guile (define global-symbols (map symbol-name (block-symbols global-block)))" \
    "get global symbol names"
gdb_scm_test_silent_cmd "guile (define static-symbols (map symbol-name (block-symbols static-block)))" \
    "get static symbol names"
gdb_scm_test_silent_cmd "guile (define global-isymbols '()) (define static-isymbols '())" \
    "set up iterated symbol name lists"
# TODO: iterated symbols
gdb_scm_test_silent_cmd "step" "Step to the next line"
gdb_scm_test_silent_cmd "guile (define new-pc (sal-pc (frame-sal (selected-frame))))" \
    "get new pc"

# Test sal.
gdb_test "guile (print (sal-symtab sal))" \
    ".*gdb.guile/scm-symtab.c.*" "Test sal-symtab"
gdb_test "guile (print (sal-pc sal))" \
    "${decimal}" "test sal-pc"
gdb_test "guile (print (= (sal-last sal) (- new-pc 1)))" \
    "#t" "test sal-last"
gdb_test "guile (print (sal-line sal))" \
    "$line_no" "test sal-line"
gdb_test "guile (print (sal-valid? sal))" \
    "#t" "test sal-valid?"

# Test eq? on symtabs.
gdb_scm_test_silent_cmd "guile (define sal1 (frame-sal frame))" \
    "get sal1"
gdb_scm_test_silent_cmd "guile (define sal2 (frame-sal (frame-older frame)))" \
    "get sal2"
gdb_test "guile (print (eq? symtab (sal-symtab sal1)))" \
    "= #t" "test eq? of equal symtabs"
gdb_test "guile (print (eq? symtab (sal-symtab sal2)))" \
    "= #t" "test eq? of equal symtabs from different sals"
gdb_test "guile (print (eq? symtab (symbol-symtab (lookup-global-symbol \"func1\"))))" \
    "= #f" "test eq? of not-equal symtabs"

# Test symbol table.
gdb_test "guile (print (symtab-filename symtab))" \
    ".*gdb.guile/scm-symtab.c.*" "test symtab-filename"
gdb_test "guile (print (symtab-objfile symtab))" \
    "#<gdb:objfile .*scm-symtab>" "test symtab-objfile"
gdb_test "guile (print (symtab-fullname symtab))" \
    "testsuite/gdb.guile/scm-symtab.c.*" "test symtab-fullname"
gdb_test "guile (print (symtab-valid? symtab))" \
    "#t" "test symtab-valid?"
gdb_test "guile (print (->bool (member \"qq\" global-symbols)))" \
    "#t" "test qq in global symbols"
gdb_test "guile (print (->bool (member \"func\" global-symbols)))" \
    "#t" "test func in global symbols"
gdb_test "guile (print (->bool (member \"main\" global-symbols)))" \
    "#t" "test main in global symbols"
gdb_test "guile (print (->bool (member \"int\" static-symbols)))" \
    "#t" "test int in static symbols"
gdb_test "guile (print (->bool (member \"char\" static-symbols)))" \
    "#t" "test char in static symbols"
gdb_test_multiple \
    "guile (print (->bool (member \"simple_struct\" static-symbols)))" \
    "test simple_struct in static symbols" {
	-re -wrap "#t" {
	    pass $gdb_test_name
	}
	-re -wrap "#f" {
	    if { $debug_types } {
		# Xfail for PR gcc/90232.
		xfail $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }

# Test is_valid when the objfile is unloaded.  This must be the last
# test as it unloads the object file in GDB.
gdb_unload
gdb_test "guile (print (sal-valid? sal))" \
    "#f" "test sal-valid? after unloading"
gdb_test "guile (print (symtab-valid? symtab))" \
    "#f" "test symtab-valid? after unloading"

gdb_test_no_output "guile (set! sal #f)" \
    "test sal destructor"
gdb_test_no_output "guile (set! symtab #f)" \
    "test symtab destructor"
gdb_test_no_output "guile (gc)" "GC to trigger destructors"

# Start with a fresh gdb.
clean_restart ${testfile}

# Test find-pc-line.
# The following tests require execution.

if ![gdb_guile_runto_main] {
    return
}

runto [gdb_get_line_number "Break at func2 call site."]

gdb_scm_test_silent_cmd "guile (define line (sal-line (frame-sal (selected-frame))))" \
    "get line number of func2 call site"
gdb_test "guile (print (= (sal-line (find-pc-line (frame-pc (selected-frame)))) line))" \
    "#t" "test find-pc-line at func2 call site"

gdb_scm_test_silent_cmd "step" "step into func2"
gdb_scm_test_silent_cmd "up" "step out of func2"

gdb_test "guile (print (> (sal-line (find-pc-line (frame-pc (selected-frame)))) line))" \
    "#t" "test find-pc-line with resume address"
