This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PING] [PATCH] D: Fix classification of module.type in lexer


Small ping on this.  I'm confident about the source change is pretty
much obvious, just want to make sure that the test is ok too.

---
The two-tier lexer, whose job is to resolve fully qualified names
missed a case where 'module.type' was not being classified as one
token.  And so when the Yacc grammar kicks in, it resolved the tokens
as "TypeExp . IdentifierExp", which then will never match the rule for
cast expressions "( TypeExp ) UnaryExpression".

Adding a case for TYPE_CODE_MODULE in type_aggregate_p means that
classify_inner_name will get a chance to look-up the symbol.

This was noticed when someone tried 'watch -l', and got the rather
confusing response:

A syntax error in expression, near `) 0x000000010'.

So it's been included in the testsuite, along with another test that
does effectively the same expression explicitly.
2017-01-07  Iain Buclaw  <ibuclaw@gdcproject.org>

gdb/ChangeLog:

	* d-exp.y (type_aggregate_p): Treat TYPE_CODE_MODULE as being
	aggregate-like.

gdb/testsuite/ChangeLog:

	* gdb.dlang/watch-loc.c: New file.
	* gdb.dlang/watch-loc.exp: New file.

---
diff --git a/gdb/d-exp.y b/gdb/d-exp.y
index 077e645..2dab00e 100644
--- a/gdb/d-exp.y
+++ b/gdb/d-exp.y
@@ -651,6 +651,7 @@ type_aggregate_p (struct type *type)
 {
   return (TYPE_CODE (type) == TYPE_CODE_STRUCT
 	  || TYPE_CODE (type) == TYPE_CODE_UNION
+	  || TYPE_CODE (type) == TYPE_CODE_MODULE
 	  || (TYPE_CODE (type) == TYPE_CODE_ENUM
 	      && TYPE_DECLARED_CLASS (type)));
 }
diff --git a/gdb/testsuite/gdb.dlang/watch-loc.c b/gdb/testsuite/gdb.dlang/watch-loc.c
new file mode 100644
index 0000000..725d1f1
--- /dev/null
+++ b/gdb/testsuite/gdb.dlang/watch-loc.c
@@ -0,0 +1,39 @@
+/* Copyright 2017 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/>.  */
+
+
+/* DWARF will describe these contents as being inside a D module.  */
+
+typedef struct tstruct
+{
+} tstruct;
+
+tstruct my_data;
+
+asm ("dmain_start: .globl dmain_start");
+
+int _Dmain (void)
+{
+  return 0;
+}
+
+asm ("dmain_end: .globl dmain_end");
+
+int
+main (void)
+{
+  return _Dmain ();
+}
+
diff --git a/gdb/testsuite/gdb.dlang/watch-loc.exp b/gdb/testsuite/gdb.dlang/watch-loc.exp
new file mode 100644
index 0000000..b34a102
--- /dev/null
+++ b/gdb/testsuite/gdb.dlang/watch-loc.exp
@@ -0,0 +1,86 @@
+# Copyright (C) 2017 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/>.
+
+# Test symbol lookup when there are multiple circular imports.
+
+load_lib "d-support.exp"
+load_lib "dwarf.exp"
+
+if { [skip_d_tests] } { return -1 }
+
+# This test can only be run on targets which support DWARF-2 and use gas.
+if {![dwarf2_support]} {
+    return 0
+}
+
+standard_testfile watch-loc.c watch-loc-dw.S
+
+# Make some DWARF for the test.
+set asm_file [standard_output_file $srcfile2]
+Dwarf::assemble $asm_file {
+    cu {} {
+	compile_unit {
+	    {language @DW_LANG_D}
+	} {
+	    declare_labels watch_module_label watch_struct_label
+
+	    extern dmain_start dmain_end
+
+	    watch_module_label: module {
+		{name watch}
+	    } {
+		watch_struct_label: structure_type {
+		    {name tstruct}
+		    {byte_size 1 data1}
+		}
+
+		tag_variable {
+		    {name my_data}
+		    {type :$watch_struct_label}
+		    {location {
+			addr [gdb_target_symbol my_data]
+		    } SPECIAL_expr}
+		    {external 1 flag}
+		}
+
+		subprogram {
+		    {name "D main"}
+		    {linkage_name "_Dmain"}
+		    {external 1 flag_present}
+		    {low_pc dmain_start addr}
+		    {high_pc dmain_end addr}
+		}
+	    }
+	}
+    }
+}
+
+if { [prepare_for_testing "failed to prepare" ${testfile} \
+          [list $srcfile $asm_file] {nodebug}] } {
+    return -1
+}
+
+gdb_test_no_output "set language d"
+
+if {![runto "_Dmain"]} {
+    return -1
+}
+
+# watch -l will rewrite the expression to "*(watch.tstruct *) 0x12345",
+# this should not cause syntax error in the cast expression.
+gdb_test "watch -l my_data" ".*atchpoint \[0-9\]+: -location my_data"
+
+# Same test as above, but done explicitly.
+gdb_test "print *(watch.tstruct *) &my_data" "{<No data fields>}"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]