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]

[patch] Tweak output of -var-info-path-expression


Hi,

I'd like to re-submit a workaround I posted about a year ago,
but never followed through with.

Full explanation can be found here (with session showing
the problem):
http://sourceware.org/ml/gdb-patches/2010-09/msg00204.html

Basically, because of Bug 11912 "C++ name lookup fails"
using the result of -var-info-path-expression can 
sometimes cause a syntax error.
Trying to work around it in Eclipse worries me as we'd have
to create the result of -var-info-path-expression ourselves
in many more cases than just the faulty ones.

Tom was leaning towards this proposed workaround but 
suggested a test.
(http://sourceware.org/ml/gdb-patches/2010-09/msg00234.html)

So, here is the patch with a test.  The test fails with 
the current HEAD (gets the syntax error) and succeeds with
the patch applied.  I've also had to update other tests
to match the change.

The actual change is one line but it is not 
restricted to MI as the change is in varobj.c.

No regressions (checked with the gdb.sum file :-)).

Thanks

Marc

2011-08-05  Marc Khouzam  <marc.khouzam@ericsson.com>

	* varobj.c (cplus_describe_child): Add the keyword
	'class' to the output of the method	when dealing 
	with a cast to a base class.

2011-08-05  Marc Khouzam  <marc.khouzam@ericsson.com>

	* gdb.mi/gdb11912.cc: New file.
	* gdb.mi/gdb11912.exp: New file.
	* gdb.mi/mi-var-cp.cc: Updated for new 'class'
	keyword in output of -var-info-path-expression.


### Eclipse Workspace Patch 1.0
#P src
Index: gdb/testsuite/gdb.mi/gdb11912.cc
===================================================================
RCS file: gdb/testsuite/gdb.mi/gdb11912.cc
diff -N gdb/testsuite/gdb.mi/gdb11912.cc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gdb/testsuite/gdb.mi/gdb11912.cc	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,27 @@
+#include <string.h>
+#include <stdio.h>
+
+class A
+{
+	int a;
+};
+
+class C : public A
+{
+	public:
+		C()
+		{
+		};
+		void testLocation()
+		{
+			z = 1;
+		};
+		int z;
+};
+
+int main()
+{
+	C c;
+	c.testLocation();
+	return 0;
+}
Index: gdb/testsuite/gdb.mi/gdb11912.exp
===================================================================
RCS file: gdb/testsuite/gdb.mi/gdb11912.exp
diff -N gdb/testsuite/gdb.mi/gdb11912.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ gdb/testsuite/gdb.mi/gdb11912.exp	1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,78 @@
+# Copyright 2011
+# 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 gdb/11912
+#
+
+if { [skip_cplus_tests] } { continue }
+
+load_lib mi-support.exp
+set MIFLAGS "-i=mi"
+
+gdb_exit
+if [mi_gdb_start] {
+    continue
+}
+
+set testfile gdb11912
+set srcfile "$testfile.cc"
+set binfile $objdir/$subdir/$testfile
+
+if [get_compiler_info ${binfile} "c++"] {
+    return -1;
+}
+
+if {[gdb_compile $srcdir/$subdir/$srcfile $binfile executable {debug c++}] != ""} {
+  untested gdb11912.exp
+  return -1
+}
+
+# Test that children of derived classes are given the proper
+# path by -var-info-path-expression
+
+mi_gdb_load ${binfile}
+mi_runto C::testLocation
+
+mi_create_varobj "var1" "this" "create var for THIS"
+
+mi_list_varobj_children "var1" {
+    {var1.A A 1 A}
+    {var1.public public 1}
+} "list children of THIS"
+
+# We don't care what the result of -var-info-path-expression
+# as long as it can be used in the -data-evaluate-expression
+# that follows
+mi_gdb_test "-var-info-path-expression var1.A" \
+    "\\^done,path_expr=\".*\"" \
+    "-var-info-path-expression var1.A"
+
+# Extract the result of the -var-info-path-expression command
+# to use it in -data-evaluate-expression
+set cmd_output $expect_out(2,string)
+set path [lindex [split $cmd_output "\""] 1]
+if $verbose>1 then {
+    send_user "var-info-path-expression returned $cmd_output\n"
+    send_user "Using $path for data-evaluate-expression\n"
+}
+
+mi_gdb_test "-data-evaluate-expression \"$path\"" \
+    "\\^done,value=\"\{a = \[0-9\]*\}\"" \
+    "-data-evaluate-expression $path"
+
+mi_gdb_exit
+return 0
Index: gdb/testsuite/gdb.mi/mi-var-cp.cc
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.mi/mi-var-cp.cc,v
retrieving revision 1.13
diff -u -r1.13 mi-var-cp.cc
--- gdb/testsuite/gdb.mi/mi-var-cp.cc	1 Jan 2011 15:33:47 -0000	1.13
+++ gdb/testsuite/gdb.mi/mi-var-cp.cc	5 Aug 2011 13:42:06 -0000
@@ -157,7 +157,7 @@
        {DP.Base2 Base2 1 Base2}                         \
        {DP.public public 1}} "list children of DP"
       mi_gdb_test "-var-info-path-expression DP.Base1" \
