# Copyright 2014-2020 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 . load_lib compile-support.exp standard_testfile .c compile-shlib.c compile-constvar.S compile-nodebug.c get_compiler_info set options {} if { [test_compiler_info gcc*] || [test_compiler_info clang*] } { lappend options additional_flags=-g3 lappend options additional_flags=-std=gnu++11 lappend options c++ } if { ![istarget x86_64-*-* ] || ![is_lp64_target] } { verbose "Skipping x86_64 LOC_CONST test." set srcfile3 "" } set srcfilesoptions [list ${srcfile} ${options}] if { $srcfile3 != "" } { lappend srcfilesoptions $srcfile3 {} } set srcfile4options "nodebug c++" lappend srcfilesoptions $srcfile4 $srcfile4options if { [eval build_executable_from_specs ${testfile}.exp $testfile {$options} ${srcfilesoptions}] } { return -1 } clean_restart ${testfile} # # FIXME: Right now, for C++ we just duplicate the C tests, but force # the language to C++ # gdb_test_no_output "set language c++" \ "Set language to C++" if ![runto_main] { return -1 } if {[skip_compile_feature_tests]} { untested "compile command not supported (could not find libcc1 shared library?)" return -1 } # # Test delimiter for code, and arguments. # gdb_test_no_output "compile code globalvar = SOME_MACRO;" \ "set variable from macro" gdb_test "p globalvar" " = 23" "expect 23" gdb_test_no_output "compile code globalvar = ARG_MACRO(0, 0);" \ "set variable from function-like macro" gdb_test "p globalvar" " = -1" "expect -1" gdb_test_no_output "compile code globalvar = 42;" "set variable" gdb_test "p globalvar" " = 42" "expect 42" gdb_test_no_output "compile code globalvar *= 2;" "modify variable" gdb_test "p globalvar" " = 84" "expect 84" gdb_test_no_output "compile file -r ${srcdir}/${subdir}/${testfile}-mod.c" \ "use external source file" gdb_test "p globalvar" " = 7" "expect 7" gdb_test_no_output "compile code func_static (2);" "call static function" gdb_test "p globalvar" " = 9" "expect 9" gdb_test_no_output "compile code func_global (1);" "call global function" gdb_test "p globalvar" " = 8" "expect 8" gdb_test_no_output \ "compile code globalvar = (sizeof (ulonger) == sizeof (long))" \ "compute size of ulonger" gdb_test "p globalvar" " = 1" "check size of ulonger" gdb_test_no_output \ "compile code globalvar = (sizeof (longer) == sizeof (long))" \ "compute size of longer" gdb_test "p globalvar" " = 1" "check size of longer" gdb_test_no_output "compile code globalvar = MINUS_1" gdb_test "p globalvar" " = -1" "check MINUS_1" gdb_test_no_output "compile code globalvar = static_local" gdb_test "p globalvar" " = 77000" "check static_local" gdb_test_no_output \ "compile code static int staticvar = 5; intptr = &staticvar" \ "do not keep jit in memory" gdb_test "p *intptr" "Cannot access memory at address 0x\[0-9a-f\]+" \ "expect 5" gdb_test "compile code func_doesnotexist ();" "error: \'func_doesnotexist\' was not declared in this scope.*" gdb_test "compile code *(volatile int *) 0 = 0;" \ "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.*" \ "compile code segfault first" gdb_test "bt" \ "\r\n#0 \[^\r\n\]* in _gdb_expr \[^\r\n\]*\r\n#1 \r\n.*" set test "p/x \$pc" set infcall_pc 0 gdb_test_multiple $test $test { -re " = (0x\[0-9a-f\]+)\r\n$gdb_prompt $" { set infcall_pc $expect_out(1,string) pass $test } } gdb_test "info sym $infcall_pc" "\r\n_gdb_expr.*" "info sym found" gdb_test "return" "\r\n#0 main .*" "return" \ "Make _gdb_expr\\(__gdb_regs\\*\\) return now\\? \\(y or n\\) " "y" gdb_test "info sym $infcall_pc" "\r\nNo symbol matches .*" "info sym not found" gdb_test_no_output "set unwindonsignal on" gdb_test "compile code *(volatile int *) 0 = 0;" \ "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.*" \ "compile code segfault second" gdb_breakpoint [gdb_get_line_number "break-here"] gdb_continue_to_breakpoint "break-here" ".* break-here .*" # C++ Specific tests. ## Public methods and members gdb_test "print foovar.public_var" "42" \ "Test compile code foovar.public_var = 42 setting." gdb_test_no_output "compile code foovar.public_var = 43;" \ "set foobar.public_var to 43" gdb_test "print foovar.public_var" "43" \ "Test compile code foovar.public_var = 43 setting." gdb_test "print foovar.public_method ()" "43" \ "Test compile code foovar.public_method = 43 setting." ## Private methods and members gdb_test_no_output "compile code foovar.set_private_var (84);" \ "Call class function to set private_var" gdb_test "print foovar.private_var" "84" \ "Test compile code foovar.set_private_var = 84 setting." gdb_test_no_output "compile code foovar.private_var = 85" \ "Directly set a private member in GDB compile5" gdb_test "print foovar.private_var" "85" \ "Test compile code foovar.set_private_var = 85 setting." ## Simple inheritance CompileExpression::new "var" CompileExpression::test "class Baz: public Foo {public: int z = 12;}; Baz bazvar; bazvar.z = 24; var = bazvar.z" 24 -explicit ## Multiple inheritance CompileExpression::test "class MI: public Base, public Base2 {int pure_virt () {return 42;}}; MI MIVar; var = MIVar.pure_virt();" 42 -explicit CompileExpression::test "class MI: public Base, public Base2 {int pure_virt () {return Base::return_value() + 42;}}; MI MIVar; var = MIVar.pure_virt();" 43 -explicit CompileExpression::test "class Base3 {public: int z = 99;}; class MI: public Base, public Base3 {int pure_virt () {return Base3::z + 42;}}; MI MIVar; var = MIVar.pure_virt();" 141 -explicit gdb_test "p localvar" " = 50" "expect localvar 50" gdb_test_no_output "compile code localvar = 12;" "set localvar" gdb_test "p localvar" " = 12" "expect 12" gdb_test_no_output "compile code localvar *= 2;" "modify localvar" gdb_test "p localvar" " = 24" "expect 24" gdb_test_no_output "compile code localvar = shadowed" \ "test shadowing" gdb_test "p localvar" " = 52" "expect 52" gdb_test_no_output "compile code localvar = externed" gdb_test "p localvar" " = 7" "test extern in inner scope" gdb_test_no_output "compile code vla\[2\] = 7" gdb_test "p vla\[2\]" " = 7" gdb_test_no_output \ "compile code localvar = (sizeof (vla) == bound * sizeof (vla\[0\]))" gdb_test "p localvar" " = 1" # # Test setting fields and also many different types. # gdb_test_no_output "compile code struct_object.selffield = (struct_type*)&struct_object" gdb_test "print struct_object.selffield == &struct_object" " = true" gdb_test_no_output "compile code struct_object.charfield = 1" gdb_test "print struct_object.charfield" " = 1 '\\\\001'" gdb_test_no_output "compile code struct_object.ucharfield = 1" gdb_test "print struct_object.ucharfield" " = 1 '\\\\001'" foreach {field value} { shortfield -5 ushortfield 5 intfield -7 uintfield 7 bitfield 2 longfield -9 ulongfield 9 enumfield ONE floatfield 1 doublefield 2 } { gdb_test_no_output "compile code struct_object.$field = $value" gdb_test "print struct_object.$field" " = $value" } gdb_test_no_output "compile code struct_object.arrayfield\[2\] = 7" gdb_test "print struct_object.arrayfield" \ " = \\{0, 0, 7, 0, 0\\}" gdb_test_no_output "compile code struct_object.complexfield = 7 + 5i" gdb_test "print struct_object.complexfield" " = 7 \\+ 5i" gdb_test_no_output "compile code struct_object.boolfield = 1" gdb_test "print struct_object.boolfield" " = true" gdb_test_no_output "compile code struct_object.vectorfield\[2\] = 7" gdb_test "print struct_object.vectorfield" \ " = \\{0, 0, 7, 0\\}" gdb_test_no_output "compile code union_object.typedeffield = 7" gdb_test "print union_object.typedeffield" " = 7" gdb_test "print union_object.intfield" " = 7" # LOC_UNRESOLVED tests. gdb_test "print unresolved" " = 20" gdb_test "compile code globalvar = unresolved;" gdb_test "print globalvar" " = 20" "print unresolved value" # Test shadowing with global and static variables. gdb_test_no_output "compile code globalshadow += 1;" gdb_test "print globalshadow" " = 101" gdb_test_no_output "compile code extern int globalshadow; globalshadow += 5;" gdb_test "print 'compile-cplus.c'::globalshadow" " = 15" gdb_test "print globalshadow" " = 101" "print globalshadow second time" gdb_test_no_output "compile code staticshadow += 2;" gdb_test "print staticshadow" " = 202" # "extern int staticshadow;" cannot access static variable. # Raw code cannot refer to locals. # As it references global variable we need the #pragma. # For #pragma we need multiline input. gdb_test_multiple "compile code -r" "compile code -r multiline 1" { -re "\r\n>$" {} } gdb_test_multiple "void _gdb_expr(void) {" "compile code -r multiline 2" { -re "\r\n>$" {} } gdb_test_multiple "#pragma GCC push_user_expression" "compile code -r multiline 3" { -re "\r\n>$" {} } gdb_test_multiple " globalshadow = 77000;" "compile code -r multiline 4" { -re "\r\n>$" {} } gdb_test_multiple "#pragma GCC pop_user_expression" "compile code -r multiline 5" { -re "\r\n>$" {} } gdb_test_multiple "}" "compile code -r multiline 6" { -re "\r\n>$" {} } gdb_test_no_output "end" "compile code -r multiline 7" gdb_test "print 'compile-cplus.c'::globalshadow" " = 77000" \ "check globalshadow with -r" # Test GOT vs. resolving jit function pointers. gdb_test_no_output "compile -raw -- extern \"C\" void abort(); int func(){return 21;} void _gdb_expr(){int (*funcp)()=func; if (funcp()!=21) abort();}" \ "pointer to jit function" # # Test the case where the registers structure would not normally have # any fields. # gdb_breakpoint [gdb_get_line_number "no_args_or_locals breakpoint"] gdb_continue_to_breakpoint "no_args_or_locals" gdb_test_no_output "compile code globalvar = 77;" "set variable to 77" gdb_test "p globalvar" " = 77" "expect 77" # Test reference to minimal_symbol, not (full) symbol. setup_kfail compile/23585 *-*-* gdb_test_no_output "compile code globalvar = func_nodebug (75);" \ "call func_nodebug" setup_kfail compile/23585 *-*-* gdb_test "p globalvar" " = -75" "expect -75" setup_kfail compile/23585 *-*-* gdb_test_no_output \ "compile code int (*funcp) (int) = (int(*)(int))func_nodebug; globalvar = funcp (76);" \ "call func_nodebug indirectly" setup_kfail compile/23585 *-*-* gdb_test "p globalvar" " = -76" "expect -76" # Test compiled module memory protection. gdb_test_no_output "set debug compile on" gdb_test "compile code static const int readonly = 1; *(int *) &readonly = 2;" \ "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.*" gdb_test_no_output "set debug compile off" # # Some simple coverage tests. # gdb_test "show debug compile" "Compile debugging is .*" gdb_test "show compile-args" \ "Compile command command-line arguments are .*" gdb_test "compile code -z" "Unknown argument.*" gdb_test "set lang rust" \ "Warning: the current language does not match this frame." gdb_test "compile code globalvar" "No compiler support for language rust\." gdb_test_no_output "set lang auto" gdb_test_no_output "compile code union union_type newdecl_u" gdb_test_no_output "compile code struct struct_type newdecl_s" gdb_test_no_output "compile code inttypedef newdecl_i" gdb_test "compile file" \ "You must provide a filename for this command.*" \ "Test compile file without a filename" gdb_test "compile file -r" \ "You must provide a filename with the raw option set.*" \ "Test compile file and raw option without a filename" gdb_test "compile file -z" \ "Unknown argument.*" \ "Test compile file with unknown argument" # LOC_CONST tests. if { $srcfile3 != "" } { gdb_test "p constvar" " = 3" gdb_test "info addr constvar" {Symbol "constvar" is constant\.} gdb_test_no_output "compile code globalvar = constvar;" gdb_test "print globalvar" " = 3" "print constvar value" } else { untested "print constvar value" }