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]

Re: [PATCH] Fix mi "-var-create" regression


On 10/14/2012 02:18 PM, Joel Brobecker wrote:
I don't feel entirely comfortable approving this patch, not because
I think it's iffy, but just because I don't have a good knowledge
of what is going on for you (RTTI is C++, and I don't follow C++
support). If no one else has the time to officially review your patch
within the next week or so, I will take a deeper look. It does look
reasonable.


The biggest problem caused by this regression is the breakage of information sent to IDEs based on MI output, as Marc pointed out.


Eclipse, for example, will attempt to list registers and gdb will end up throwing these errors, causing eclipse to get all confused when trying to display the register values.

This is more about a regression of a generic gdb feature than a fix to a C++ feature.

I did notice a couple of things (besides the unnecessary parens):

-      if (TYPE_CODE (result) == TYPE_CODE_PTR
+      /* If result's target type is TYPE_CODE_VOID, do not try fetching its rtti
+	 type.  GDB will try to dereference the void pointer and will throw an
+	 error when trying to do so.  */

Can you reformat the comment to fit within 70 characters. That's the soft line limit...


Fixed.


+      if ((TYPE_CODE (result) == TYPE_CODE_PTR
  	  || TYPE_CODE (result) == TYPE_CODE_REF)
+	&&  ((TYPE_TARGET_TYPE (result) != NULL)
+	&&  TYPE_CODE (TYPE_TARGET_TYPE (result)) != TYPE_CODE_VOID))

I don't think that you need to test for the TYPE_TARGET_TYPE, since you already know that it's either a PTR or REF type, which always have a TARGET_TYPE.


Well spotted. I fixed this now.


Thanks,
Luis
2012-10-15  Luis Machado  <lgustavo@codesourcery.com>

	* value.c (value_actual_type): Check for TYPE_CODE_VOID
	target types.

Index: gdb/gdb/value.c
===================================================================
--- gdb.orig/gdb/value.c	2012-10-10 16:54:36.048188274 -0300
+++ gdb/gdb/value.c	2012-10-14 21:41:22.997797277 -0300
@@ -850,8 +850,13 @@ value_actual_type (struct value *value,
   result = value_type (value);
   if (opts.objectprint)
     {
-      if (TYPE_CODE (result) == TYPE_CODE_PTR
+      /* If result's target type is TYPE_CODE_VOID, do not try
+	 fetching its rtti type.  GDB will try to dereference
+	 the void pointer and will throw an error when trying to
+	 do so.  */
+      if ((TYPE_CODE (result) == TYPE_CODE_PTR
 	  || TYPE_CODE (result) == TYPE_CODE_REF)
+	  && TYPE_CODE (TYPE_TARGET_TYPE (result)) != TYPE_CODE_VOID)
         {
           struct type *real_type;
 

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