aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/per-bfd-sharing.exp
blob: ef1ed1969512e140e75c5b2c6f5b849542728924 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#   Copyright 2020-2024 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 test checks that loading a file with different methods (partial symtabs,
# index, readnow) does not crash.

standard_testfile

if { [build_executable "failed to prepare" $testfile $srcfile \
	  {debug ldflags=-Wl,--build-id}] == -1 } {
    return
}
set host_binfile [gdb_remote_download host $binfile]

set has_index_section [exec_has_index_section $binfile]
set uses_readnow [expr [string first "-readnow" $GDBFLAGS] != -1]
set expecting_index_cache_use [expr !$has_index_section && !$uses_readnow]

lassign [remote_exec host mktemp -d] ret cache_dir

# The output of mktemp contains an end of line, remove it.
set cache_dir [string trimright $cache_dir \r\n]

if { $ret != 0 } {
    fail "couldn't create temporary cache dir"
    return
}

verbose -log "Index cache dir: $cache_dir"

# Populate the index-cache.
with_test_prefix "populate index cache" {
    clean_restart

    gdb_test_no_output "set index-cache directory $cache_dir" \
	"set index-cache directory"
    gdb_test_no_output "set index-cache enabled on"
    gdb_test "file $host_binfile" "Reading symbols from .*" "file"
    gdb_test_no_output "maint wait-for-index-cache"
}

proc load_binary { method } {
    global binfile
    global hex

    if { $method == "standard" } {
	gdb_test "file $::host_binfile" "Reading symbols from .*" "file"
    } elseif { $method == "index" } {
	gdb_test_no_output "set index-cache enabled on"
	gdb_test "file $::host_binfile" "Reading symbols from .*" "file index"
	gdb_test_no_output "set index-cache enabled off"
    } elseif { $method == "readnow" } {
	gdb_test "file -readnow $::host_binfile" \
	    "Reading symbols from .*Expanding full symbols from .*" \
	    "file readnow"
    } else {
	error "unknown method"
    }

    # Print a static function: seeing it and its signature confirms GDB
    # sees some symbols.
    gdb_test "print foo" " = {int \\(int, int\\)} $hex <foo>"
}

set methods {standard index readnow}

foreach_with_prefix first $methods {
    foreach_with_prefix second $methods {
	foreach_with_prefix third $methods {
	    # Start with a clean GDB.
	    clean_restart

	    # Set the index cache dir, but don't enable the index-cache, it will
	    # be enabled only when needed, when loading a file with the "index"
	    # method.
	    gdb_test_no_output "set index-cache directory $cache_dir" \
		"set index-cache directory"

	    # Avoid GDB asking whether we really want to load a new binary.
	    gdb_test_no_output "set confirm off"

	    with_test_prefix "load first" { load_binary $first }
	    with_test_prefix "load second" { load_binary $second }
	    with_test_prefix "load third" { load_binary $third }
	}
    }
}

lassign [remote_exec host "sh -c" [quote_for_host rm $cache_dir/*.gdb-index]] ret
if { $ret != 0 && $expecting_index_cache_use } {
    fail "couldn't remove files in temporary cache dir"
    return
}

lassign [remote_exec host rmdir "$cache_dir"] ret
if { $ret != 0 } {
    fail "couldn't remove temporary cache dir"
    return
}