| # Copyright 1992-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 Fred Fish. (fnf@cygnus.com) |
| |
| |
| # Create and source the file that provides information about the compiler |
| # used to compile the test case. |
| if [get_compiler_info] { |
| return -1 |
| } |
| |
| standard_testfile opaque0.c opaque1.c |
| |
| if {[prepare_for_testing "failed to prepare" $testfile \ |
| [list $srcfile $srcfile2] debug]} { |
| return -1 |
| } |
| |
| # |
| # Test basic opaque structure handling (statically). |
| # The ordering of the tests is significant. We first try the things that |
| # might fail if gdb fails to connect the uses of opaque structures to |
| # the actual opaque structure definition. |
| |
| # When we start up, gdb sets the file containing main() as the current |
| # source file. The actual structure foo is defined in a different file. |
| # A pointer (foop) to an instance of the opaque struct is defined in the same |
| # source file as main(). Ensure that gdb correctly "connected" the definition |
| # in the other file with the pointer to the opaque struct in the file containing |
| # "foop". |
| |
| # Define a procedure to set up an xfail for all targets that do not support |
| # this sort of cross reference. |
| # Any target gcc that has a DBX_NO_XREFS definition in its config file will |
| # not support it (FIXME: Is this still true; I suspect maybe not). |
| |
| # Native alpha ecoff doesn't support it either. |
| # I don't think this type of cross reference works for any COFF target |
| # either. |
| |
| proc setup_xfail_on_opaque_pointer {} { |
| global gcc_compiled |
| |
| setup_xfail "vax-*-*" "i*86-sequent-bsd*" |
| if {!$gcc_compiled} then { |
| setup_xfail "alpha-*-*" |
| } |
| } |
| |
| # This seems easier than trying to track different versions of xlc; I'm |
| # not sure there is much rhyme or reason regarding which tests it fails |
| # and which ones it passes. |
| if {[istarget "rs6000-*-aix*"] && !$gcc_compiled} then { |
| warning "xfails in opaque.exp may not be set up correctly for xlc" |
| } |
| |
| setup_xfail_on_opaque_pointer |
| gdb_test "whatis foop" \ |
| "type = struct foo \[*\]+" \ |
| "whatis on opaque struct pointer (statically)" |
| |
| |
| # Ensure that we know the form of the structure that foop points to. |
| |
| setup_xfail_on_opaque_pointer |
| if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } |
| gdb_test "ptype foop" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\} \[*\]+" \ |
| "ptype on opaque struct pointer (statically)" |
| |
| |
| # An instance of the opaque structure (afoo) is defined in a different file. |
| # Ensure that we can locate afoo and the structure definition. |
| |
| gdb_test "whatis afoo" \ |
| "type = struct foo" \ |
| "whatis on opaque struct instance (statically)" |
| |
| |
| # Ensure that we know the form of "afoo". |
| |
| gdb_test "ptype afoo" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ |
| "ptype on opaque struct instance (statically)" |
| |
| |
| # Ensure that we know what a struct foo looks like. |
| |
| gdb_test "ptype struct foo" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ |
| "ptype on opaque struct tagname (statically)" |
| |
| |
| # |
| # Done with static tests, now test dynamic opaque structure handling. |
| # We reload the symbol table so we forget about anything we might |
| # have learned during the static tests. |
| # |
| |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_load ${binfile} |
| |
| # Run to main, where struct foo is incomplete. |
| if ![runto_main] { |
| perror "cannot run to breakpoint at main" |
| } |
| |
| |
| # The current source file is now the one containing main(). The structure foo |
| # is defined in a different file, but we have a pointer to an instance of |
| # the opaque structure in the current file. Ensure we know it's type. |
| |
| setup_xfail_on_opaque_pointer |
| gdb_test "whatis foop" \ |
| "type = struct foo \[*\]+" \ |
| "whatis on opaque struct pointer (dynamically)" |
| |
| |
| # Ensure that we know the form of the thing foop points to. |
| |
| setup_xfail_on_opaque_pointer |
| if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } |
| gdb_test "ptype foop" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\} \[*\]+" \ |
| "ptype on opaque struct pointer (dynamically) 1" |
| |
| gdb_test "whatis afoo" \ |
| "type = struct foo" \ |
| "whatis on opaque struct instance (dynamically) 1" |
| |
| |
| # Ensure that we know the form of afoo, an instance of a struct foo. |
| |
| gdb_test "ptype afoo" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ |
| "ptype on opaque struct instance (dynamically) 1" |
| |
| |
| # Ensure that we know the form of an explicit struct foo. |
| |
| if {!$gcc_compiled} then { setup_xfail "rs6000-*-*" } |
| gdb_test "ptype struct foo" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ |
| "ptype on opaque struct tagname (dynamically) 1" |
| |
| |
| # Now reload the symbols again so we forget about anything we might |
| # have learned reading the symbols during the previous tests. |
| |
| gdb_reinitialize_dir $srcdir/$subdir |
| gdb_load ${binfile} |
| |
| # Run to getfoo, where struct foo is complete. |
| if ![runto getfoo] { |
| perror "cannot run to breakpoint at getfoo" |
| } |
| |
| |
| # Ensure that we know what foop is. |
| |
| setup_xfail_on_opaque_pointer |
| gdb_test "whatis foop" \ |
| "type = struct foo \[*\]+" \ |
| "whatis on opaque struct pointer (dynamically) 1" |
| |
| |
| # Ensure that we know the form of the thing foop points to. |
| |
| setup_xfail_on_opaque_pointer |
| gdb_test "ptype foop" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\} \[*\]+" \ |
| "ptype on opaque struct pointer (dynamically) 2" |
| |
| gdb_test "whatis afoo" \ |
| "type = struct foo" \ |
| "whatis on opaque struct instance (dynamically) 2" |
| |
| |
| # Ensure that we know the form of afoo, an instance of a struct foo. |
| |
| gdb_test "ptype afoo" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ |
| "ptype on opaque struct instance (dynamically) 2" |
| |
| |
| # Ensure that we know the form of an explicit struct foo. |
| |
| gdb_test "ptype struct foo" \ |
| "type = struct foo \{\[\r\n\]+ int a;\[\r\n\]+ int b;\[\r\n\]+\}" \ |
| "ptype on opaque struct tagname (dynamically) 2" |