OSDN Git Service

2012-01-16 Pedro Alves <palves@redhat.com>
[pf3gnuchains/pf3gnuchains4x.git] / gdb / testsuite / gdb.python / py-symbol.exp
1 # Copyright (C) 2010-2012 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
19 load_lib gdb-python.exp
20
21 set testfile "py-symbol"
22 set srcfile ${testfile}.c
23 set binfile ${objdir}/${subdir}/${testfile}
24 if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
25     untested "Couldn't compile ${srcfile}"
26     return -1
27 }
28
29 # Start with a fresh gdb.
30 gdb_exit
31 gdb_start
32 gdb_reinitialize_dir $srcdir/$subdir
33 gdb_load ${binfile}
34
35 # Skip all tests if Python scripting is not enabled.
36 if { [skip_python_tests] } { continue }
37
38 # Test looking up a global symbol before we runto_main as this is the
39 # point where we don't have a current frame, and we don't want to
40 # require one.
41 gdb_py_test_silent_cmd "python main_func = gdb.lookup_global_symbol(\"main\")" "Lookup main" 1
42 gdb_test "python print main_func.is_function" "True" "Test main_func.is_function"
43 gdb_test "python print gdb.lookup_global_symbol(\"junk\")" "None" "Test lookup_global_symbol(\"junk\")"
44
45 if ![runto_main] then {
46     fail "Can't run to main"
47     return 0
48 }
49
50 global hex decimal
51
52 gdb_breakpoint [gdb_get_line_number "Block break here."]
53 gdb_continue_to_breakpoint "Block break here."
54 gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
55 gdb_py_test_silent_cmd "python block = frame.block()" "Get block" 0
56
57 # Test is_argument attribute.
58 gdb_py_test_silent_cmd "python arg = gdb.lookup_symbol(\"arg\")" "Get variable a" 0
59 gdb_test "python print arg\[0\].is_variable" "False" "Test arg.is_variable"
60 gdb_test "python print arg\[0\].is_constant" "False" "Test arg.is_constant"
61 gdb_test "python print arg\[0\].is_argument" "True" "Test arg.is_argument"
62 gdb_test "python print arg\[0\].is_function" "False" "Test arg.is_function"
63
64 # Test is_function attribute.
65 gdb_py_test_silent_cmd "python func = frame.block().function" "Get block" 0
66 gdb_test "python print func.is_variable" "False" "Test func.is_variable"
67 gdb_test "python print func.is_constant" "False" "Test func.is_constant"
68 gdb_test "python print func.is_argument" "False" "Test func.is_argument"
69 gdb_test "python print func.is_function" "True" "Test func.is_function"
70 gdb_test "python print func.name" "func" "Test func.name"
71 gdb_test "python print func.print_name" "func" "Test func.print_name"
72 gdb_test "python print func.linkage_name" "func" "Test func.linkage_name"
73 gdb_test "python print func.addr_class == gdb.SYMBOL_LOC_BLOCK" "True" "Test func.addr_class"
74
75 gdb_breakpoint [gdb_get_line_number "Break at end."]
76 gdb_continue_to_breakpoint "Break at end."
77 gdb_py_test_silent_cmd "python frame = gdb.selected_frame()" "Get Frame" 0
78
79 # Test is_variable attribute.
80 gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
81 gdb_test "python print a\[0\].is_variable" "True" "Test a.is_variable"
82 gdb_test "python print a\[0\].is_constant" "False" "Test a.is_constant"
83 gdb_test "python print a\[0\].is_argument" "False" "Test a.is_argument"
84 gdb_test "python print a\[0\].is_function" "False" "Test a.is_function"
85 gdb_test "python print a\[0\].addr_class == gdb.SYMBOL_LOC_COMPUTED" "True" "Test a.addr_class"
86
87 # Test is_constant attribute
88 gdb_py_test_silent_cmd "python t = gdb.lookup_symbol(\"one\")" "Get variable a" 0
89 gdb_test "python print t\[0\].is_variable" "False" "Test t.is_variable"
90 gdb_test "python print t\[0\].is_constant" "True" "Test t.is_constant"
91 gdb_test "python print t\[0\].is_argument" "False" "Test t.is_argument"
92 gdb_test "python print t\[0\].is_function" "False" "Test t.is_function"
93 gdb_test "python print t\[0\].addr_class == gdb.SYMBOL_LOC_CONST" "True" "Test t.addr_class"
94
95 # Test type attribute.
96 gdb_test "python print t\[0\].type" "enum tag" "Get type"
97
98 # Test symtab attribute.
99 gdb_test "python print t\[0\].symtab" "gdb.python/py-symbol.c.*" "Get symtab"
100
101 # C++ tests
102 # Recompile binary.
103  if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}-cxx" executable "debug c++"] != "" } {
104      untested "Couldn't compile ${srcfile} in c++ mode"
105      return -1
106  }
107
108 # Start with a fresh gdb.
109 gdb_exit
110 gdb_start
111 gdb_reinitialize_dir $srcdir/$subdir
112 gdb_load ${binfile}-cxx
113
114 if ![runto_main] then {
115     fail "Can't run to main"
116     return 0
117 }
118
119 gdb_breakpoint [gdb_get_line_number "Break in class."]
120 gdb_continue_to_breakpoint "Break in class."
121
122 gdb_py_test_silent_cmd "python cplusframe = gdb.selected_frame()" "Get Frame" 0
123 gdb_py_test_silent_cmd "python cplusfunc = cplusframe.block().function" "Get block" 0
124 gdb_test "python print cplusfunc.is_variable" "False" "Test func.is_variable"
125 gdb_test "python print cplusfunc.is_constant" "False" "Test func.is_constant"
126 gdb_test "python print cplusfunc.is_argument" "False" "Test func.is_argument"
127 gdb_test "python print cplusfunc.is_function" "True" "Test func.is_function"
128 gdb_test "python print cplusfunc.name" "SimpleClass::valueofi().*" "Test func.name"
129 gdb_test "python print cplusfunc.print_name" "SimpleClass::valueofi().*" "Test func.print_name"
130 gdb_test "python print cplusfunc.linkage_name" "SimpleClass::valueofi().*" "Test func.linkage_name"
131 gdb_test "python print cplusfunc.addr_class == gdb.SYMBOL_LOC_BLOCK" "True" "Test func.addr_class"
132
133 # Test is_valid when the objfile is unloaded.  This must be the last
134 # test as it unloads the object file in GDB.
135 # Start with a fresh gdb.
136 clean_restart ${testfile}
137 if ![runto_main] then {
138     fail "Cannot run to main."
139     return 0
140 }
141 gdb_breakpoint [gdb_get_line_number "Break at end."]
142 gdb_continue_to_breakpoint "Break at end."
143 gdb_py_test_silent_cmd "python a = gdb.lookup_symbol(\'a\')" "Get variable a" 0
144 gdb_test "python print a\[0\].is_valid()" "True" "Test symbol validity"
145 delete_breakpoints
146 gdb_unload
147 gdb_test "python print a\[0\].is_valid()" "False" "Test symbol validity"