1# Copyright 2014-2020 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 16standard_testfile .c compile-shlib.c compile-constvar.S compile-nodebug.c 17 18get_compiler_info 19set options {} 20if [test_compiler_info gcc*] { 21 lappend options additional_flags=-g3 22} 23 24if { ![istarget x86_64-*-* ] || ![is_lp64_target] } { 25 verbose "Skipping x86_64 LOC_CONST test." 26 set srcfile3 "" 27} 28 29set srcfilesoptions [list ${srcfile} ${options}] 30if { $srcfile3 != "" } { 31 lappend srcfilesoptions $srcfile3 ${options} 32} 33lappend srcfilesoptions $srcfile4 "nodebug" 34if { [eval build_executable_from_specs ${testfile}.exp $testfile {$options} ${srcfilesoptions}] } { 35 return -1 36} 37 38clean_restart ${testfile} 39 40# 41# Test command without an running inferior. 42# 43gdb_test "compile code int i=2;" \ 44 "The program must be running for the compile command to work.*" \ 45 "test compile code command without running inferior" 46 47gdb_test "compile int i=2;" \ 48 "The program must be running for the compile command to work.*" \ 49 "test compile command without running inferior" 50 51gdb_test "compile file -r ${srcdir}/${subdir}/${testfile}-mod.c" \ 52 "The program must be running for the compile command to work.*" \ 53 "test compile file command without running inferior" 54 55if ![runto_main] { 56 return -1 57} 58 59if {[skip_compile_feature_tests]} { 60 untested "compile command not supported (could not find libcc1 shared library?)" 61 return -1 62} 63 64# 65# Test delimiter for code, and arguments. 66# 67 68gdb_test_no_output "compile -- f = 10" \ 69 "test abbreviations and code delimiter" 70 71gdb_test "compile f = 10;" ".*= 10;: No such file.*" \ 72 "Test abbreviations and code collision" 73 74gdb_test_no_output "compile -r -- void _gdb_expr(){int i = 5;}" \ 75 "test delimiter with -r" 76 77gdb_test_no_output "compile -raw -- void _gdb_expr(){int i = 5;}" \ 78 "test delimiter with -raw" 79 80gdb_test "compile -- -r void _gdb_expr(){int i = 5;}" \ 81 ".* error: 'r' undeclared \\(first use in this function\\).*" \ 82 "test delimiter with -r after it" 83 84gdb_test "p globalvar" " = 10" "expect 10" 85 86gdb_test_no_output "compile code globalvar = 11" \ 87 "set variable without trailing semicolon" 88gdb_test "p globalvar" " = 11" "check variable without trailing semicolon" 89 90gdb_test_no_output "compile code globalvar = SOME_MACRO;" \ 91 "set variable from macro" 92gdb_test "p globalvar" " = 23" "expect 23" 93 94gdb_test_no_output "compile code globalvar = ARG_MACRO(0, 0);" \ 95 "set variable from function-like macro" 96gdb_test "p globalvar" " = -1" "expect -1" 97 98gdb_test_no_output "compile code globalvar = 42;" "set variable" 99gdb_test "p globalvar" " = 42" "expect 42" 100 101gdb_test_no_output "compile code globalvar *= 2;" "modify variable" 102gdb_test "p globalvar" " = 84" "expect 84" 103 104gdb_test_multiple "compile code" "compile code multiline 1" { -re "\r\n>$" {} } 105gdb_test_multiple "globalvar = 10;" "compile code multiline 2" { -re "\r\n>$" {} } 106gdb_test_multiple "globalvar *= 2;" "compile code multiline 3" { -re "\r\n>$" {} } 107gdb_test_no_output "end" "compile code multiline 4" 108gdb_test "p globalvar" " = 20" "expect 20" 109 110gdb_test_no_output "compile file -r ${srcdir}/${subdir}/${testfile}-mod.c" \ 111 "use external source file" 112gdb_test "p globalvar" " = 7" "expect 7" 113 114gdb_test_no_output "compile code func_static (2);" "call static function" 115gdb_test "p globalvar" " = 9" "expect 9" 116gdb_test_no_output "compile code func_global (1);" "call global function" 117gdb_test "p globalvar" " = 8" "expect 8" 118 119gdb_test_no_output \ 120 "compile code globalvar = (sizeof (ulonger) == sizeof (long))" \ 121 "compute size of ulonger" 122gdb_test "p globalvar" " = 1" "check size of ulonger" 123gdb_test_no_output \ 124 "compile code globalvar = (sizeof (longer) == sizeof (long))" \ 125 "compute size of longer" 126gdb_test "p globalvar" " = 1" "check size of longer" 127gdb_test_no_output "compile code globalvar = MINUS_1" 128gdb_test "p globalvar" " = -1" "check MINUS_1" 129 130gdb_test_no_output "compile code globalvar = static_local" 131gdb_test "p globalvar" " = 77000" "check static_local" 132 133gdb_test_no_output "compile code static int staticvar = 5; intptr = &staticvar" \ 134 "do not keep jit in memory" 135gdb_test "p *intptr" "Cannot access memory at address 0x\[0-9a-f\]+" "expect no 5" 136 137gdb_test "compile code func_doesnotexist ();" "warning: Could not find symbol \"func_doesnotexist\" for .*" 138 139gdb_test "compile code *(volatile int *) 0 = 0;" \ 140 "The program being debugged was signaled while in a function called from GDB\\.\r\nGDB remains in the frame where the signal was received\\.\r\n.*" \ 141 "compile code segfault first" 142gdb_test "bt" [multi_line \ 143 "#0 ($hex in )?_gdb_expr .*" \ 144 "#1 <function called from gdb>" \ 145 "#2 .*" \ 146 ] 147 148set test "p/x \$pc" 149set infcall_pc 0 150gdb_test_multiple $test $test { 151 -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" { 152 set infcall_pc $expect_out(1,string) 153 pass $test 154 } 155} 156 157gdb_test "info sym $infcall_pc" "\r\n_gdb_expr .*" "info sym found" 158gdb_test "return" "\r\n#0 main .*" "return" \ 159 "Make _gdb_expr return now\\? \\(y or n\\) " "y" 160gdb_test "info sym $infcall_pc" "\r\nNo symbol matches .*" "info sym not found" 161 162gdb_test_no_output "set unwindonsignal on" 163gdb_test "compile code *(volatile int *) 0 = 0;" \ 164 "The program being debugged was signaled while in a function called from GDB\\.\r\nGDB has restored the context to what it was before the call\\.\r\n.*" \ 165 "compile code segfault second" 166 167gdb_breakpoint [gdb_get_line_number "break-here"] 168gdb_continue_to_breakpoint "break-here" ".* break-here .*" 169 170gdb_test "p localvar" " = 50" "expect localvar 50" 171 172gdb_test_no_output "compile code localvar = 12;" "set localvar" 173gdb_test "p localvar" " = 12" "expect 12" 174 175gdb_test_no_output "compile code localvar *= 2;" "modify localvar" 176gdb_test "p localvar" " = 24" "expect 24" 177 178gdb_test_no_output "compile code localvar = shadowed" \ 179 "test shadowing" 180gdb_test "p localvar" " = 52" "expect 52" 181 182gdb_test_no_output "compile code localvar = externed" 183gdb_test "p localvar" " = 7" "test extern in inner scope" 184 185gdb_test_no_output "compile code vla\[2\] = 7" 186gdb_test "p vla\[2\]" " = 7" 187gdb_test_no_output \ 188 "compile code localvar = (sizeof (vla) == bound * sizeof (vla\[0\]))" 189gdb_test "p localvar" " = 1" 190 191# 192# Test setting fields and also many different types. 193# 194 195set skip_struct_object 0 196set test "compile code struct_object.selffield = &struct_object" 197gdb_test_multiple $test $test { 198 -re "^$test\r\n$gdb_prompt $" { 199 pass "$test" 200 } 201 -re " error: Unexpected type id from GCC, check you use recent enough GCC\\.\r\n.*\r\n$gdb_prompt $" { 202 xfail "$test (PR compile/18202)" 203 204 # All following tests will break with the same error message. 205 set skip_struct_object 1 206 } 207} 208 209if {$skip_struct_object} { 210 untested "all struct_object tests" 211} else { 212 gdb_test "print struct_object.selffield == &struct_object" " = 1" 213 214 gdb_test_no_output "compile code struct_object.charfield = 1" 215 gdb_test "print struct_object.charfield" " = 1 '\\\\001'" 216 gdb_test_no_output "compile code struct_object.ucharfield = 1" 217 gdb_test "print struct_object.ucharfield" " = 1 '\\\\001'" 218 219 foreach {field value} { 220 shortfield -5 221 ushortfield 5 222 intfield -7 223 uintfield 7 224 bitfield 2 225 longfield -9 226 ulongfield 9 227 enumfield ONE 228 floatfield 1 229 doublefield 2 230 } { 231 gdb_test_no_output "compile code struct_object.$field = $value" 232 gdb_test "print struct_object.$field" " = $value" 233 } 234 235 gdb_test_no_output "compile code struct_object.arrayfield\[2\] = 7" 236 gdb_test "print struct_object.arrayfield" \ 237 " = \\{0, 0, 7, 0, 0\\}" 238 239 gdb_test_no_output "compile code struct_object.complexfield = 7 + 5i" 240 gdb_test "print struct_object.complexfield" " = 7 \\+ 5i" 241 242 gdb_test_no_output "compile code struct_object.boolfield = 1" 243 gdb_test "print struct_object.boolfield" " = true" 244 245 gdb_test_no_output "compile code struct_object.vectorfield\[2\] = 7" 246 gdb_test "print struct_object.vectorfield" \ 247 " = \\{0, 0, 7, 0\\}" 248 249} 250 251gdb_test_no_output "compile code union_object.typedeffield = 7" 252gdb_test "print union_object.typedeffield" " = 7" 253gdb_test "print union_object.intfield" " = 7" 254 255 256# LOC_UNRESOLVED tests. 257 258gdb_test "print unresolved" " = 20" 259gdb_test_no_output "compile code globalvar = unresolved;" 260gdb_test "print globalvar" " = 20" "print unresolved value" 261 262# Test shadowing with global and static variables. 263 264gdb_test_no_output "compile code globalshadow += 1;" 265gdb_test "print globalshadow" " = 101" 266gdb_test_no_output "compile code extern int globalshadow; globalshadow += 5;" 267gdb_test "print 'compile.c'::globalshadow" " = 15" 268gdb_test "print globalshadow" " = 101" "print globalshadow second time" 269gdb_test_no_output "compile code staticshadow += 2;" 270gdb_test "print staticshadow" " = 202" 271# "extern int staticshadow;" cannot access static variable. 272 273# Raw code cannot refer to locals. 274# As it references global variable we need the #pragma. 275# For #pragma we need multiline input. 276gdb_test_multiple "compile code -r" "compile code -r multiline 1" { -re "\r\n>$" {} } 277gdb_test_multiple "#pragma GCC user_expression" "compile code -r multiline 2" { -re "\r\n>$" {} } 278gdb_test_multiple "void _gdb_expr(void) { globalshadow = 77000; }" "compile code -r multiline 3" { -re "\r\n>$" {} } 279gdb_test_no_output "end" "compile code -r multiline 4" 280gdb_test "print 'compile.c'::globalshadow" " = 77000" \ 281 "check globalshadow with -r" 282 283# Test GOT vs. resolving jit function pointers. 284 285gdb_test_no_output "compile -raw -- int func(){return 21;} void _gdb_expr(){ void abort (void); int (*funcp)()=func; if (funcp()!=21) abort(); }" \ 286 "pointer to jit function" 287 288# 289# Test the case where the registers structure would not normally have 290# any fields. 291# 292 293gdb_breakpoint [gdb_get_line_number "no_args_or_locals breakpoint"] 294gdb_continue_to_breakpoint "no_args_or_locals" 295 296gdb_test_no_output "compile code globalvar = 77;" "set variable to 77" 297gdb_test "p globalvar" " = 77" "expect 77" 298 299 300# Test reference to minimal_symbol, not (full) symbol. 301 302gdb_test "compile code globalvar = func_nodebug (75);" \ 303 "warning: function has unknown return type; assuming int" \ 304 "call func_nodebug" 305gdb_test "p globalvar" " = -75" "expect -75" 306gdb_test \ 307 "compile code int (*funcp) (int) = func_nodebug; globalvar = funcp (76);" \ 308 "warning: function has unknown return type; assuming int" \ 309 "call func_nodebug indirectly" 310gdb_test "p globalvar" " = -76" "expect -76" 311 312 313# Test compiled module memory protection. 314 315gdb_test_no_output "set debug compile on" 316gdb_test "compile code static const int readonly = 1; *(int *) &readonly = 2;" \ 317 "The program being debugged was signaled while in a function called from GDB\\.\r\nGDB has restored the context to what it was before the call\\.\r\n.*" 318gdb_test_no_output "set debug compile off" 319 320 321# 322# Some simple coverage tests. 323# 324 325gdb_test "show debug compile" "Compile debugging is .*" 326gdb_test "show compile-args" \ 327 "Compile command command-line arguments are .*" 328gdb_test "compile code -z" "Unrecognized option at: -z" 329 330gdb_test "set lang rust" \ 331 "Warning: the current language does not match this frame." 332gdb_test "compile code globalvar" "No compiler support for language rust\\." 333gdb_test_no_output "set lang auto" 334 335gdb_test_no_output "compile code union union_type newdecl_u" 336gdb_test_no_output "compile code struct struct_type newdecl_s" 337gdb_test_no_output "compile code inttypedef newdecl_i" 338 339gdb_test "compile file" \ 340 "You must provide a filename for this command.*" \ 341 "Test compile file without a filename" 342gdb_test "compile file -r" \ 343 "You must provide a filename for this command.*" \ 344 "Test compile file and raw option without a filename" 345gdb_test "compile file -z" \ 346 "Unrecognized option at: -z" \ 347 "test compile file with unknown option" 348gdb_test "compile file -z --" \ 349 "Unrecognized option at: -z --" \ 350 "test compile file with unknown option plus --" 351gdb_test "compile file -raw -- -raw" \ 352 "/-raw: No such file or directory.*" \ 353 "test compile file \"-raw\" file" 354 355# LOC_CONST tests. 356 357if { $srcfile3 != "" } { 358 gdb_test "p constvar" " = 3" 359 gdb_test "info addr constvar" {Symbol "constvar" is constant\.} 360 361 gdb_test_no_output "compile code globalvar = constvar;" 362 gdb_test "print globalvar" " = 3" "print constvar value" 363} else { 364 untested "print constvar value" 365} 366 367# Shared library tests. 368 369if {[skip_shlib_tests]} { 370 untested "skipping shlib tests" 371 return; 372} 373 374set libbin [standard_output_file ${testfile}-shlib.so] 375set binfile [standard_output_file ${testfile}-shlib] 376 377if { [gdb_compile_shlib ${srcdir}/${subdir}/${srcfile2} $libbin {debug}] != "" 378 || [gdb_compile ${srcdir}/${subdir}/${srcfile} $binfile executable \ 379 [list debug shlib=$libbin]] == -1 } { 380 return -1 381} 382 383clean_restart $binfile 384gdb_load_shlib $libbin 385 386if ![runto_main] { 387 return -1 388} 389 390gdb_test_no_output "compile code shlib_func ();" "call shared library function" 391gdb_test "p globalvar" " = 1" "expect 1" 392 393gdb_test_no_output "compile code shlibvar += 5;" "modify shared library variable" 394gdb_test "p shlibvar" " = 15" "expect 15" 395