aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2017-03-15 15:44:45 -0700
committerDoug Evans <dje@google.com>2017-03-16 09:31:29 -0700
commita7c0469f992721b30665ba92f4f2f74d29032a84 (patch)
treea969a42f1d28f0d33360ecbdb053d947974182d3 /gdb/testsuite
parent34b433203b5f56149c27a8dfea21a921392cb158 (diff)
downloadgdb-a7c0469f992721b30665ba92f4f2f74d29032a84.zip
gdb-a7c0469f992721b30665ba92f4f2f74d29032a84.tar.gz
gdb-a7c0469f992721b30665ba92f4f2f74d29032a84.tar.bz2
Copy lazy string handling fixes from Python.
This patch keeps the Scheme side of lazy string handling in sync with the python size, bringing over fixes for PRs python/17728, python/18439, python/18779. gdb/ChangeLog: * guile/scm-lazy-string.c (lazy_string_smob): Clarify use of LENGTH member. Change type of TYPE member to SCM. All uses updated. (lsscm_make_lazy_string_smob): Add assert. (lsscm_make_lazy_string): Flag bad length values. (lsscm_elt_type): New function. (gdbscm_lazy_string_to_value): Rewrite to use lsscm_safe_lazy_string_to_value. (lsscm_safe_lazy_string_to_value): Fix handling of TYPE_CODE_PTR. * guile/scm-value.c (gdbscm_value_to_lazy_string): Flag bad length values. Fix TYPE_CODE_PTR. Handle TYPE_CODE_ARRAY. Handle typedefs in incoming type. * guile/guile-internal.h (tyscm_scm_to_type): Declare. * guile/scm-type.c (tyscm_scm_to_type): New function. gdb/testsuite/ChangeLog: * gdb.guile/scm-value.c (main) Delete locals sptr, sn. * gdb.guile/scm-lazy-string.c: New file. * gdb.guile/scm-value.exp: Move lazy string tests to ... * gdb.guile/scm-lazy-string.exp: ... here, new file. Add more tests for pointer, array, typedef lazy strings.
Diffstat (limited to 'gdb/testsuite')
-rw-r--r--gdb/testsuite/ChangeLog8
-rw-r--r--gdb/testsuite/gdb.guile/scm-lazy-string.c29
-rw-r--r--gdb/testsuite/gdb.guile/scm-lazy-string.exp82
-rw-r--r--gdb/testsuite/gdb.guile/scm-value.c2
-rw-r--r--gdb/testsuite/gdb.guile/scm-value.exp31
5 files changed, 119 insertions, 33 deletions
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 92138a4..39ff712 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -6,6 +6,14 @@
=======
2017-03-15 Doug Evans <dje@google.com>
+ * gdb.guile/scm-value.c (main) Delete locals sptr, sn.
+ * gdb.guile/scm-lazy-string.c: New file.
+ * gdb.guile/scm-value.exp: Move lazy string tests to ...
+ * gdb.guile/scm-lazy-string.exp: ... here, new file. Add more tests
+ for pointer, array, typedef lazy strings.
+
+2017-03-15 Doug Evans <dje@google.com>
+
PR python/17728, python/18439, python/18779
* gdb.python/py-value.c (main) Delete locals sptr, sn.
* gdb.python/py-lazy-string.c (pointer): New typedef.
diff --git a/gdb/testsuite/gdb.guile/scm-lazy-string.c b/gdb/testsuite/gdb.guile/scm-lazy-string.c
new file mode 100644
index 0000000..936b4e2
--- /dev/null
+++ b/gdb/testsuite/gdb.guile/scm-lazy-string.c
@@ -0,0 +1,29 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+ Copyright 2015-2016 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/>. */
+
+typedef const char *pointer;
+
+int
+main ()
+{
+ const char *ptr = "pointer";
+ const char array[] = "array";
+ pointer typedef_ptr = "typedef pointer";
+ const char *null = 0;
+
+ return 0; /* break here */
+}
diff --git a/gdb/testsuite/gdb.guile/scm-lazy-string.exp b/gdb/testsuite/gdb.guile/scm-lazy-string.exp
new file mode 100644
index 0000000..a3ab441
--- /dev/null
+++ b/gdb/testsuite/gdb.guile/scm-lazy-string.exp
@@ -0,0 +1,82 @@
+# Copyright (C) 2008-2016 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 file is part of the GDB testsuite.
+# It tests the mechanism exposing lazy strings to Guile.
+
+load_lib gdb-guile.exp
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+ return
+}
+
+# Skip all tests if Guile scripting is not enabled.
+if { [skip_guile_tests] } { continue }
+
+#gdb_install_guile_utils
+#gdb_install_guile_module
+
+# The following tests require execution.
+
+if ![gdb_guile_runto_main] {
+ fail "Can't run to main"
+ return
+}
+
+gdb_breakpoint [gdb_get_line_number "break here"]
+gdb_continue_to_breakpoint "break here"
+
+gdb_scm_test_silent_cmd "gu (define null (parse-and-eval \"null\"))" 1
+
+gdb_scm_test_silent_cmd "gu (define nullstr (value->lazy-string null #:length 0))" "create a null lazy string" 1
+gdb_test "gu (print (lazy-string-length nullstr))" "= 0" "null lazy string length"
+gdb_test "gu (print (lazy-string-address nullstr))" "= 0" "null lazy string address"
+gdb_test "gu (print (lazy-string-type nullstr))" "const char \\*" "null lazy string type"
+gdb_test "gu (print (lazy-string->value nullstr))" \
+ "Out of range: cannot create a value from NULL.*Error while executing Scheme code." \
+ "create value from NULL"
+gdb_test "gu (print (lazy-string->value (value->lazy-string null #:length 3)))" \
+ "Out of range: cannot create a lazy string with address 0x0, and a non-zero length.*Error while executing Scheme code." \
+ "null lazy string with non-zero length"
+gdb_test "gu (print (value->lazy-string null #:length -2))" \
+ "Out of range: invalid length.*Error while executing Scheme code." \
+ "bad length"
+
+foreach var_spec { { "ptr" "pointer" "const char \\*" -1 } \
+ { "array" "array" "const char \\[6\\]" 6 } \
+ { "typedef_ptr" "typedef pointer" "pointer" -1 } } {
+ set var [lindex $var_spec 0]
+ set value [lindex $var_spec 1]
+ set type [lindex $var_spec 2]
+ set length [lindex $var_spec 3]
+ with_test_prefix $var {
+ gdb_test "print $var" "\"$value\""
+ gdb_scm_test_silent_cmd "gu (define $var (history-ref 0))" "get value from history" 1
+ gdb_scm_test_silent_cmd "gu (define l$var (value->lazy-string $var))" "acquire lazy string" 1
+ gdb_test "gu (print (value-type $var))" "$type" "string type name equality"
+ gdb_test "gu (print (lazy-string-type l$var))" "$type" "lazy-string type name equality"
+ gdb_test "gu (print (lazy-string-length l$var))" "$length" "lazy string length"
+ gdb_test "gu (print (lazy-string->value l$var))" "\"$value\"" "lazy string value"
+ gdb_scm_test_silent_cmd "gu (define l2$var (value->lazy-string $var #:length 2))" "acquire lazy string, length 2" 1
+ gdb_test "gu (print (lazy-string-length l2$var))" "2" "lazy string length 2"
+ gdb_test "gu (print (lazy-string->value l2$var))" "\"[string range $value 0 1]\"" "lazy string length 2 value"
+ # This test will have to wait until gdb can handle it. There's no way,
+ # currently, to internally specify an array of length zero in the C
+ # language support. PR 20786
+ #gdb_test "gu (print (lazy-string->value (value->lazy-string $var #:length 0)))" "\"\"" "empty lazy string value"
+ }
+}
diff --git a/gdb/testsuite/gdb.guile/scm-value.c b/gdb/testsuite/gdb.guile/scm-value.c
index d4fd369..80385c7 100644
--- a/gdb/testsuite/gdb.guile/scm-value.c
+++ b/gdb/testsuite/gdb.guile/scm-value.c
@@ -81,13 +81,11 @@ main (int argc, char *argv[])
char nullst[17] = "divide\0et\0impera";
void (*fp1) (void) = &func1;
int (*fp2) (int, int) = &func2;
- const char *sptr = "pointer";
const char *embed = "embedded x\201\202\203\204";
int a[3] = {1,2,3};
int *p = a;
int i = 2;
int *ptr_i = &i;
- const char *sn = 0;
s.a = 3;
s.b = 5;
u.a = 7;
diff --git a/gdb/testsuite/gdb.guile/scm-value.exp b/gdb/testsuite/gdb.guile/scm-value.exp
index b3c236c..2a27612 100644
--- a/gdb/testsuite/gdb.guile/scm-value.exp
+++ b/gdb/testsuite/gdb.guile/scm-value.exp
@@ -213,36 +213,6 @@ proc test_strings {} {
"restore target-charset"
}
-proc test_lazy_strings {} {
- global hex
-
- gdb_test "print sptr" "\"pointer\""
- gdb_scm_test_silent_cmd "gu (define sptr (history-ref 0))" \
- "lazy strings: get sptr value from history"
-
- gdb_scm_test_silent_cmd "gu (define lstr (value->lazy-string sptr))" \
- "Aquire lazy string"
- gdb_test "gu (print (lazy-string-type lstr))" \
- "= const char \*." "Test lazy-string type name equality"
- gdb_test "gu (print (value-type sptr))" \
- "= const char \*." "Test string type name equality"
-
- # Prevent symbol on address 0x0 being printed.
- gdb_test_no_output "set print symbol off"
- gdb_test "print sn" "0x0"
-
- gdb_scm_test_silent_cmd "gu (define snptr (history-ref 0))" \
- "lazy strings: get snptr value from history"
- gdb_test "gu (define snstr (value->lazy-string snptr #:length 5))" \
- ".*cannot create a lazy string with address.*" "Test lazy string"
- gdb_scm_test_silent_cmd "gu (define snstr (value->lazy-string snptr #:length 0))" \
- "Successfully create a lazy string"
- gdb_test "gu (print (lazy-string-length snstr))" \
- "= 0" "Test lazy string length"
- gdb_test "gu (print (lazy-string-address snstr))" \
- "= 0" "Test lazy string address"
-}
-
proc test_inferior_function_call {} {
global gdb_prompt hex decimal
@@ -457,7 +427,6 @@ if ![gdb_guile_runto_main] {
test_value_in_inferior
test_inferior_function_call
test_strings
-test_lazy_strings
test_value_after_death
# Test either C or C++ values.