| # Copyright 1988-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 was written by Rob Savoye. (rob@cygnus.com) |
| |
| # |
| # test running programs |
| # |
| |
| if [target_info exists no_long_long] { |
| set exec_opts [list debug additional_flags=-DNO_LONG_LONG] |
| } else { |
| set exec_opts [list debug] |
| } |
| |
| standard_testfile .c |
| |
| # Define a procedure to set up an xfail for all targets that put out a |
| # `long' type as an `int' type. |
| # Sun cc has this problem. |
| # It was said that COFF targets can not distinguish int from long either. |
| |
| proc setup_xfail_on_long_vs_int {} { |
| global gcc_compiled |
| |
| if {!$gcc_compiled} { |
| setup_xfail "*-sun-sunos4*" "i*86-sequent-bsd*" |
| } |
| } |
| |
| # Compile the test using OPTIONS into a sub-directory DIR, and then |
| # run the test. |
| proc do_test {dir options} { |
| global srcfile testfile gcc_compiled |
| |
| set binfile [standard_output_file ${dir}/${testfile}] |
| if { [prepare_for_testing "failed to prepare" ${binfile} \ |
| [list $srcfile] $options] } { |
| return 0 |
| } |
| |
| # |
| # Test whatis command with basic C types |
| # |
| # The name printed now (as of 23 May 1993) is whatever name the compiler |
| # uses in the stabs. So we need to deal with names both from gcc and |
| # native compilers. |
| # |
| |
| gdb_test "whatis v_char" \ |
| "type = (unsigned char|char)" \ |
| "whatis char" |
| |
| gdb_test "whatis v_signed_char" \ |
| "type = (signed char|char)" \ |
| "whatis signed char" |
| |
| gdb_test "whatis v_unsigned_char" \ |
| "type = unsigned char" \ |
| "whatis unsigned char" |
| |
| gdb_test "whatis v_short" \ |
| "type = (short|short int)" \ |
| "whatis short" |
| |
| gdb_test "whatis v_signed_short" \ |
| "type = (short|short int|signed short|signed short int)" \ |
| "whatis signed short" |
| |
| gdb_test "whatis v_unsigned_short" \ |
| "type = (unsigned short|short unsigned int)" \ |
| "whatis unsigned short" |
| |
| gdb_test "whatis v_int" \ |
| "type = int" \ |
| "whatis int" |
| |
| gdb_test "whatis v_signed_int" \ |
| "type = (signed |)int" \ |
| "whatis signed int" |
| |
| gdb_test "whatis v_unsigned_int" \ |
| "type = unsigned int" \ |
| "whatis unsigned int" |
| |
| setup_xfail_on_long_vs_int |
| # AIX xlc gets this wrong and unsigned long right. Go figure. |
| if {!$gcc_compiled} then {setup_xfail "rs6000-*-aix*"} |
| gdb_test "whatis v_long" \ |
| "type = (long|long int)" \ |
| "whatis long" |
| |
| setup_xfail_on_long_vs_int |
| # AIX xlc gets this wrong and unsigned long right. Go figure. |
| if {!$gcc_compiled} then {setup_xfail "rs6000-*-aix*"} |
| gdb_test "whatis v_signed_long" \ |
| "type = (signed |)(long|long int)" \ |
| "whatis signed long" |
| |
| setup_xfail_on_long_vs_int |
| gdb_test "whatis v_unsigned_long" \ |
| "type = (unsigned long|long unsigned int)" \ |
| "whatis unsigned long" |
| |
| |
| if ![target_info exists no_long_long] { |
| gdb_test "whatis v_unsigned_long_long" \ |
| "type = (unsigned long long|long long unsigned int)" \ |
| "whatis unsigned long long" |
| } |
| |
| gdb_test "whatis v_float" \ |
| "type = float" \ |
| "whatis float" |
| |
| gdb_test "whatis v_double" \ |
| "type = double" \ |
| "whatis double" |
| |
| |
| # test whatis command with arrays |
| # |
| # We already tested whether char prints as "char", so here we accept |
| # "unsigned char", "signed char", and other perversions. No need for more |
| # than one xfail for the same thing. |
| gdb_test "whatis v_char_array" \ |
| "type = (signed |unsigned |)char \\\[2\\\]" \ |
| "whatis char array" |
| |
| gdb_test "whatis v_signed_char_array" \ |
| "type = (signed |unsigned |)char \\\[2\\\]" \ |
| "whatis signed char array" |
| |
| gdb_test "whatis v_unsigned_char_array" \ |
| "type = unsigned char \\\[2\\\]" \ |
| "whatis unsigned char array" |
| |
| gdb_test "whatis v_short_array" \ |
| "type = (short|short int) \\\[2\\\]" \ |
| "whatis short array" |
| |
| gdb_test "whatis v_signed_short_array" \ |
| "type = (signed |)(short|short int) \\\[2\\\]" \ |
| "whatis signed short array" |
| |
| gdb_test "whatis v_unsigned_short_array" \ |
| "type = (unsigned short|short unsigned int) \\\[2\\\]" \ |
| "whatis unsigned short array" |
| |
| gdb_test "whatis v_int_array" \ |
| "type = int \\\[2\\\]" \ |
| "whatis int array" |
| |
| gdb_test "whatis v_signed_int_array" \ |
| "type = (signed |)int \\\[2\\\]" \ |
| "whatis signed int array" |
| |
| gdb_test "whatis v_unsigned_int_array" \ |
| "type = unsigned int \\\[2\\\]" \ |
| "whatis unsigned int array" |
| |
| # We already tested whether long prints as long, so here we accept int |
| # No need for more than one xfail for the same thing. |
| gdb_test "whatis v_long_array" \ |
| "type = (int|long|long int) \\\[2\\\]" \ |
| "whatis long array" |
| |
| gdb_test "whatis v_signed_long_array" \ |
| "type = (signed |)(int|long|long int) \\\[2\\\]" \ |
| "whatis signed long array" |
| |
| gdb_test "whatis v_unsigned_long_array" \ |
| "type = (unsigned (int|long|long int)|long unsigned int) \\\[2\\\]" \ |
| "whatis unsigned long array" |
| |
| if ![target_info exists no_long_long] { |
| gdb_test "whatis v_unsigned_long_long_array" \ |
| "type = (unsigned long long|long long unsigned int) \\\[2\\\]" \ |
| "whatis unsigned long long array" |
| } |
| |
| gdb_test "whatis v_float_array" \ |
| "type = float \\\[2\\\]" \ |
| "whatis float array" |
| |
| gdb_test "whatis v_double_array" \ |
| "type = double \\\[2\\\]" \ |
| "whatis double array" |
| |
| # test whatis command with pointers |
| # |
| # We already tested whether char prints as char, so accept various perversions |
| # here. We especially want to make sure we test that it doesn't print as |
| # caddr_t. |
| gdb_test "whatis v_char_pointer" \ |
| "type = (unsigned |signed |)char \\*" \ |
| "whatis char pointer" |
| |
| gdb_test "whatis v_signed_char_pointer" \ |
| "type = (unsigned |signed |)char \\*" \ |
| "whatis signed char pointer" |
| |
| gdb_test "whatis v_unsigned_char_pointer" \ |
| "type = unsigned char \\*" \ |
| "whatis unsigned char pointer" |
| |
| gdb_test "whatis v_short_pointer" \ |
| "type = (short|short int) \\*" \ |
| "whatis short pointer" |
| |
| gdb_test "whatis v_signed_short_pointer" \ |
| "type = (signed |)(short|short int) \\*" \ |
| "whatis signed short pointer" |
| |
| gdb_test "whatis v_unsigned_short_pointer" \ |
| "type = (unsigned short|short unsigned int) \\*" \ |
| "whatis unsigned short pointer" |
| |
| gdb_test "whatis v_int_pointer" \ |
| "type = int \\*" \ |
| "whatis int pointer" |
| |
| gdb_test "whatis v_signed_int_pointer" \ |
| "type = (signed |)int \\*" \ |
| "whatis signed int pointer" |
| |
| gdb_test "whatis v_unsigned_int_pointer" \ |
| "type = unsigned int \\*" \ |
| "whatis unsigned int pointer" |
| |
| # We already tested whether long prints as long, so here we accept int |
| gdb_test "whatis v_long_pointer" \ |
| "type = (long|int|long int) \\*" \ |
| "whatis long pointer" |
| |
| gdb_test "whatis v_signed_long_pointer" \ |
| "type = (signed |)(long|int|long int) \\*" \ |
| "whatis signed long pointer" |
| |
| gdb_test "whatis v_unsigned_long_pointer" \ |
| "type = (unsigned (int|long|long int)|long unsigned int) \\*" \ |
| "whatis unsigned long pointer" |
| |
| if ![target_info exists no_long_long] { |
| gdb_test "whatis v_long_long_pointer" \ |
| "type = long long(| int) \\*" \ |
| "whatis long long pointer" |
| |
| gdb_test "whatis v_signed_long_long_pointer" \ |
| "type = (signed |)long long(| int) \\*" \ |
| "whatis signed long long pointer" |
| |
| gdb_test "whatis v_unsigned_long_long_pointer" \ |
| "type = (unsigned long long|long long unsigned int) \\*" \ |
| "whatis unsigned long long pointer" |
| } |
| |
| gdb_test "whatis v_float_pointer" \ |
| "type = float \\*" \ |
| "whatis float pointer" |
| |
| gdb_test "whatis v_double_pointer" \ |
| "type = double \\*" \ |
| "whatis double pointer" |
| |
| |
| # test whatis command with structure types |
| |
| # First with a type argument, with both "set print object" set to "on" |
| # and "off", ending with "off" for the following tests. |
| foreach_with_prefix print_object {"on" "off"} { |
| gdb_test_no_output "set print object $print_object" |
| |
| gdb_test "whatis struct t_struct" \ |
| "type = struct t_struct" \ |
| "whatis named structure using type name" |
| |
| gdb_test "whatis struct t_struct *" \ |
| "type = struct t_struct \\*" \ |
| "whatis named structure using type name and pointer" |
| |
| gdb_test "whatis struct t_struct &" \ |
| "type = struct t_struct &" \ |
| "whatis named structure using type name and reference" |
| } |
| |
| # Now with an expression argument. |
| |
| gdb_test "whatis v_struct1" \ |
| "type = struct t_struct" \ |
| "whatis named structure" |
| |
| gdb_test "whatis v_struct2" \ |
| "type = struct \{\.\.\.\}" \ |
| "whatis unnamed structure" |
| |
| gdb_test "whatis &v_struct1" \ |
| "type = struct t_struct \\*" |
| |
| gdb_test "whatis &v_struct2" \ |
| "type = struct {\\.\\.\\.} \\*" |
| |
| gdb_test "whatis v_struct_ptr1" \ |
| "type = struct t_struct \\*" |
| |
| gdb_test "whatis v_struct_ptr2" \ |
| "type = struct {\\.\\.\\.} \\*" |
| |
| gdb_test "whatis &v_struct_ptr1" \ |
| "type = struct t_struct \\*\\*" |
| |
| gdb_test "whatis &v_struct_ptr2" \ |
| "type = struct {\\.\\.\\.} \\*\\*" |
| |
| gdb_test "whatis v_struct1.v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis v_struct2.v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis v_struct_ptr1->v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis v_struct_ptr2->v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis &(v_struct1.v_char_member)" \ |
| "type = char \\*" |
| |
| gdb_test "whatis &(v_struct2.v_char_member)" \ |
| "type = char \\*" |
| |
| gdb_test "whatis &(v_struct_ptr1->v_char_member)" \ |
| "type = char \\*" |
| |
| gdb_test "whatis &(v_struct_ptr2->v_char_member)" \ |
| "type = char \\*" |
| |
| # test whatis command with union types |
| gdb_test "whatis v_union" \ |
| "type = union t_union" \ |
| "whatis named union" |
| |
| gdb_test "whatis union t_union" \ |
| "type = union t_union" \ |
| "whatis named union using type name" |
| |
| gdb_test "whatis v_union2" \ |
| "type = union \{\.\.\.\}" \ |
| "whatis unnamed union" |
| |
| gdb_test "whatis &v_union" \ |
| "type = union t_union \\*" |
| |
| gdb_test "whatis &v_union2" \ |
| "type = union {\\.\\.\\.} \\*" |
| |
| gdb_test "whatis v_union_ptr" \ |
| "type = union t_union \\*" |
| |
| gdb_test "whatis v_union_ptr2" \ |
| "type = union {\\.\\.\\.} \\*" |
| |
| gdb_test "whatis &v_union_ptr" \ |
| "type = union t_union \\*\\*" |
| |
| gdb_test "whatis &v_union_ptr2" \ |
| "type = union {\\.\\.\\.} \\*\\*" |
| |
| gdb_test "whatis v_union.v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis v_union2.v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis v_union_ptr->v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis v_union_ptr2->v_char_member" \ |
| "type = char" |
| |
| gdb_test "whatis &(v_union.v_char_member)" \ |
| "type = char \\*" |
| |
| gdb_test "whatis &(v_union2.v_char_member)" \ |
| "type = char \\*" |
| |
| gdb_test "whatis &(v_union_ptr->v_char_member)" \ |
| "type = char \\*" |
| |
| gdb_test "whatis &(v_union_ptr2->v_char_member)" \ |
| "type = char \\*" |
| |
| if { $dir == "dwarf" } { |
| # Using stabs we will mark these functions as prototyped. This |
| # is harmless but causes an extra VOID to be printed. |
| set void "(void|)" |
| |
| # test whatis command with functions return type |
| gdb_test "whatis v_char_func" \ |
| "type = (signed |unsigned |)char \\($void\\)" \ |
| "whatis char function" |
| |
| gdb_test "whatis v_signed_char_func" \ |
| "type = (signed |unsigned |)char \\($void\\)" \ |
| "whatis signed char function" |
| |
| gdb_test "whatis v_unsigned_char_func" \ |
| "type = unsigned char \\($void\\)" \ |
| "whatis unsigned char function" |
| |
| gdb_test "whatis v_short_func" \ |
| "type = short (int |)\\($void\\)" \ |
| "whatis short function" |
| |
| gdb_test "whatis v_signed_short_func" \ |
| "type = (signed |)short (int |)\\($void\\)" \ |
| "whatis signed short function" |
| |
| gdb_test "whatis v_unsigned_short_func" \ |
| "type = (unsigned short|short unsigned int) \\($void\\)" \ |
| "whatis unsigned short function" |
| |
| gdb_test "whatis v_int_func" \ |
| "type = int \\($void\\)" \ |
| "whatis int function" |
| |
| gdb_test "whatis v_signed_int_func" \ |
| "type = (signed |)int \\($void\\)" \ |
| "whatis signed int function" |
| |
| gdb_test "whatis v_unsigned_int_func" \ |
| "type = unsigned int \\($void\\)" \ |
| "whatis unsigned int function" |
| |
| gdb_test "whatis v_long_func" \ |
| "type = (long|int|long int) \\($void\\)" \ |
| "whatis long function" |
| |
| gdb_test "whatis v_signed_long_func" \ |
| "type = (signed |)(int|long|long int) \\($void\\)" \ |
| "whatis signed long function" |
| |
| gdb_test "whatis v_unsigned_long_func" \ |
| "type = (unsigned (int|long|long int)|long unsigned int) \\($void\\)" \ |
| "whatis unsigned long function" |
| |
| if ![target_info exists no_long_long] { |
| gdb_test "whatis v_long_long_func" \ |
| "type = long long(| int) \\($void\\)" \ |
| "whatis long long function" |
| |
| gdb_test "whatis v_signed_long_long_func" \ |
| "type = (signed |)long long(| int) \\($void\\)" \ |
| "whatis signed long long function" |
| |
| gdb_test "whatis v_unsigned_long_long_func" \ |
| "type = (unsigned long long(| int)|long long unsigned int) \\($void\\)" \ |
| "whatis unsigned long long function" |
| } |
| |
| # Sun /bin/cc calls this a function returning double. |
| if {!$gcc_compiled} then {setup_xfail "*-sun-sunos4*"} |
| gdb_test "whatis v_float_func" \ |
| "type = float \\($void\\)" \ |
| "whatis float function" |
| |
| gdb_test "whatis v_double_func" \ |
| "type = double \\($void\\)" \ |
| "whatis double function" \ |
| } |
| |
| # test whatis command with some misc complicated types |
| gdb_test "whatis s_link" \ |
| "type = struct link \\*" \ |
| "whatis complicated structure" |
| |
| gdb_test "whatis u_link" \ |
| "type = union tu_link" \ |
| "whatis complicated union" |
| |
| |
| # test whatis command with enumerations |
| gdb_test "whatis clunker" \ |
| "type = enum cars" \ |
| "whatis enumeration" |
| |
| gdb_test "whatis enum cars" \ |
| "type = enum cars" \ |
| "whatis enumeration using type name" |
| |
| |
| # test whatis command with nested struct and union |
| gdb_test "whatis nested_su" \ |
| "type = struct outer_struct" \ |
| "whatis outer structure" |
| |
| gdb_test "whatis nested_su.outer_int" \ |
| "type = int" \ |
| "whatis outer structure member" |
| |
| gdb_test "whatis nested_su.inner_struct_instance" \ |
| "type = struct inner_struct" \ |
| "whatis inner structure" |
| |
| gdb_test "whatis nested_su.inner_struct_instance.inner_int" \ |
| "type = int" \ |
| "whatis inner structure member" |
| |
| gdb_test "whatis nested_su.inner_union_instance" \ |
| "type = union inner_union" \ |
| "whatis inner union" |
| |
| gdb_test "whatis nested_su.inner_union_instance.inner_union_int" \ |
| "type = int" \ |
| "whatis inner union member" |
| |
| # test whatis command with typedefs |
| |
| gdb_test "whatis char_addr" \ |
| "type = char \\*" \ |
| "whatis using typedef type name" |
| |
| if { $dir == "dwarf" } { |
| gdb_test "whatis a_char_addr" \ |
| "type = char_addr" \ |
| "whatis applied to variable defined by typedef" |
| } |
| |
| # Regression tests for PR 9514. |
| |
| gdb_test "whatis void (**)()" \ |
| "type = void \\(\\*\\*\\)\\(\\)" \ |
| "whatis applied to pointer to pointer to function" |
| |
| gdb_test "whatis void (** const)()" \ |
| "type = void \\(\\*\\* const\\)\\(\\)" \ |
| "whatis applied to const pointer to pointer to function" |
| |
| gdb_test "whatis void (* const *)()" \ |
| "type = void \\(\\* const \\*\\)\\(\\)" \ |
| "whatis applied to pointer to const pointer to function" |
| |
| gdb_test "whatis int *(*)()" \ |
| "type = int \\*\\(\\*\\)\\(\\)" \ |
| "whatis applied to pointer to function returning pointer to int" |
| |
| gdb_test "whatis int *(**)()" \ |
| "type = int \\*\\(\\*\\*\\)\\(\\)" \ |
| "whatis applied to pointer to pointer to function returning pointer to int" |
| |
| gdb_test "whatis char (*(*)())\[23\]" \ |
| "type = char \\(\\*\\(\\*\\)\\(\\)\\)\\\[23\\\]" \ |
| "whatis applied to pointer to function returning pointer to array" |
| |
| gdb_test "whatis int (*)(int, int)" \ |
| "type = int \\(\\*\\)\\(int, int\\)" \ |
| "whatis applied to pointer to function taking int,int and returning int" |
| |
| gdb_test "whatis int (*)(const int *, ...)" \ |
| "type = int \\(\\*\\)\\(const int \\*, \\.\\.\\.\\)" \ |
| "whatis applied to pointer to function taking const int ptr and varargs and returning int" |
| |
| gdb_test "whatis int (*)(void, int, int)" \ |
| "parameter types following 'void'" \ |
| "whatis applied to function with types trailing 'void'" |
| |
| gdb_test "whatis int (*)(int, void, int)" \ |
| "'void' invalid as parameter type" \ |
| "whatis applied to function with 'void' parameter type" |
| } |
| |
| # Build up the set of debug formats for which we will run this test. |
| set specs { {dwarf {debug}} } |
| if ![skip_ctf_tests] { |
| lappend specs {ctf {"additional_flags=-gt"}} |
| } |
| |
| # Setup and run the test for each debug format. |
| foreach testspec $specs { |
| set prefix [lindex $testspec 0] |
| set opts [lindex $testspec 1] |
| |
| with_test_prefix $prefix { |
| remote_exec host "mkdir -p [standard_output_file ${prefix}]" |
| do_test $prefix $opts |
| } |
| } |