This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[RFC] Change how value is shown for varobjs of type vector.
- From: "Andrew Burgess" <aburgess at broadcom dot com>
- To: "gdb-patches at sourceware dot org" <gdb-patches at sourceware dot org>
- Date: Wed, 26 Sep 2012 16:23:19 +0100
- Subject: [RFC] Change how value is shown for varobjs of type vector.
Consider:
> cat vec.c
char vector __attribute__ ((vector_size (8))) = { 0, 0, 0, 0, 0, 0, 0, 0 };
int
main ()
{
/* Nothing. */
}
> gcc -g -o vec.x vec.c
> gdb vec.x
(gdb) start
(gdb) interpreter-exec mi2 "-var-create vector * vector"
^done,name="vector",numchild="8",value="[8]",type="char [8]",has_more="0"
## END ##
I have a patch (below) that changes the value field from the current "[8]" to "{ 0, 0, 0, 0, 0, 0, 0, 0 }". The varobj still has 8 children, and the top level varobj is still not editable, you have to edit through the children.
This better suits my local usage where vectors are generally used with just a small number of entries, each vector type has a total size of one 64-bit register, the frontend used to view this MI data is just passing the value field through, and my users wanted to visualise the set of values in a single field.
I've not finished the patch yet with changelog or tests because I wasn't sure if this change was going to be acceptable, so I'm looking for some feedback please. One possibility would be to make this behaviour switchable, if it can't be the default.
Thanks,
Andrew
diff --git a/gdb/varobj.c b/gdb/varobj.c
index 6699699..c72716b 100644
--- a/gdb/varobj.c
+++ b/gdb/varobj.c
@@ -3119,10 +3119,13 @@ default_value_is_changeable_p (struct varobj *var)
{
case TYPE_CODE_STRUCT:
case TYPE_CODE_UNION:
- case TYPE_CODE_ARRAY:
r = 0;
break;
+ case TYPE_CODE_ARRAY:
+ r = TYPE_VECTOR (type);
+ break;
+
default:
r = 1;
}
@@ -3507,12 +3510,16 @@ c_value_of_variable (struct varobj *var, enum varobj_display_formats format)
case TYPE_CODE_ARRAY:
{
- char *number;
+ if (!TYPE_VECTOR (type))
+ {
+ char *number;
- number = xstrprintf ("[%d]", var->num_children);
- return (number);
+ number = xstrprintf ("[%d]", var->num_children);
+ return (number);
+ /* break; */
+ }
}
- /* break; */
+ /* fall through */
default:
{