From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434]) by sourceware.org (Postfix) with ESMTPS id DC3EA386EC0E for ; Wed, 30 Mar 2022 10:24:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org DC3EA386EC0E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wr1-x434.google.com with SMTP id a1so28556052wrh.10 for ; Wed, 30 Mar 2022 03:24:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:in-reply-to:message-id:references :user-agent:mime-version; bh=lCGS7U7+aMxuGj3ZOGhSfnTj3nfpxPYiK23vNpgajg8=; b=W7Jhd/4ogcMSJ+8J4kgvSN0r4FGTB4VtJpW9iyjI2Q+5bHC3iH7EJ8Lfweo/T3OBni VRp9Q4Q5paH/n60RpZajWJpxsa/eI3xCfUYKdeL1hRdkFGoDqU2hunK2dSbJ8sHJ8olD OPse7i6e5Gzu9U89ROp6b2VyfdcF030PRVpCiGm2o4bm4Fs3lczYyfRlcJ3ajBVG4iCy aPILyykoT+Jftd5eSIGw99/PZZJ9b6bvJl/uuhFgcRhAy+V7azsMpFDyQFgwhCLAVmyP vbhCUKh/U5GRjfd/qHJ3QYI/Q66ULd6Ff2O2rmoO/n8JC/m9GbB8FHtEGZJLnMrX02Nr uqfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:in-reply-to:message-id :references:user-agent:mime-version; bh=lCGS7U7+aMxuGj3ZOGhSfnTj3nfpxPYiK23vNpgajg8=; b=26YA5nZJGmPvKMtmHQlw/5OEGFhKXnTn9UoM8zfg7Ah+DjHWnqvYs6ah2KUjXxOaai Spj49sK35McX4TXWkvRoSDCopL932l4P4O7KXgjrd9/tIACFX9+G6LZrIARlMyBD7IPo yWKG3KrcIb38YyZw2SeIh212RMivxajZ5ihMyWQ/BaLkCcAWtuDYWLrlawx6/lq7sxqW X9DTdF5lsgLgS2T5bXYS78st26aVp6CuMfp5VHXr2q08Mlg+D/U4cmqGc+c7wz/Gibtb B1Y1nKyT0+5r23ts6z/6IQ3x8uYgGNY6i2AeOt528maDUPx53QgoFZe8B6bofCjjm3rB j7Og== X-Gm-Message-State: AOAM532jVnlqj8tcsg5O5rTlm8uk0LVOWPFXN6FQHUfUmkRAVVVC1KEM LKBXFCnDjrxHqNiVROP8jgYg9I045dFUfQ== X-Google-Smtp-Source: ABdhPJyNqOWSvVnJVhZBk1Lx4PwWq+lLW7uSxkOqHVaN4atRyZuMeSOOEpN/TZ2IFyDLyIJGWeIM4w== X-Received: by 2002:a5d:5986:0:b0:205:87ae:9e18 with SMTP id n6-20020a5d5986000000b0020587ae9e18mr36230997wri.537.1648635887528; Wed, 30 Mar 2022 03:24:47 -0700 (PDT) Received: from [192.168.0.201] ([212.69.42.53]) by smtp.gmail.com with ESMTPSA id p125-20020a1c2983000000b00389cc36a3bfsm4601204wmp.6.2022.03.30.03.24.46 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 30 Mar 2022 03:24:47 -0700 (PDT) Date: Wed, 30 Mar 2022 11:24:46 +0100 (BST) From: "Maciej W. Rozycki" To: gdb-patches@sourceware.org cc: Andrew Burgess , Simon Marchi , Tom Tromey , Simon Sobisch Subject: [PATCH v5 8/8] GDB/testsuite: Expand for character string limiting options In-Reply-To: Message-ID: References: User-Agent: Alpine 2.20 (DEB 67 2015-01-07) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-2.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, KAM_ASCII_DIVIDERS, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 30 Mar 2022 10:24:52 -0000 From: Andrew Burgess Modify test cases that verify the operation of the array element limit with character strings such that they are executed twice, once with the `set print characters' option set to `elements' and the limit controlled with the `set print elements' option, and then again with the limit controlled with the `set print characters' option instead. Similarly with the `-elements' and `-characters' options for the `print' command. Additionally verify that said `print' command options combined yield the expected result. There are new tests for Ada and Pascal, as the string printing code for these languages is different than the generic string printing code used by other languages. Modula2 also has different string printing code, but (a) this is similar to Pascal, and (b) there are no existing modula2 tests written in Modula2, so I'm not sure how I'd even test the Modula2 string printing. Co-Authored-By: Maciej W. Rozycki --- No changes from v4. Changes from v3: - split off from what is now 7/8; see the change log there for earlier changes, - remove test case modifications to switch from the `set print elements' command to `set print characters'; instead run them twice with each of the two commands verified, - likewise with the `print -elements' and `print -characters' commands, - also cover `print -elements ... -characters ...', i.e. both options combined, - expand the Ada and Pascal test cases to cover `set print characters elements' too. --- gdb/testsuite/gdb.ada/str_chars.exp | 70 +++++++++++++++++++++++ gdb/testsuite/gdb.ada/str_chars/foo.adb | 26 ++++++++ gdb/testsuite/gdb.base/printcmds.exp | 77 ++++++++++++++++++-------- gdb/testsuite/gdb.pascal/str-chars.exp | 56 ++++++++++++++++++ gdb/testsuite/gdb.pascal/str-chars.pas | 28 +++++++++ gdb/testsuite/gdb.python/py-format-string.exp | 47 ++++++++++----- 6 files changed, 266 insertions(+), 38 deletions(-) gdb-aburgess-print-elements-characters-test.diff Index: src/gdb/testsuite/gdb.ada/str_chars.exp =================================================================== --- /dev/null +++ src/gdb/testsuite/gdb.ada/str_chars.exp @@ -0,0 +1,70 @@ +# Copyright 2022 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 . + +# Test GDB's 'set print characters' setting works for Ada strings. + +load_lib "ada.exp" + +if { [skip_ada_tests] } { return -1 } + +standard_ada_testfile foo + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb] +if ![runto "foo.adb:$bp_location" ] then { + return -1 +} + +gdb_test "print Arg" \ + " = \"abcdefghijklmnopqrstuvwxyz\"" \ + "print with default settings" + +gdb_test_no_output "set print characters 26" +gdb_test "print Arg" \ + " = \"abcdefghijklmnopqrstuvwxyz\"" \ + "print with character limit of 26" + +gdb_test "print -characters 11 -- Arg" \ + " = \"abcdefghijk\"\\.\\.\\." \ + "print with character limit of 11" + +gdb_test_no_output "set print characters 10" +gdb_test "print Arg" \ + " = \"abcdefghij\"\\.\\.\\." \ + "print with character limit of 10" + +gdb_test_no_output "set print characters unlimited" +gdb_test "print Arg" \ + " = \"abcdefghijklmnopqrstuvwxyz\"" \ + "print with unlimited character limit" + +# The 'set print elements' command used to control printing of characters +# in a string, before we created 'set print characters'. This test makes +# sure that 'set print elements' doens't effect string printing any more. +gdb_test_no_output "set print elements 12" +gdb_test "print Arg" \ + " = \"abcdefghijklmnopqrstuvwxyz\"" \ + "print with unlimited character limit, but lower element limit" + +# Except when 'set print characters elements' has been used. +gdb_test_no_output "set print characters elements" +gdb_test "print Arg" \ + " = \"abcdefghijkl\"\\.\\.\\." \ + "print with character limit of elements" Index: src/gdb/testsuite/gdb.ada/str_chars/foo.adb =================================================================== --- /dev/null +++ src/gdb/testsuite/gdb.ada/str_chars/foo.adb @@ -0,0 +1,26 @@ +-- Copyright 2022 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 . + +procedure Foo is + + procedure Blah (Arg : String) is + begin + null; -- STOP + end; + +begin + + Blah ("abcdefghijklmnopqrstuvwxyz"); +end Foo; Index: src/gdb/testsuite/gdb.base/printcmds.exp =================================================================== --- src.orig/gdb/testsuite/gdb.base/printcmds.exp +++ src/gdb/testsuite/gdb.base/printcmds.exp @@ -453,11 +453,12 @@ proc test_print_all_chars {} { # Test interaction of the number of print elements to print and the # repeat count, set to the default of 10. -proc test_print_repeats_10 {} { +proc test_print_repeats_10_one { setting } { global gdb_prompt decimal for { set x 1 } { $x <= 16 } { incr x } { - gdb_test_no_output "set print elements $x" "elements $x repeats" + gdb_test_no_output "set print $setting $x" \ + "set print $setting $x repeats" for { set e 1 } { $e <= 16 } {incr e } { set v [expr $e - 1] set command "p &ctable2\[${v}*16\]" @@ -497,11 +498,19 @@ proc test_print_repeats_10 {} { set xstr "${xstr}\[.\]\[.\]\[.\]" } set string " = \[(\]unsigned char \[*\]\[)\] ${a}${xstr}" - gdb_test "$command" "$string" "$command with print elements set to $x" + gdb_test "$command" "$string" \ + "$command with print $setting set to $x" } } } +proc test_print_repeats_10 {} { + foreach_with_prefix setting { "elements" "characters" } { + test_print_repeats_10_one $setting + } + gdb_test_no_output "set print characters elements" +} + # This tests whether GDB uses the correct element content offsets # (relative to the complete `some_struct' value) when counting value # repetitions. @@ -514,43 +523,38 @@ proc test_print_repeats_embedded_array { "correct element repeats in array embedded at offset > 0" } -proc test_print_strings {} { +proc test_print_strings_one { setting } { global gdb_prompt decimal # We accept "(unsigned char *) " before the string. char vs. unsigned char # is already tested elsewhere. - # Test that setting print elements unlimited doesn't completely suppress - # printing; this was a bug in older gdb's. - gdb_test_no_output "set print elements 0" - gdb_test "p teststring" \ - " = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 0" - gdb_test_no_output "set print elements 1" + gdb_test_no_output "set print $setting 1" gdb_test "p teststring" \ - " = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with elements set to 1" - gdb_test_no_output "set print elements 5" + " = (.unsigned char .. )?\"t\"\\.\\.\\." "p teststring with $setting set to 1" + gdb_test_no_output "set print $setting 5" gdb_test "p teststring" \ - " = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with elements set to 5" - gdb_test_no_output "set print elements 19" + " = (.unsigned char .. )?\"tests\"\\.\\.\\." "p teststring with $setting set to 5" + gdb_test_no_output "set print $setting 19" gdb_test "p teststring" \ - " = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 19" - gdb_test_no_output "set print elements 20" + " = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 19" + gdb_test_no_output "set print $setting 20" gdb_test "p teststring" \ - " = (.unsigned char .. )?\"teststring contents\"" "p teststring with elements set to 20" + " = (.unsigned char .. )?\"teststring contents\"" "p teststring with $setting set to 20" - gdb_test "p -elements 1 -- teststring" \ + gdb_test "p -$setting 1 -- teststring" \ " = (.unsigned char .. )?\"t\"\\.\\.\\." - gdb_test "p -elements 5 -- teststring" \ + gdb_test "p -$setting 5 -- teststring" \ " = (.unsigned char .. )?\"tests\"\\.\\.\\." - gdb_test "p -elements 19 -- teststring" \ + gdb_test "p -$setting 19 -- teststring" \ " = (.unsigned char .. )?\"teststring contents\"" - gdb_test "p -elements 20 -- teststring" \ + gdb_test "p -$setting 20 -- teststring" \ " = (.unsigned char .. )?\"teststring contents\"" gdb_test "print teststring2" \ " = \\(charptr\\) \"more contents\"" - gdb_test_no_output "set print elements 8" + gdb_test_no_output "set print $setting 8" # Set the target-charset to ASCII, because the output varies from # different charset. @@ -622,6 +626,35 @@ proc test_print_strings {} { gdb_test "p &ctable1\[31*8\]" \ " = \\(unsigned char \\*\\) \"\\\\370\\\\371\\\\372\\\\373\\\\374\\\\375\\\\376\\\\377\"..." } + + gdb_test_no_output "set print $setting unlimited" +} + +proc test_print_strings {} { + + # Test that setting print elements unlimited doesn't completely suppress + # printing; this was a bug in older gdb's. + gdb_test_no_output "set print elements 0" + gdb_test "p teststring" \ + " = (.unsigned char .. )?\"teststring contents\"" \ + "p teststring with elements set to 0" + + gdb_test "set print characters 0" "integer 0 out of range" + + foreach_with_prefix setting { "elements" "characters" } { + test_print_strings_one $setting + } + + gdb_test "p -elements 8 -- teststring" \ + " = (.unsigned char .. )?\"teststring contents\"" + gdb_test "p -characters 8 -- teststring" \ + " = (.unsigned char .. )?\"teststri\"\\.\\.\\." + gdb_test "p -elements 8 -characters elements -- teststring" \ + " = (.unsigned char .. )?\"teststri\"\\.\\.\\." + + with_test_prefix strings { + gdb_test_no_output "set print characters elements" + } } proc test_print_int_arrays {} { Index: src/gdb/testsuite/gdb.pascal/str-chars.exp =================================================================== --- /dev/null +++ src/gdb/testsuite/gdb.pascal/str-chars.exp @@ -0,0 +1,56 @@ +# Copyright 2022 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 . + +load_lib "pascal.exp" + +standard_testfile .pas + +if {[gdb_compile_pascal "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ]] != "" } { + return -1 +} + +clean_restart ${testfile} +gdb_breakpoint ${srcfile}:[gdb_get_line_number "set breakpoint 1 here"] + +# Verify that "start" lands inside the right procedure. +if { [gdb_start_cmd] < 0 } { + untested start + return -1 +} + +gdb_continue_to_breakpoint "continue to breakpoint" + +gdb_test "print message" " = 'abcdefghijklmnopqrstuvwxyz'" \ + "print message with the default settings" + +gdb_test_no_output "set print elements 10" +gdb_test "print message" " = 'abcdefghij'\\.\\.\\." \ + "print message with 'print elements' set to 10" + +gdb_test_no_output "set print characters 20" +gdb_test "print message" " = 'abcdefghijklmnopqrst'\\.\\.\\." \ + "print message with 'print characters' set to 20" + +gdb_test_no_output "set print elements 15" +gdb_test "print message" " = 'abcdefghijklmnopqrst'\\.\\.\\." \ + "print message with 'print elements' set to 15" + +gdb_test_no_output "set print characters unlimited" +gdb_test "print message" " = 'abcdefghijklmnopqrstuvwxyz'" \ + "print message with 'print characters' set to unlimited" + +gdb_test_no_output "set print characters elements" +gdb_test "print message" " = 'abcdefghijklmno'\\.\\.\\." \ + "print message with 'print characters' set to elements" Index: src/gdb/testsuite/gdb.pascal/str-chars.pas =================================================================== --- /dev/null +++ src/gdb/testsuite/gdb.pascal/str-chars.pas @@ -0,0 +1,28 @@ +{ + Copyright 2022 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 . +} + +program str_char; + +var + message : string; + +begin + + message := 'abcdefghijklmnopqrstuvwxyz'; + writeln (message) { set breakpoint 1 here } + +end. Index: src/gdb/testsuite/gdb.python/py-format-string.exp =================================================================== --- src.orig/gdb/testsuite/gdb.python/py-format-string.exp +++ src/gdb/testsuite/gdb.python/py-format-string.exp @@ -632,13 +632,13 @@ proc_with_prefix test_static_members {} } # Test the max_elements option for gdb.Value.format_string. -proc_with_prefix test_max_elements {} { +proc test_max_string_one { setting unlimited } { global current_lang global default_pointer_regexp # 200 is the default maximum number of elements, so setting it should # not change the output. - set opts "max_elements=200" + set opts "max_$setting=200" with_test_prefix $opts { check_format_string "a_point_t" $opts check_format_string "a_point_t_pointer" $opts @@ -649,8 +649,10 @@ proc_with_prefix test_max_elements {} { check_format_string "a_binary_string" $opts check_format_string "a_binary_string_array" $opts check_format_string "a_big_string" $opts - check_format_string "an_array" $opts - check_format_string "an_array_with_repetition" $opts + if { $setting == "elements"} { + check_format_string "an_array" $opts + check_format_string "an_array_with_repetition" $opts + } check_format_string "a_symbol_pointer" $opts if { $current_lang == "c++" } { @@ -659,7 +661,7 @@ proc_with_prefix test_max_elements {} { } } - set opts "max_elements=3" + set opts "max_$setting=3" with_test_prefix $opts { check_format_string "a_point_t" $opts check_format_string "a_point_t_pointer" $opts @@ -676,9 +678,11 @@ proc_with_prefix test_max_elements {} { "\"hell\"..." check_format_string "a_big_string" $opts \ [get_cut_big_string 3] - check_format_string "an_array" $opts - check_format_string "an_array_with_repetition" $opts \ - "\\{1, 3 ...\\}" + if { $setting == "elements"} { + check_format_string "an_array" $opts + check_format_string "an_array_with_repetition" $opts \ + "\\{1, 3 ...\\}" + } check_format_string "a_symbol_pointer" $opts if { $current_lang == "c++" } { @@ -687,9 +691,9 @@ proc_with_prefix test_max_elements {} { } } - # Both 1,000 (we don't have that many elements) and 0 (unlimited) should + # Both 1,000 (we don't have that many elements) and unlimited should # mean no truncation. - foreach opts { "max_elements=1000" "max_elements=0" } { + foreach opts [list "max_$setting=1000" "max_$setting=$unlimited"] { with_test_prefix $opts { check_format_string "a_point_t" $opts check_format_string "a_point_t_pointer" $opts @@ -701,8 +705,10 @@ proc_with_prefix test_max_elements {} { check_format_string "a_binary_string_array" $opts check_format_string "a_big_string" $opts \ [get_cut_big_string 1000] - check_format_string "an_array" $opts - check_format_string "an_array_with_repetition" $opts + if { $setting == "elements"} { + check_format_string "an_array" $opts + check_format_string "an_array_with_repetition" $opts + } check_format_string "a_symbol_pointer" $opts if { $current_lang == "c++" } { @@ -712,15 +718,24 @@ proc_with_prefix test_max_elements {} { } } - with_temp_option "set print elements 4" "set print elements 200" { + with_temp_option "set print $setting 4" "set print $setting 200" { check_format_string "a_string" "" \ "${default_pointer_regexp} \"hell\"..." check_format_string "a_binary_string" "" \ "${default_pointer_regexp} \"hell\"..." check_format_string "a_binary_string_array" "" \ "\"hell\"..." - check_format_string "an_array_with_repetition" "" \ - "\\{1, 3 ...\\}" + if { $setting == "elements"} { + check_format_string "an_array_with_repetition" "" \ + "\\{1, 3 ...\\}" + } + } +} + +proc_with_prefix test_max_string {} { + foreach_with_prefix setting { "elements" "characters" } { + test_max_string_one $setting \ + [string map {elements 0 characters 4294967295} $setting] } } @@ -1013,7 +1028,7 @@ proc_with_prefix test_all_common {} { test_deref_refs test_actual_objects test_static_members - test_max_elements + test_max_string test_max_depth test_repeat_threshold test_format