-          "\\^done,path_expr=\"\\(\\*\\(Base1\\*\\) dp\\)\"" \
+          "\\^done,path_expr=\"\\(\\*\\(class Base1\\*\\) dp\\)\"" \
 	  "-var-info-path-expression DP.Base1"       
       mi_list_varobj_children DP.public {               \
         {DP.public.i i 0 int}                           \
@@ -172,7 +172,7 @@
         {DP.Base1.public.i i 0 int}                           \
       } "list children of DP.Base1.public"
       mi_gdb_test "-var-info-path-expression DP.Base1.public.i" \
-          "\\^done,path_expr=\"\\(\\(\\(\\*\\(Base1\\*\\) dp\\)\\).i\\)\"" \
+          "\\^done,path_expr=\"\\(\\(\\(\\*\\(class Base1\\*\\) dp\\)\\).i\\)\"" \
 	  "-var-info-path-expression DP.Base1.public.i"
 
       mi_gdb_test "-var-info-path-expression DP.public" \
@@ -185,7 +185,7 @@
        {D.Base2 Base2 1 Base2}                         \
        {D.public public 1}} "list children of D"
       mi_gdb_test "-var-info-path-expression D.Base1" \
-          "\\^done,path_expr=\"\\(\\(Base1\\) d\\)\"" \
+          "\\^done,path_expr=\"\\(\\(class Base1\\) d\\)\"" \
 	  "-var-info-path-expression D.Base1"
   :*/
   int array[4] = {1,2,3};
Index: gdb/varobj.c
===================================================================
RCS file: /cvs/src/src/gdb/varobj.c,v
retrieving revision 1.181
diff -u -r1.181 varobj.c
--- gdb/varobj.c	28 Jul 2011 10:36:40 -0000	1.181
+++ gdb/varobj.c	5 Aug 2011 13:42:06 -0000
@@ -3443,8 +3443,14 @@
 		 will create an lvalue, for all appearences, so we don't
 		 need to use more fancy:
 		         *(Base1*)(&d)
-		 construct.  */
-	      *cfull_expression = xstrprintf ("(%s(%s%s) %s)", 
+		 construct.
+
+		 When we are in the scope of the base class or of one
+	     of its children, the type field name will be interpreted
+	     as a constructor, if it exists.  Therefore, we must
+	     indicate that the name is a class name by using the
+	     'class' keyword.  */
+	      *cfull_expression = xstrprintf ("(%s(class %s%s) %s)",
 					      ptr, 
 					      TYPE_FIELD_NAME (type, index),
 					      ptr,


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