# 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 mechanism
# exposing values to Python.

load_lib gdb-python.exp

standard_testfile py-symbol.c py-symbol-2.c

set opts { debug additional_flags=-DUSE_TWO_FILES }
if {[prepare_for_testing "failed to prepare" $testfile \
	 [list $srcfile $srcfile2] $opts]} {
    return -1
}

# Skip all tests if Python scripting is not enabled.
if { [skip_python_tests] } { continue }

set readnow_p [readnow]

# Check that we find all static symbols before the inferior has
# started, at which point some of the symtabs might not have been
# expanded.
gdb_test "python print (len (gdb.lookup_static_symbols ('rr')))" \
    "2" "print (len (gdb.lookup_static_symbols ('rr')))"

# Restart so we don't have expanded symtabs after the previous test.
clean_restart ${binfile}

# Test looking up a global symbol before we runto_main as this is the
# point where we don't have a current frame, and we don't want to
# require one.
gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1
gdb_test "python print (main_func.is_function)" "True" "test main_func.is_function"
gdb_test "python print (gdb.lookup_global_symbol(\"junk\"))" "None" "test lookup_global_symbol(\"junk\")"

gdb_test "python print (gdb.lookup_global_symbol('main').value())" "$hex .main." \
    "print value of main"

set qq_line [gdb_get_line_number "line of qq"]
gdb_test "python print (gdb.lookup_global_symbol('qq').line)" "$qq_line" \
    "print line number of qq"

gdb_test "python print (gdb.lookup_global_symbol('qq').value())" "72" \
    "print value of qq"

gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \
    "False" \
    "print whether qq needs a frame"

# Similarly, test looking up a static symbol before we runto_main.
set rr_line [gdb_get_line_number "line of rr"]
set rr_line_alt [gdb_get_line_number "line of other rr" py-symbol-2.c]
gdb_test "python print (gdb.lookup_global_symbol ('rr') is None)" "True" \
    "lookup_global_symbol for static var"

set cmd "python print (gdb.lookup_static_symbol ('rr').line)"
gdb_test_multiple $cmd "print line number of rr" {
    -re -wrap "$rr_line" {
	pass $gdb_test_name
    }
    -re -wrap "$rr_line_alt" {
	if { $readnow_p } {
	    setup_kfail "symtab/25857" *-*-*
	}
	fail $gdb_test_name
    }
}

set cmd "python print (gdb.lookup_static_symbol ('rr').value ())"
gdb_test_multiple $cmd "print value of rr" {
    -re -wrap "42" {
	pass $gdb_test_name
    }
    -re -wrap "99" {
	if { $readnow_p } {
	    setup_kfail "symtab/25857" *-*-*
	}
	fail $gdb_test_name
    }
}
    

gdb_test "python print (gdb.lookup_static_symbol ('rr').needs_frame)" \
    "False" \
    "print whether rr needs a frame"

gdb_test "python print (gdb.lookup_static_symbol ('nonexistent') is None)" \
    "True" "lookup_static_symbol for nonexistent var"

gdb_test "python print (gdb.lookup_static_symbol ('qq') is None)" \
    "True" "lookup_static_symbol for global var"

if ![runto_main] then {
    return 0
}

global hex decimal

gdb_breakpoint [gdb_get_line_number "Block break here."]
gdb_continue_to_breakpoint "Block break here."
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
gdb_py_test_silent_cmd "python block = frame.block()" "Get block" 0

# Test is_argument attribute.
gdb_py_test_silent_cmd "python arg = gdb.lookup_symbol(\"arg\")" "Get variable arg" 0
gdb_test "python print (arg\[0\].is_variable)" "False" "test arg.is_variable"
gdb_test "python print (arg\[0\].is_constant)" "False" "test arg.is_constant"
gdb_test "python print (arg\[0\].is_argument)" "True" "test arg.is_argument"
gdb_test "python print (arg\[0\].is_function)" "False" "test arg.is_function"

# Test is_function attribute.
gdb_py_test_silent_cmd "python func = block.function" "Get block function" 0
gdb_test "python print (func.is_variable)" "False" "test func.is_variable"
gdb_test "python print (func.is_constant)" "False" "test func.is_constant"
gdb_test "python print (func.is_argument)" "False" "test func.is_argument"
gdb_test "python print (func.is_function)" "True" "test func.is_function"

# Test attributes of func.
gdb_test "python print (func.name)" "func" "test func.name"
gdb_test "python print (func.print_name)" "func" "test func.print_name"
gdb_test "python print (func.linkage_name)" "func" "test func.linkage_name"
gdb_test "python print (func.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test func.addr_class"

