1# Copyright (C) 2010-2017 Free Software Foundation, Inc. 2 3# This program is free software; you can redistribute it and/or modify 4# it under the terms of the GNU General Public License as published by 5# the Free Software Foundation; either version 3 of the License, or 6# (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program. If not, see <http://www.gnu.org/licenses/>. 15 16# This file is part of the GDB testsuite. It tests the mechanism 17# exposing values to Python. 18 19load_lib gdb-python.exp 20 21standard_testfile 22 23if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} { 24 return -1 25} 26 27# Skip all tests if Python scripting is not enabled. 28if { [skip_python_tests] } { continue } 29 30# Test looking up a global symbol before we runto_main as this is the 31# point where we don't have a current frame, and we don't want to 32# require one. 33gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1 34gdb_test "python print (main_func.is_function)" "True" "test main_func.is_function" 35gdb_test "python print (gdb.lookup_global_symbol(\"junk\"))" "None" "test lookup_global_symbol(\"junk\")" 36 37gdb_test "python print (gdb.lookup_global_symbol('main').value())" "$hex .main." \ 38 "print value of main" 39 40set qq_line [gdb_get_line_number "line of qq"] 41gdb_test "python print (gdb.lookup_global_symbol('qq').line)" "$qq_line" \ 42 "print line number of qq" 43 44gdb_test "python print (gdb.lookup_global_symbol('qq').value())" "72" \ 45 "print value of qq" 46 47gdb_test "python print (gdb.lookup_global_symbol('qq').needs_frame)" \ 48 "False" \ 49 "print whether qq needs a frame" 50 51 52if ![runto_main] then { 53 fail "can't run to main" 54 return 0 55} 56 57global hex decimal 58 59gdb_breakpoint [gdb_get_line_number "Block break here."] 60gdb_continue_to_breakpoint "Block break here." 61gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0 62gdb_py_test_silent_cmd "python block = frame.block()" "Get block" 0 63 64# Test is_argument attribute. 65gdb_py_test_silent_cmd "python arg = gdb.lookup_symbol(\"arg\")" "Get variable arg" 0 66gdb_test "python print (arg\[0\].is_variable)" "False" "test arg.is_variable" 67gdb_test "python print (arg\[0\].is_constant)" "False" "test arg.is_constant" 68gdb_test "python print (arg\[0\].is_argument)" "True" "test arg.is_argument" 69gdb_test "python print (arg\[0\].is_function)" "False" "test arg.is_function" 70 71# Test is_function attribute. 72gdb_py_test_silent_cmd "python func = block.function" "Get block function" 0 73gdb_test "python print (func.is_variable)" "False" "test func.is_variable" 74gdb_test "python print (func.is_constant)" "False" "test func.is_constant" 75gdb_test "python print (func.is_argument)" "False" "test func.is_argument" 76gdb_test "python print (func.is_function)" "True" "test func.is_function" 77 78# Test attributes of func. 79gdb_test "python print (func.name)" "func" "test func.name" 80gdb_test "python print (func.print_name)" "func" "test func.print_name" 81gdb_test "python print (func.linkage_name)" "func" "test func.linkage_name" 82gdb_test "python print (func.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test func.addr_class" 83 84gdb_breakpoint [gdb_get_line_number "Break at end."] 85gdb_continue_to_breakpoint "Break at end for variable a" ".*Break at end.*" 86gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0 87 88# Test is_variable attribute. 89gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0 90gdb_test "python print (a\[0\].is_variable)" "True" "test a.is_variable" 91gdb_test "python print (a\[0\].is_constant)" "False" "test a.is_constant" 92gdb_test "python print (a\[0\].is_argument)" "False" "test a.is_argument" 93gdb_test "python print (a\[0\].is_function)" "False" "test a.is_function" 94 95# Test attributes of a. 96gdb_test "python print (a\[0\].addr_class == gdb.SYMBOL_LOC_COMPUTED)" "True" "test a.addr_class" 97 98gdb_test "python print (a\[0\].value())" \ 99 "symbol requires a frame to compute its value.*"\ 100 "try to print value of a without a frame" 101gdb_test "python print (a\[0\].value(frame))" "0" \ 102 "print value of a" 103gdb_test "python print (a\[0\].needs_frame)" "True" \ 104 "print whether a needs a frame" 105 106# Test is_constant attribute 107gdb_py_test_silent_cmd "python t = gdb.lookup_symbol(\"one\")" "Get constant t" 0 108gdb_test "python print (t\[0\].is_variable)" "False" "test t.is_variable" 109gdb_test "python print (t\[0\].is_constant)" "True" "test t.is_constant" 110gdb_test "python print (t\[0\].is_argument)" "False" "test t.is_argument" 111gdb_test "python print (t\[0\].is_function)" "False" "test t.is_function" 112 113# Test attributes of t. 114gdb_test "python print (t\[0\].addr_class == gdb.SYMBOL_LOC_CONST)" "True" "test t.addr_class" 115 116# Test type attribute. 117gdb_test "python print (t\[0\].type)" "enum tag" "get type" 118 119# Test symtab attribute. 120if { [is_remote host] } { 121 set py_symbol_c [string_to_regexp $srcfile] 122} else { 123 set py_symbol_c [string_to_regexp ${srcdir}/${subdir}/${srcfile}] 124} 125gdb_test "python print (t\[0\].symtab)" "${py_symbol_c}" "get symtab" 126 127# C++ tests 128# Recompile binary. 129if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" executable "debug c++"] != "" } { 130 untested "failed to compile in C++ mode" 131 return -1 132} 133 134# Start with a fresh gdb. 135gdb_exit 136gdb_start 137gdb_reinitialize_dir $srcdir/$subdir 138gdb_load ${binfile}-cxx 139 140if ![runto_main] then { 141 fail "can't run to main" 142 return 0 143} 144 145gdb_breakpoint [gdb_get_line_number "Break in class."] 146gdb_continue_to_breakpoint "Break in class." 147 148gdb_py_test_silent_cmd "python cplusframe = gdb.selected_frame()" "Get Frame at class" 0 149gdb_py_test_silent_cmd "python cplusfunc = cplusframe.block().function" "Get function at class" 0 150 151gdb_test "python print (cplusfunc.is_variable)" \ 152 "False" "Test cplusfunc.is_variable" 153gdb_test "python print (cplusfunc.is_constant)" \ 154 "False" "Test cplusfunc.is_constant" 155gdb_test "python print (cplusfunc.is_argument)" \ 156 "False" "Test cplusfunc.is_argument" 157gdb_test "python print (cplusfunc.is_function)" \ 158 "True" "Test cplusfunc.is_function" 159 160gdb_test "python print (cplusfunc.name)" "SimpleClass::valueofi().*" "test method.name" 161gdb_test "python print (cplusfunc.print_name)" "SimpleClass::valueofi().*" "test method.print_name" 162gdb_test "python print (cplusfunc.linkage_name)" "SimpleClass::valueofi().*" "test method.linkage_name" 163gdb_test "python print (cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK)" "True" "test method.addr_class" 164 165# Test is_valid when the objfile is unloaded. This must be the last 166# test as it unloads the object file in GDB. 167# Start with a fresh gdb. 168clean_restart ${testfile} 169if ![runto_main] then { 170 fail "cannot run to main." 171 return 0 172} 173 174gdb_breakpoint [gdb_get_line_number "Break at end."] 175gdb_continue_to_breakpoint "Break at end for symbol validity" ".*Break at end.*" 176gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0 177gdb_test "python print (a\[0\].is_valid())" "True" "test symbol validity" 178delete_breakpoints 179gdb_unload 180gdb_test "python print (a\[0\].is_valid())" "False" "test symbol non-validity" 181gdb_test_no_output "python a = None" "test symbol destructor" 182