gdb: Allow GDB to _not_ load a previous command history
[deliverable/binutils-gdb.git] / gdb / testsuite / gdb.base / print-file-var.exp
index 67c3ac481c38c71301b5070bc8d400c03588b717..b77e8547dfb96f908806e2136f7946a27db911e7 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright 2012 Free Software Foundation, Inc.
+# Copyright 2012-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
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-set executable print-file-var-main
+if {[skip_shlib_tests]} {
+    return -1
+}
 
-set lib1 "print-file-var-lib1"
-set lib2 "print-file-var-lib2"
+proc test {hidden dlopen version_id_main lang} {
+    global srcdir subdir
 
-set libobj1 "${objdir}/${subdir}/${lib1}.so"
-set libobj2 "${objdir}/${subdir}/${lib2}.so"
+    set main "print-file-var-main"
 
-set lib_opts { debug additional_flags=-fPIC }
+    set suffix "-hidden$hidden-dlopen$dlopen-version_id_main$version_id_main"
 
-if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib1}.c \
-                        ${libobj1} \
-                        ${lib_opts} ] != "" } {
-    return -1
-}
-if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib2}.c \
-                        ${libobj2} \
-                        ${lib_opts} ] != "" } {
-    return -1
-}
-if { [gdb_compile "${srcdir}/${subdir}/${executable}.c" \
-                  "${objdir}/${subdir}/${executable}" \
-                  executable \
-                  [list debug shlib=${libobj1} shlib=${libobj2}]]
-     != ""} {
-    return -1
-}
+    # Normally we place different builds (C/C++) of a test into
+    # subdirectories within the test build directory, however, using
+    # gdb_load_shlib doesn't work well with this approach, so instead
+    # add a language specific suffix to the binary and library names.
+    if { $lang == "c" } {
+       set suffix "${suffix}_c"
+    } else {
+       set suffix "${suffix}_cpp"
+    }
 
-clean_restart $executable
+    set executable $main$suffix
 
-if ![runto_main] {
-    untested "could not run to main"
-    return -1
+    set lib1 "print-file-var-lib1"
+    set lib2 "print-file-var-lib2"
+
+    set libobj1 [standard_output_file ${lib1}$suffix.so]
+    set libobj2 [standard_output_file ${lib2}$suffix.so]
+
+    set lib_opts { debug additional_flags=-fPIC $lang }
+    lappend lib_opts "additional_flags=-DHIDDEN=$hidden"
+
+    if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib1}.c \
+             ${libobj1} \
+             ${lib_opts} ] != "" } {
+       return -1
+    }
+    if { [gdb_compile_shlib ${srcdir}/${subdir}/${lib2}.c \
+             ${libobj2} \
+             ${lib_opts} ] != "" } {
+       return -1
+    }
+
+    set main_opts [list debug shlib=${libobj1} $lang]
+
+    if {$dlopen} {
+       lappend main_opts "shlib_load" \
+           "additional_flags=-DSHLIB_NAME=\"$libobj2\""
+    } else {
+       lappend main_opts "shlib=${libobj2}"
+    }
+
+    lappend main_opts "additional_flags=-DVERSION_ID_MAIN=$version_id_main"
+
+    if { [gdb_compile "${srcdir}/${subdir}/${main}.c" \
+             [standard_output_file ${executable}] \
+             executable \
+             $main_opts]
+        != ""} {
+       return -1
+    }
+
+    clean_restart $executable
+    gdb_load_shlib $libobj1
+    gdb_load_shlib $libobj2
+
+    if ![runto_main] {
+       untested "could not run to main"
+       return -1
+    }
+
+    # Try printing "this_version_num" qualified with the name of the file
+    # where the variables are defined.  There are three global variables
+    # with that name, and some systems such as GNU/Linux merge them
+    # into one single entity, while some other systems such as Windows
+    # keep them separate.  In the first situation, we have to verify
+    # that GDB does not randomly select the wrong instance, even when
+    # a specific filename is used to qualified the lookup.  And in the
+    # second case, we have to verify that GDB does select the instance
+    # defined in the given filename.
+    #
+    # To avoid adding target-specific code in this testcase, the program
+    # sets three local variables named 'vm', 'v1' and 'v2' with the value of
+    # our global variables.  This allows us to compare the value that
+    # GDB returns for each query against the actual value seen by
+    # the program itself.
+
+    # Get past the initialization of the v* variables.
+
+    set bp_location \
+       [gdb_get_line_number "STOP" "${main}.c"]
+    gdb_test "break $main.c:$bp_location" \
+       "Breakpoint \[0-9\]+ at 0x\[0-9a-fA-F\]+: .*" \
+       "breapoint at STOP marker"
+
+    gdb_test "continue" \
+       "Breakpoint \[0-9\]+, main \\(\\) at.*STOP.*" \
+       "continue to STOP marker"
+
+    # Now check the value of this_version_id in all of
+    # print-file-var-main.c, print-file-var-lib1.c and
+    # print-file-var-lib2.c.
+
+    # Compare the values of $sym1 and $sym2.
+    proc compare {sym1 sym2} {
+       with_test_prefix "sym1=$sym1,sym2=$sym2" {
+           # Done this way instead of comparing the symbols with "print $sym1
+           # == sym2" in GDB directly so that the values of the symbols end
+           # up visible in the logs, for debug purposes.
+           set vsym1 [get_integer_valueof $sym1 -1]
+           set vsym2 [get_integer_valueof $sym2 -1]
+           gdb_assert {$vsym1 == $vsym2} "$sym1 == $sym2"
+       }
+    }
+
+    if $version_id_main {
+       compare "'print-file-var-main.c'::this_version_id" "vm"
+       compare "this_version_id" "vm"
+    }
+
+    compare "'print-file-var-lib1.c'::this_version_id" "v1"
+    compare "'print-file-var-lib2.c'::this_version_id" "v2"
 }
 
-gdb_test "print 'print-file-var-lib1.c'::this_version_id" \
-         " = 104"
+# Only test C++ if we are able.  Always use C.
+if { [skip_cplus_tests] || [get_compiler_info "c++"] } {
+    set lang_list {c}
+} else {
+    set lang_list {c c++}
+}
 
-gdb_test "print 'print-file-var-lib2.c'::this_version_id" \
-         " = 203"
+foreach_with_prefix lang $lang_list {
+    foreach_with_prefix hidden {0 1} {
+       foreach_with_prefix dlopen {0 1} {
+           foreach_with_prefix version_id_main {0 1} {
+               test $hidden $dlopen $version_id_main $lang
+           }
+       }
+    }
+}
This page took 0.037938 seconds and 4 git commands to generate.