# Stop in a second file and ensure we find its local static symbol.
gdb_breakpoint "function_in_other_file"
gdb_continue_to_breakpoint "function_in_other_file"
gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "99" \
    "print value of rr from other file"
gdb_test "python print (gdb.lookup_static_symbols ('rr')\[0\].value ())" "99" \
    "print value of gdb.lookup_static_symbols ('rr')\[0\], from the other file"
gdb_test "python print (gdb.lookup_static_symbols ('rr')\[1\].value ())" "42" \
    "print value of gdb.lookup_static_symbols ('rr')\[1\], from the other file"

# Now continue back to the first source file.
set linenum [gdb_get_line_number "Break at end."]
gdb_breakpoint "$srcfile:$linenum"
gdb_continue_to_breakpoint "Break at end for variable a" ".*Break at end.*"
gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0

# Check that we find the static sybol local to this file over the
# static symbol from the second source file.
gdb_test "python print (gdb.lookup_static_symbol ('rr').value ())" "42" \
    "print value of rr from main file"
gdb_test "python print (gdb.lookup_static_symbols ('rr')\[0\].value ())" "99" \
    "print value of gdb.lookup_static_symbols ('rr')\[0\], from the main file"
gdb_test "python print (gdb.lookup_static_symbols ('rr')\[1\].value ())" "42" \
    "print value of gdb.lookup_static_symbols ('rr')\[1\], from the main file"

# Test is_variable attribute.
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print (a\[0\].is_variable)" "True" "test a.is_variable"
gdb_test "python print (a\[0\].is_constant)" "False" "test a.is_constant"
gdb_test "python print (a\[0\].is_argument)" "False" "test a.is_argument"
gdb_test "python print (a\[0\].is_function)" "False" "test a.is_function"

# Test attributes of a.
gdb_test "python print (a\[0\].addr_class == gdb.SYMBOL_LOC_COMPUTED)" "True" "test a.addr_class"

gdb_test "python print (a\[0\].value())" \
    "symbol requires a frame to compute its value.*"\
    "try to print value of a without a frame"
gdb_test "python print (a\[0\].value(frame))" "0" \
    "print value of a"
gdb_test "python print (a\[0\].needs_frame)" "True" \
    "print whether a needs a frame"

# Test is_constant attribute
gdb_py_test_silent_cmd "python t = gdb.lookup_symbol(\"one\")" "Get constant t" 0
gdb_test "python print (t\[0\].is_variable)" "False" "test t.is_variable"
gdb_test "python print (t\[0\].is_constant)" "True" "test t.is_constant"
gdb_test "python print (t\[0\].is_argument)" "False" "test t.is_argument"
gdb_test "python print (t\[0\].is_function)" "False" "test t.is_function"

# Test attributes of t.
gdb_test "python print (t\[0\].addr_class == gdb.SYMBOL_LOC_CONST)" "True" "test t.addr_class"

# Test type attribute.
gdb_test "python print (t\[0\].type)" "enum tag" "get type"

# Test symtab attribute.
if { [is_remote host] } {
    set py_symbol_c [string_to_regexp $srcfile]
} else {
    set py_symbol_c [string_to_regexp ${srcdir}/${subdir}/${srcfile}]
}
gdb_test "python print (t\[0\].symtab)" "${py_symbol_c}" "get symtab"

# C++ tests
# Recompile binary.
lappend opts c++
if {[prepare_for_testing "failed to prepare" "${binfile}-cxx" \
	 [list $srcfile $srcfile2] $opts]} {
    return -1
}

gdb_test "python print (gdb.lookup_global_symbol ('(anonymous namespace)::anon') is None)" \
    "True" "anon is None"
gdb_test "python print (gdb.lookup_static_symbol ('(anonymous namespace)::anon').value ())" \
    "10" "print value of anon"

if ![runto_main] then {
    return 0
}

gdb_breakpoint [gdb_get_line_number "Break in class."]
gdb_continue_to_breakpoint "Break in class."

gdb_py_test_silent_cmd "python cplusframe = gdb.selected_frame()" "Get Frame at class" 0
gdb_py_test_silent_cmd "python cplusfunc = cplusframe.block().function" "Get function at class" 0

gdb_test "python print (cplusfunc.is_variable)" \
    "False" "Test cplusfunc.is_variable"
gdb_test "python print (cplusfunc.is_constant)" \
    "False" "Test cplusfunc.is_constant"
gdb_test "python print (cplusfunc.is_argument)" \
    "False" "Test cplusfunc.is_argument"
gdb_test "python print (cplusfunc.is_function)" \
    "True" "Test cplusfunc.is_function"

