aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.dwarf2/dwzbuildid.exp
blob: e54508a56e7e616a56d53c2ef17dcc3198fd1cba (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# Copyright 2013-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/>.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
require dwarf2_support

# No remote host testing either.
require {!is_remote host}


# Lots of source files since we test a few cases and make new files
# for each.
# The tests are:
#     ok - the main file refers to a dwz and the buildids match
#     mismatch - the buildids do not match
#     fallback - the buildids do not match but a match is found via buildid
standard_testfile main.c \
    dwzbuildid-ok-base.S dwzbuildid-ok-sep.S \
    dwzbuildid-mismatch-base.S dwzbuildid-mismatch-sep.S \
    dwzbuildid-fallback-base.S dwzbuildid-fallback-sep.S \
    dwzbuildid-fallback-ok.S
    
# Write some assembly that just has a .gnu_debugaltlink section.
proc write_just_debugaltlink {filename dwzname buildid} {
    set asm_file [standard_output_file $filename]

    Dwarf::assemble $asm_file {
	upvar dwzname dwzname
	upvar buildid buildid

	gnu_debugaltlink $dwzname $buildid

	# Only the DWARF reader checks .gnu_debugaltlink, so make sure
	# there is a bit of DWARF in here.
	cu { label cu_start } {
	    compile_unit {{language @DW_LANG_C}} {
	    }
	}
	aranges {} cu_start {
	    arange {} 0 0
	}
    }
}

# Write some DWARF that also sets the buildid.
proc write_dwarf_file {filename buildid {value 99}} {
    set asm_file [standard_output_file $filename]

    Dwarf::assemble $asm_file {
	declare_labels int_label int_label2

	upvar buildid buildid
	upvar value value

	build_id $buildid

	cu { label cu_start } {
	    compile_unit {{language @DW_LANG_C}} {
		int_label2: base_type {
		    {name int}
		    {byte_size 4 sdata}
		    {encoding @DW_ATE_signed}
		}

		constant {
		    {name the_int}
		    {type :$int_label2}
		    {const_value $value data1}
		}
	    }
	}

	aranges {} cu_start {
	    arange {} 0 0
	}
    }
}

if  { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile}1.o \
	   object {nodebug}] != "" } {
    return -1
}

# The values don't really matter, just whether they are equal.
set ok_prefix 01
set ok_suffix 02030405060708091011121314151617181920
set ok_suffix2 020304050607080910111213141516171819ff
set ok_buildid ${ok_prefix}${ok_suffix}
set ok_buildid2 ${ok_prefix}${ok_suffix2}
set bad_buildid [string repeat ff 20]

set debugdir [standard_output_file {}]
set basedir $debugdir/.build-id
file mkdir $basedir $basedir/$ok_prefix

# Test where the separate debuginfo's buildid matches.
write_just_debugaltlink $srcfile2 ${binfile}3.o $ok_buildid
write_dwarf_file $srcfile3 $ok_buildid

# Test where the separate debuginfo's buildid does not match.
write_just_debugaltlink $srcfile4 ${binfile}5.o $ok_buildid
write_dwarf_file $srcfile5 $bad_buildid

# Test where the separate debuginfo's buildid does not match, but then
# we find a match in the .build-id directory.
write_just_debugaltlink $srcfile6 ${binfile}7.o $ok_buildid2
# Use 77 as the value so that if we load the bad debuginfo, we will
# see the wrong result.
write_dwarf_file $srcfile7 $bad_buildid 77
write_dwarf_file $srcfile8 $ok_buildid2

# Compile everything.
for {set i 2} {$i <= 8} {incr i} {
    if {[gdb_compile [standard_output_file [set srcfile$i]] \
	     ${binfile}$i.o object nodebug] != ""} {
	return -1
    }
}

# Copy a file into the .build-id place for the "fallback" test.
file copy -force -- ${binfile}8.o $basedir/$ok_prefix/$ok_suffix2.debug

proc do_test {} {
    clean_restart

    gdb_test_no_output "set debug-file-directory $::debugdir" \
	"set debug-file-directory"

    gdb_load ${::binfile}-${::testname}

    if {![runto_main]} {
	return
    }

    if {$::testname == "mismatch"} {
	gdb_test "print the_int" \
	    "(No symbol table is loaded|No symbol \"the_int\" in current context).*"
    } else {
	gdb_test "print the_int" " = 99"
    }
}

foreach_with_prefix testname { ok mismatch fallback } {
    if { $testname == "ok" } {
	set objs [list ${binfile}1.o ${binfile}2.o]
    } elseif { $testname == "mismatch" } {
	set objs [list ${binfile}1.o ${binfile}4.o]
    } elseif { $testname == "fallback" } {
	set objs [list ${binfile}1.o ${binfile}6.o]
    }

    if {[gdb_compile $objs ${binfile}-$testname executable {quiet}] != ""} {
	unsupported "compilation failed"
	continue
    }

    do_test
}