]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/testsuite/gdb.base/style.exp
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / gdb / testsuite / gdb.base / style.exp
CommitLineData
1d506c26 1# Copyright 2018-2024 Free Software Foundation, Inc.
cbe56571
TT
2
3# This program is free software; you can redistribute it and/or modify
4# it under the terms of the GNU General Public License as published by
5# the Free Software Foundation; either version 3 of the License, or
6# (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11# GNU General Public License for more details.
12#
13# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.
15
e867795e
AB
16load_lib gdb-python.exp
17
cbe56571
TT
18# Test CLI output styling.
19
20standard_testfile
21
e7b43072 22# Compile the test executable.
9be5d742 23if {[build_executable "failed to build" $testfile $srcfile {debug macros}]} {
e7b43072
AB
24 return -1
25}
cbe56571 26
e7b43072
AB
27# The tests in this file are run multiple times with GDB's styles
28# disabled one at a time. This variable is the style that is
29# currently disabled.
30set currently_disabled_style ""
71ea2b6b 31
e7b43072
AB
32# A wrapper around the 'style' function found in gdb-utils.exp,
33# filter out requests for the disabled style.
34proc limited_style { str style } {
35 global currently_disabled_style
36
37 if { $style != $currently_disabled_style } {
38 return [style $str $style]
cbe56571
TT
39 }
40
e7b43072
AB
41 return $str
42}
bdfc1e8a 43
e7b43072
AB
44# A wrapper around 'clean_restart' from gdb.exp, this performs the
45# normal clean_restart, but then disables the currently disabled
46# style.
cce0ae56 47proc clean_restart_and_disable { prefix args } {
e7b43072 48 global currently_disabled_style
116d0cf1 49
cce0ae56
PA
50 with_test_prefix "$prefix" {
51 eval "clean_restart $args"
116d0cf1 52
cce0ae56
PA
53 if { $currently_disabled_style != "" } {
54 set st $currently_disabled_style
55 gdb_test_no_output "set style $st background none"
56 gdb_test_no_output "set style $st foreground none"
57 gdb_test_no_output "set style $st intensity normal"
58 }
e7b43072
AB
59 }
60}
cbe56571 61
e7b43072
AB
62# The core of this test script. Run some tests of different aspects
63# of GDB's styling.
64#
65# Within this proc always use LIMITED_STYLE instead of STYLE, and
66# CLEAN_RESTART_AND_DISABLE instead of CLEAN_RESTART, this ensures
67# that the test operates as expected as styles are disabled.
68proc run_style_tests { } {
9be5d742 69 global testfile srcfile hex binfile
e7b43072
AB
70 global currently_disabled_style decimal hex
71
4ebfd53d 72 with_ansi_styling_terminal {
e7b43072
AB
73 # Restart GDB with the correct TERM variable setting, this
74 # means that GDB will enable styling.
cce0ae56 75 clean_restart_and_disable "restart 1" ${binfile}
e7b43072
AB
76
77 set readnow [readnow]
78
79 if {![runto_main]} {
e7b43072
AB
80 return
81 }
cbe56571 82
e7b43072
AB
83 # Check that the source highlighter has not stripped away the
84 # leading newlines.
85 set main_line [gdb_get_line_number "break here"]
86 gdb_test "list $main_line,$main_line" "return.*some_called_function.*"
0bb296cb 87
e7b43072 88 gdb_test_no_output "set style enabled off"
d085f989 89
e7b43072
AB
90 set argv ""
91 gdb_test_multiple "frame" "frame without styling" {
31757702 92 -re -wrap "main \\(argc=.*, (argv=$hex.*)\\).*style\\.c:\[0-9\].*" {
e7b43072
AB
93 set argv $expect_out(1,string)
94 pass $gdb_test_name
95 }
96 }
af79b68d 97
e7b43072 98 gdb_test_no_output "set style enabled on"
d47032b7 99
e7b43072
AB
100 set main_expr [limited_style main function]
101 set base_file_expr [limited_style ".*style\\.c" file]
102 set file_expr "$base_file_expr:\[0-9\]+"
103 set arg_expr [limited_style "arg." variable]
116d0cf1 104
31757702
SL
105 # On some embedded targets that don't fully support argc/argv,
106 # argv may print as "0x0" or as an address with a symbol name
107 # following, so use a regexp general enough to match that and
108 # do not make assumptions about how long the address string is.
e7b43072 109 gdb_test "frame" \
a0087920 110 [multi_line \
31757702 111 "#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+$arg_expr=$hex.*\\)\\s+at\\s+$file_expr" \
e7b43072
AB
112 "\[0-9\]+\\s+.*return.* break here .*"]
113 gdb_test "info breakpoints" "$main_expr at $file_expr.*"
114
115 gdb_test_no_output "set style sources off"
116 gdb_test "frame" \
117 "\r\n\[^\033\]*break here.*" \
118 "frame without sources styling"
119 gdb_test_no_output "set style sources on"
120
121 gdb_test "break -q main" "file $base_file_expr.*"
122
123 gdb_test "print &main" " = .* [limited_style $hex address] <$main_expr>"
124
125 # Regression test for a bug where line-wrapping would occur at
126 # the wrong spot with styling. There were different bugs at
127 # different widths, so try two.
128 foreach width {20 30} {
129 set argv_len [string length $argv]
130 if { $argv_len == 0 } {
131 continue
132 }
133
134 # There was also a bug where the styling could be wrong in
135 # the line listing; this is why the words from the source
136 # code are spelled out in the final result line of the
137 # test.
31757702
SL
138 set re0_styled \
139 [multi_line \
140 "#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+$arg_expr=$hex\\)" \
141 "\\s+at\\s+$file_expr" \
142 "\[0-9\]+\\s+.*return.* break here .*"]
e7b43072
AB
143 set re1_styled \
144 [multi_line \
145 "#0\\s+$main_expr\\s+\\($arg_expr=$decimal,\\s+" \
31757702 146 "\\s+$arg_expr=$hex.*\\)" \
e7b43072
AB
147 "\\s+at\\s+$file_expr" \
148 "\[0-9\]+\\s+.*return.* break here .*"]
149 set re2_styled \
150 [multi_line \
151 "#0\\s+$main_expr\\s+\\($arg_expr=.*" \
31757702 152 "\\s+$arg_expr=$hex.*\\)\\s+at\\s+$file_expr" \
e7b43072
AB
153 "\[0-9\]+\\s+.*return.* break here .*"]
154
155 # The length of the line containing argv containing:
156 # - 4 leading spaces
157 # - argv string
158 # - closing parenthesis
159 set line_len [expr 4 + $argv_len + 1]
160
31757702
SL
161 if { $argv == "argv=0x0" && $width >= 27 } {
162 # Embedded target with no argv support.
163 # #0 main (argc=0, argv=0x0)
164 set re_styled $re0_styled
165 } elseif { $line_len > $width } {
e7b43072
AB
166 # At on the next line.
167 set re_styled $re1_styled
168 } else {
169 # At on the same line as argv.
170 set re_styled $re2_styled
171 }
172
cce0ae56
PA
173 # Override width for the duration of the command, letting
174 # GDB reset back to 0. Doing this in the loop rather than
175 # after, avoids trying to do "set width 30" while width is
176 # 20, which causes horizontal scrolling in the case that
177 # the fallback stub-termcap.c is used:
d0b39fc4
TV
178 # ^M<et width 30^M
179 # (gdb) FAIL: gdb.base/style.exp: all styles enabled: set width 30
cce0ae56
PA
180 gdb_test "with width $width -- frame" $re_styled \
181 "frame when width=$width"
d0b39fc4 182 }
116d0cf1 183
9be5d742
SM
184 set macro_line [gdb_get_line_number "\#define SOME_MACRO"]
185 gdb_test "info macro SOME_MACRO" \
186 "Defined at $base_file_expr:$macro_line\r\n#define SOME_MACRO 23"
6506371f 187
e7b43072
AB
188 gdb_test_no_output "set width 0"
189
e867795e
AB
190 # If disassembler styling is being done by the Python pygments
191 # module, then we can't be sure how the 'some_called_function'
192 # symbol will be styled. However, if pygments is not being
193 # used then we can know how the symbol name will be styled.
e7b43072 194 set main [limited_style main function]
e867795e
AB
195 if { $::python_disassembly_styling } {
196 set func "some_called_function"
197 } else {
198 set func [limited_style some_called_function function]
199 }
e7b43072
AB
200 # Somewhere should see the call to the function.
201 gdb_test "disassemble main" \
202 [concat "Dump of assembler code for function $main:.*" \
203 "[limited_style $hex address].*$func.*"]
204
205 set ifield [limited_style int_field variable]
206 set sfield [limited_style string_field variable]
207 set efield [limited_style e_field variable]
208 set evalue [limited_style VALUE_TWO variable]
e2c04ee0 209 set lhs [limited_style "\\\$$decimal" variable]
e7b43072 210 gdb_test "print struct_value" \
e2c04ee0 211 "$lhs = \{$ifield = 23,.*$sfield = .*,.*$efield = $evalue.*"
e7b43072 212
334381ea
TT
213 set ffield [limited_style field variable]
214 set cstart [string_to_regexp "/* XXX "]
215 set cend [string_to_regexp " */"]
216 set p1field [limited_style "$cstart.*$decimal.*-bit.*padding.*$cend" \
217 highlight]
218 set p2field [limited_style "$cstart.*$decimal.*-byte.*padding.*$cend" \
219 highlight]
220
221 gdb_test "ptype/o just_bitfield_value" \
222 [multi_line \
223 ".* type = struct just_bitfield {" \
224 ".* unsigned int $ffield : 3;" \
225 "$p1field" \
226 "$p2field" \
227 "" \
228 ".* total size.*: *$decimal *$cend" \
229 " *}.*"]
230
e7b43072
AB
231 set address_style_expr [limited_style ".*\".*address.*\".*style.*" address]
232 set color "blue"
233 if { $currently_disabled_style == "address" } {
234 set color "none"
235 }
236 gdb_test "show style address foreground" \
237 "The ${address_style_expr} foreground color is: ${color}" \
238 "style name and style word styled using its own style in show style"
046bebe1 239
e7b43072
AB
240 set aliases_expr [limited_style ".*aliases.*" title]
241 set breakpoints_expr [limited_style ".*breakpoints.*" title]
242 gdb_test "help" \
243 [multi_line \
244 "List of classes of commands:" \
245 "" \
246 "${aliases_expr} -- User-defined aliases of other commands\." \
247 "${breakpoints_expr} -- Making program stop at certain points\." \
248 ".*" \
249 ] \
250 "help classes of commands styled with title"
251
252 set taas_expr [limited_style ".*taas.*" title]
253 set tfaas_expr [limited_style ".*tfaas.*" title]
254 set cut_for_thre_expr [limited_style "cut for 'thre" highlight]
255 gdb_test "apropos -v cut for 'thre" \
256 [multi_line \
257 "" \
258 "${taas_expr}" \
259 "Apply a command to all .*" \
260 "Usage:.*" \
261 "short${cut_for_thre_expr}ad apply.*" \
262 "" \
263 "${tfaas_expr}" \
264 "Apply a command to all .*" \
265 "Usage:.*" \
266 "short${cut_for_thre_expr}ad apply.*" \
267 ]
268
cce0ae56 269 clean_restart_and_disable "restart 2"
e7b43072
AB
270
271 set quoted [string_to_regexp $binfile]
272 set pass_re "Reading symbols from [limited_style $quoted file]\.\.\."
273 if { $readnow } {
274 set pass_re \
275 [multi_line \
276 $pass_re \
277 "Expanding full symbols from [limited_style $quoted file]\.\.\."]
278 }
279 gdb_test "file $binfile" \
280 $pass_re \
bc6004df 281 "filename is styled when loading symbol file"
e7b43072
AB
282
283 gdb_test "pwd" "Working directory [limited_style .*? file].*"
284
285 gdb_test_no_output "set print repeat 3"
286 gdb_test "print {0,0,0,0,0,0,0,0}" \
287 " = \\{0 [limited_style {<repeats.*8.*times>} metadata]\\}"
288
289 gdb_test "show logging file" \
290 "The current logfile is \"[limited_style .*? file]\"\\..*"
291
292 # Check warnings are styled by setting a rubbish data
293 # directory.
294 gdb_test "set data-directory Makefile" \
295 "warning: [limited_style .*? file] is not a directory\\..*"
296 gdb_test "show data-directory" \
297 "GDB's data directory is \"[limited_style .*? file]\"\\..*"
298
299 # Check that deprecation styles command names.
300 gdb_test_no_output "maintenance deprecate p \"new_p\"" \
301 "maintenance deprecate p \"new_p\" /1/"
302 gdb_test "p 5" \
303 "Warning: '[limited_style p title]', an alias for the command '[limited_style print title]', is deprecated.*Use '[limited_style new_p title]'.*" \
304 "p deprecated warning, with replacement"
9d2d8a16
AB
305
306 # Check that the version string is styled in the output of 'show
307 # version', and that this styling can be disabled.
308 set vers [style "GNU gdb.*" version]
8839e3f3
TT
309 set url [limited_style "http:.*html" file]
310 gdb_test "show version" "${vers}.*<$url>.*" \
311 "'show version' is styled"
e7b43072
AB
312 }
313}
3f0cbb04 314
e867795e
AB
315# Check that disassembler styling can be disabled. The function that
316# we are disassembling has some minimal styling applied even if the
317# Python pygments module is not available, so, when we disable
318# disassembler styling, we should always see a change in output.
319proc test_disable_disassembler_styling { } {
4ebfd53d 320 save_vars { env(TERM) env(NO_COLOR) } {
e867795e
AB
321 # We need an ANSI-capable terminal to get the output.
322 setenv TERM ansi
4ebfd53d 323 setenv NO_COLOR ""
e867795e
AB
324
325 # Restart GDB with the correct TERM variable setting, this
326 # means that GDB will enable styling.
cce0ae56 327 clean_restart_and_disable "restart 3" $::binfile
e867795e
AB
328
329 set styled_hex [limited_style $::hex address]
330 set main [limited_style main function]
331
5b0e2b48
AB
332 foreach_with_prefix libopcodes { on off } {
333
334 set command_failed false
335 gdb_test_multiple "maint set libopcodes-styling enabled ${libopcodes}" "" {
336 -re "^maint set libopcodes-styling enabled ${libopcodes}\r\n" {
e867795e
AB
337 exp_continue
338 }
5b0e2b48
AB
339
340 -re "Use of libopcodes styling not supported on architecture \[^\r\n\]+\r\n" {
341 set command_failed true
e867795e
AB
342 exp_continue
343 }
5b0e2b48
AB
344
345 -re "^$::gdb_prompt $" {
346 gdb_assert { !$command_failed || [string equal $libopcodes "on"] } \
347 $gdb_test_name
e867795e 348 }
5b0e2b48
AB
349 }
350
351 if { $libopcodes == "on" && $command_failed } {
352 # We tried to turn on libopcodes disassembler styling,
353 # but this is not supported on this architecture.
354 continue
355 }
356
357 foreach_with_prefix disasm_styling { on off } {
358 gdb_test_no_output "set style disassembler enabled ${disasm_styling}"
359
360 if { $libopcodes == "off" && $disasm_styling == "on" \
361 && !$::python_disassembly_styling} {
362 # We have libopcodes based styling off, but
363 # disassembler styling turned on. We're expecting
364 # Python Pygments to be used to add styling.
365 #
366 # However, if we get here, then we don't have the
367 # Pygments module, so skip this test.
368 continue
e867795e 369 }
5b0e2b48
AB
370
371 set saw_header_line false
372 set saw_styled_output_line false
373 set saw_unstyled_output_line false
374 gdb_test_multiple "disassemble main" "" {
375 -re "disassemble main\r\n" {
376 exp_continue
377 }
378 -re "^Dump of assembler code for function $main:" {
379 set saw_header_line true
380 exp_continue
381 }
382 -re "^\\s+${styled_hex}\\s+<\[^>\]+>:\\s+\[^\r\n\033\]+\r\n" {
383 set saw_unstyled_output_line true
384 exp_continue
385 }
386 -re "^\\s+${styled_hex}\\s+<\[^>\]+>:\\s+\[^\r\n\]+\033\[^\r\n\]+\r\n" {
387 set saw_styled_output_line true
388 exp_continue
389 }
390 -re "^End of assembler dump\\.\r\n" {
391 exp_continue
392 }
393 -re "^$::gdb_prompt $" {
394 gdb_assert { $saw_header_line }
395 if { $disasm_styling } {
396 gdb_assert { $saw_styled_output_line }
397 gdb_assert { !$saw_unstyled_output_line }
398 } else {
399 gdb_assert { !$saw_styled_output_line }
400 gdb_assert { $saw_unstyled_output_line }
401 }
e867795e
AB
402 }
403 }
404 }
405 }
406 }
407}
408
f22c50c2
AB
409# Disassemble a single isntruction at the start of main, then strip
410# off the address and symbol information, returning just the
411# disassembled instruction part.
412proc get_single_disassembled_insn {} {
413 set disasm_line [capture_command_output "x/1i *main" ""]
414 regexp "^\[^:\]+:\\s*(.*)$" $disasm_line whole_match insn
415 return $insn
416}
417
418# Check that, if the user is using Python Pygments for disassembler
419# styling, then the styling correctly switches off when an error is
420# detected in the Python code.
421proc test_disassembler_error_handling { } {
422
423 # This test requires the Python Pygments module to be installed
424 # and used by GDB.
425 if { !$::python_disassembly_styling } {
426 return
427 }
428
4ebfd53d 429 save_vars { env(TERM) env(NO_COLOR) } {
f22c50c2
AB
430 # We need an ANSI-capable terminal to get the output.
431 setenv TERM ansi
4ebfd53d 432 setenv NO_COLOR ""
f22c50c2
AB
433
434 # Restart GDB with the correct TERM variable setting, this
435 # means that GDB will enable styling.
436 clean_restart_and_disable "restart 4" $::binfile
437
438 # Disable use of libopcodes for styling. As this function is
439 # only called when Python Pygments module is available, we
440 # should now be using that module to style the disassembler
441 # output.
442 gdb_test_no_output "maint set libopcodes-styling enabled off"
443
444 # Disassemble a single instruction and ensure that the output
445 # has styling markers in it.
446 set insn_before [get_single_disassembled_insn]
447 gdb_assert { [regexp "\033" $insn_before] } \
448 "have style markers when Pygments is working fine"
449
450 # Now replace the standard function that colorizes the
451 # disassembler output, with a new function that always returns
452 # None, this should cause GDB to stop using the Pygments
453 # module for disassembler styling.
454 gdb_py_test_silent_cmd \
455 [multi_line_input \
456 "python" \
457 "def replacement_colorize_disasm(content,gdbarch):" \
458 " return None" \
459 "gdb.styling.colorize_disasm = replacement_colorize_disasm" \
f91822c2 460 "end"] \
f22c50c2
AB
461 "setup replacement colorize_disasm function" \
462 true
463
464 set insn_after [get_single_disassembled_insn]
465 gdb_assert { ![regexp "\033" $insn_after] } \
466 "have no style markers when Pygments is broken"
467 }
468}
469
e7b43072
AB
470# A separate test from the above as the styled text this checks can't
471# currently be disabled (the text is printed too early in GDB's
472# startup process).
473proc test_startup_version_string { } {
d47032b7 474 gdb_exit
31c50280
TV
475
476 save_vars { ::INTERNAL_GDBFLAGS } {
477 set ::INTERNAL_GDBFLAGS [string map {"-q" ""} $::INTERNAL_GDBFLAGS]
478
479 gdb_spawn
480 }
d47032b7 481
e7b43072
AB
482 # Deliberate use of base STYLE proc here as the style of the
483 # startup version string can't (currently) be controlled.
9d2d8a16 484 set vers [style "GNU gdb.*" version]
e7b43072
AB
485 gdb_test "" "${vers}.*" "version is styled at startup"
486}
487
e867795e
AB
488# Check to see if the Python styling of disassembler output is
489# expected or not, this styling requires Python support in GDB, and
490# the Python pygments module to be available.
491clean_restart ${binfile}
d82e5429 492if {[allow_python_tests] && [gdb_py_module_available "pygments"]} {
e867795e
AB
493 set python_disassembly_styling true
494} else {
495 set python_disassembly_styling false
496}
e7b43072
AB
497
498# Run tests with all styles in their default state.
499with_test_prefix "all styles enabled" {
500 run_style_tests
501}
502
503# Now, for each style in turn. Disable that style only and run the
504# test again. Things in that style should NOT now be styled.
505foreach style { title file function highlight variable \
506 address metadata } {
507 set currently_disabled_style $style
508 with_test_prefix "disable style $style" {
509 run_style_tests
71ea2b6b 510 }
cbe56571 511}
e7b43072 512
e867795e 513# Check that the disassembler styling can be disabled.
5b0e2b48 514test_disable_disassembler_styling
e867795e 515
f22c50c2
AB
516# Check that GDB handles an error in the Python Pygments disassembly
517# styling code.
518test_disassembler_error_handling
519
e7b43072
AB
520# Finally, check the styling of the version string during startup.
521test_startup_version_string