gdb_test "python print (cplusfunc.name)" "SimpleClass::valueofi().*" "test method.name"
gdb_test "python print (cplusfunc.print_name)" "SimpleClass::valueofi().*" "test method.print_name"
gdb_test "python print (cplusfunc.linkage_name)" "_ZN11SimpleClass8valueofiEv.*" "test method.linkage_name"
gdb_test "python print (cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test method.addr_class"

# Test is_valid when the objfile is unloaded.  This must be the last
# test as it unloads the object file in GDB.
# Start with a fresh gdb.
clean_restart ${binfile}
if ![runto_main] then {
    return 0
}

gdb_breakpoint [gdb_get_line_number "Break at end."]
gdb_continue_to_breakpoint "Break at end for symbol validity" ".*Break at end.*"
gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
gdb_test "python print (a\[0\].is_valid())" "True" "test symbol validity"
delete_breakpoints
gdb_unload
gdb_test "python print (a\[0\].is_valid())" "False" "test symbol non-validity"
gdb_test_no_output "python a = None" "test symbol destructor"

# Test gdb.Symbol domain categories
gdb_test "python print (gdb.SYMBOL_UNDEF_DOMAIN)" \
    "0" "test gdb.SYMBOL_UNDEF_DOMAIN"
gdb_test "python print (gdb.SYMBOL_VAR_DOMAIN)" \
    "1" "test gdb.SYMBOL_VAR_DOMAIN"
gdb_test "python print (gdb.SYMBOL_STRUCT_DOMAIN)" \
    "2" "test gdb.SYMBOL_STRUCT_DOMAIN"
gdb_test "python print (gdb.SYMBOL_MODULE_DOMAIN)" \
    "3" "test gdb.SYMBOL_MODULE_DOMAIN"
gdb_test "python print (gdb.SYMBOL_LABEL_DOMAIN)" \
    "4" "test gdb.SYMBOL_LABEL_DOMAIN"
gdb_test "python print (gdb.SYMBOL_COMMON_BLOCK_DOMAIN)" \
    "5" "test gdb.SYMBOL_COMMON_BLOCK_DOMAIN"

# Test gdb.Symbol address class categories
gdb_test "python print (gdb.SYMBOL_LOC_UNDEF)" \
    "0" "test gdb.SYMBOL_LOC_UNDEF"
gdb_test "python print (gdb.SYMBOL_LOC_CONST)" \
    "1" "test gdb.SYMBOL_LOC_CONST"
gdb_test "python print (gdb.SYMBOL_LOC_STATIC)" \
    "2" "test gdb.SYMBOL_LOC_STATIC"
gdb_test "python print (gdb.SYMBOL_LOC_REGISTER)" \
    "3" "test gdb.SYMBOL_LOC_REGISTER"
gdb_test "python print (gdb.SYMBOL_LOC_ARG)" \
    "4" "test gdb.SYMBOL_LOC_ARG"
gdb_test "python print (gdb.SYMBOL_LOC_REF_ARG)" \
    "5" "test gdb.SYMBOL_LOC_REF_ARG"
gdb_test "python print (gdb.SYMBOL_LOC_REGPARM_ADDR)" \
    "6" "test gdb.SYMBOL_LOC_REGPARM_ADDR"
gdb_test "python print (gdb.SYMBOL_LOC_LOCAL)" \
    "7" "test gdb.SYMBOL_LOC_LOCAL"
gdb_test "python print (gdb.SYMBOL_LOC_TYPEDEF)" \
    "8" "test gdb.SYMBOL_LOC_TYPEDEF"
gdb_test "python print (gdb.SYMBOL_LOC_LABEL)" \
    "9" "test gdb.SYMBOL_LOC_LABEL"
gdb_test "python print (gdb.SYMBOL_LOC_BLOCK)" \
    "10" "test gdb.SYMBOL_LOC_BLOCK"
gdb_test "python print (gdb.SYMBOL_LOC_CONST_BYTES)" \
    "11" "test gdb.SYMBOL_LOC_CONST_BYTES"
gdb_test "python print (gdb.SYMBOL_LOC_UNRESOLVED)" \
    "12" "test gdb.SYMBOL_LOC_UNRESOLVED"
gdb_test "python print (gdb.SYMBOL_LOC_OPTIMIZED_OUT)" \
    "13" "test gdb.SYMBOL_LOC_OPTIMIZED_OUT"
gdb_test "python print (gdb.SYMBOL_LOC_COMPUTED)" \
    "14" "test gdb.SYMBOL_LOC_COMPUTED"
gdb_test "python print (gdb.SYMBOL_LOC_COMMON_BLOCK)" \
    "15" "test gdb.SYMBOL_LOC_COMMON_BLOCK"
