public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* [Repost] RFC: dump gengtype structures
       [not found] ` <d1e3ff2b0908202341v514d4d2cv6ff49d92bb775c9@mail.gmail.com>
@ 2009-08-21  8:59   ` Laurynas Biveinis
  2009-08-21 19:52     ` Ian Lance Taylor
  0 siblings, 1 reply; 2+ messages in thread
From: Laurynas Biveinis @ 2009-08-21  8:59 UTC (permalink / raw)
  To: gcc

[-- Attachment #1: Type: text/plain, Size: 1082 bytes --]

[Third try. Apparently the compressed dump was still too big to get through]

So I got fed up with trying to navigate gengtype maze of type_p,
pair_p and others and trying to figure out the difference between
GC_POINTED_TO and GC_USED and what is so "maybe" about
GC_MAYBE_POINTED_TO, thus I extended gengtype to dump its data
structures representing GCC data types and variables.

I wanted to attach an example dump it produced but it is about 350K
compressed and so it's too big for this mailing list.  It's not
perfect since I
did depth-first processing and the very first type goes very deep
indeed by pulling virtually all of the remaining types and taking
perhaps 80% of the output. However it is already much more usable and
greppable for looking into interesting types than trying to do the
same in GDB.

I will commit this to gc-improv branch shortly. I think this is
interesting enough to have on the trunk too and I will submit together
with some other patches from gc-improv in couple of weeks.

Any comments?

--
Laurynas



-- 
Laurynas

[-- Attachment #2: gengtype-dump.diff --]
[-- Type: text/x-patch, Size: 7866 bytes --]

Index: Makefile.in
===================================================================
--- Makefile.in	(revision 150268)
+++ Makefile.in	(working copy)
@@ -3506,7 +3506,7 @@
 build/gengtype-parse.o : gengtype-parse.c gengtype.h $(BCONFIG_H)	\
   $(SYSTEM_H)
 build/gengtype.o : gengtype.c $(BCONFIG_H) $(SYSTEM_H) gengtype.h 	\
-  rtl.def insn-notes.def errors.h double-int.h
+  rtl.def insn-notes.def errors.h double-int.h $(HASHTAB_H)
 build/genmddeps.o: genmddeps.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h	\
   $(GTM_H) $(RTL_BASE_H) errors.h gensupport.h
 build/genmodes.o : genmodes.c $(BCONFIG_H) $(SYSTEM_H) errors.h		\
Index: gengtype.c
===================================================================
--- gengtype.c	(revision 150267)
+++ gengtype.c	(working copy)
@@ -23,6 +23,7 @@
 #include "gengtype.h"
 #include "errors.h"	/* for fatal */
 #include "double-int.h"
+#include "hashtab.h"
 
 /* Data types, macros, etc. used only in this file.  */
 
@@ -73,6 +74,10 @@
   {
     GC_UNUSED = 0,
     GC_USED,
+    /* Used for structures whose definitions we haven't seen so far when
+       we encounter a pointer to it that is annotated with ``maybe_undef''.
+       If after reading in everything we don't have source file
+       information for it, we assume that it never has been defined. */
     GC_MAYBE_POINTED_TO,
     GC_POINTED_TO
   };
@@ -567,6 +572,7 @@
   p->name = s;
   p->type = t;
   p->line = *pos;
+  p->opt = NULL;
   typedefs = p;
 }
 
@@ -3792,6 +3798,214 @@
       }
 }
 
+static void dump_pair (int indent, pair_p p);
+static void dump_type (int indent, type_p p);
+static void dump_type_list (int indent, type_p p);
+
+#define INDENT 2
+
+static void
+dump_typekind (int indent, enum typekind kind)
+{
+  printf ("%*ckind = ", indent, ' ');
+  switch (kind)
+    {
+    case TYPE_SCALAR: printf ("TYPE_SCALAR"); break;
+    case TYPE_STRING: printf ("TYPE_STRING"); break;
+    case TYPE_STRUCT: printf ("TYPE_STRUCT"); break;
+    case TYPE_UNION:  printf ("TYPE_UNION"); break;
+    case TYPE_POINTER: printf ("TYPE_POINTER"); break;
+    case TYPE_ARRAY: printf ("TYPE_ARRAY"); break;
+    case TYPE_LANG_STRUCT: printf ("TYPE_LANG_STRUCT"); break;
+    case TYPE_PARAM_STRUCT: printf ("TYPE_PARAM_STRUCT"); break;
+    default: gcc_unreachable();
+  }
+  printf ("\n");
+}
+
+static void
+dump_gc_used (int indent, enum gc_used_enum gc_used)
+{
+  printf ("%*cgc_used = ", indent, ' ');
+  switch (gc_used)
+    {
+    case GC_UNUSED: printf ("GC_UNUSED"); break;
+    case GC_USED: printf ("GC_USED"); break;
+    case GC_MAYBE_POINTED_TO: printf ("GC_MAYBE_POINTED_TO"); break;
+    case GC_POINTED_TO: printf ("GC_POINTED_TO"); break;
+    default: gcc_unreachable();
+    }
+  printf ("\n");
+}
+
+static void
+dump_options (int indent, options_p opt)
+{
+  options_p o;
+  printf ("%*coptions = ", indent, ' ');
+  o = opt;
+  while (o)
+    {
+      printf ("%s:%s ", o->name, o->info);
+      o = o->next;
+    }
+  printf ("\n");
+}
+
+static void
+dump_fileloc (int indent, struct fileloc line)
+{
+  printf ("%*cfileloc: file = %s, line = %d\n", indent, ' ', line.file,
+	  line.line);
+}
+
+static void
+dump_type_u_s (int indent, type_p t)
+{
+  pair_p fields;
+
+  gcc_assert (t->kind == TYPE_STRUCT || t->kind == TYPE_UNION
+	      || t->kind == TYPE_LANG_STRUCT);
+  printf ("%*cu.s.tag = %s\n", indent, ' ', t->u.s.tag);
+  dump_fileloc (indent, t->u.s.line);
+  printf ("%*cu.s.fields =\n", indent, ' ');
+  fields = t->u.s.fields;
+  while (fields)
+    {
+      dump_pair (indent + INDENT, fields);
+      fields = fields->next;
+    }
+  printf ("%*cend of fields of type %p\n", indent, ' ', (void *) t);
+  dump_options (indent, t->u.s.opt);
+  printf ("%*cu.s.bitmap = %X\n", indent, ' ', t->u.s.bitmap);
+  printf ("%*cu.s.lang_struct:\n", indent, ' ');
+  dump_type_list (indent + INDENT, t->u.s.lang_struct);
+}
+
+static void
+dump_type_u_a (int indent, type_p t)
+{
+  gcc_assert (t->kind == TYPE_ARRAY);
+  printf ("%*clen = %s, u.a.p:\n", indent, ' ', t->u.a.len);
+  dump_type_list (indent + INDENT, t->u.a.p);
+}
+
+static void
+dump_type_u_param_struct (int indent, type_p t)
+{
+  int i;
+  gcc_assert (t->kind == TYPE_PARAM_STRUCT);
+  printf ("%*cu.param_struct.stru:\n", indent, ' ');
+  dump_type_list (indent, t->u.param_struct.stru);
+  dump_fileloc (indent, t->u.param_struct.line);
+  for (i = 0; i < NUM_PARAM; i++)
+    {
+      if (t->u.param_struct.param[i] == NULL)
+	continue;
+      printf ("%*cu.param_struct.param[%d]:\n", indent, ' ', i);
+      dump_type (indent + INDENT, t->u.param_struct.param[i]);
+    }
+}
+
+static htab_t seen_types;
+
+static void
+dump_type_list (int indent, type_p t)
+{
+  type_p p = t;
+  while (p)
+    {
+      dump_type (indent, p);
+      p = p->next;
+    }
+}
+
+static void
+dump_type (int indent, type_p t)
+{
+  PTR *slot;
+
+  printf ("%*cType at %p: ", indent, ' ', (void *)t);
+  slot = htab_find_slot (seen_types, t, INSERT);
+  if (*slot != NULL)
+    {
+      printf ("already seen.\n");
+      return;
+    }
+  *slot = t;
+  printf ("\n");
+
+  dump_typekind (indent, t->kind);
+  printf ("%*cpointer_to = %p\n", indent + INDENT, ' ', (void *)t->pointer_to);
+  dump_gc_used (indent + INDENT, t->gc_used);
+  switch (t->kind)
+    {
+    case TYPE_SCALAR:
+      printf ("%*cscalar_is_char = %s\n", indent + INDENT, ' ',
+	      t->u.scalar_is_char ? "true" : "false");
+      break;
+    case TYPE_STRING:
+      break;
+    case TYPE_STRUCT:
+    case TYPE_UNION:
+    case TYPE_LANG_STRUCT: /* FIXME LANG_STRUCT */
+      dump_type_u_s (indent + INDENT, t);
+      break;
+    case TYPE_POINTER:
+      printf ("%*cp:\n", indent + INDENT, ' ');
+      dump_type (indent + INDENT, t->u.p);
+      break;
+    case TYPE_ARRAY:
+      dump_type_u_a (indent + INDENT, t);
+      break;
+    case TYPE_PARAM_STRUCT:
+      dump_type_u_param_struct (indent + INDENT, t);
+      break;
+    default:
+      gcc_unreachable ();
+    }
+  printf ("%*cEnd of type at %p\n", indent, ' ', (void *)t);
+}
+
+static void
+dump_pair (int indent, pair_p p)
+{
+  printf ("%*cpair: name = %s\n", indent, ' ', p->name);
+  dump_type (indent, p->type);
+  dump_fileloc (indent, p->line);
+  dump_options (indent, p->opt);
+  printf("%*cEnd of pair %s\n", indent, ' ', p->name);
+}
+
+static void
+dump_pair_list (const char * name, pair_p pp)
+{
+  pair_p p;
+  printf ("%s:\n", name);
+  for (p = pp; p != NULL; p = p->next)
+    dump_pair (0, p);
+  printf("End of %s\n\n", name);
+}
+
+static void
+dump_structures (const char * name, type_p structures)
+{
+  printf ("%s:\n", name);
+  dump_type_list (0, structures);
+  printf ("End of %s\n\n", name);
+}
+
+static void
+dump_everything (void)
+{
+  seen_types = htab_create (100, htab_hash_pointer, htab_eq_pointer, NULL);
+  dump_pair_list ("typedefs", typedefs);
+  dump_structures ("structures", structures);
+  dump_structures ("param_structs", param_structs);
+  dump_pair_list ("variables", variables);
+  htab_delete (seen_types);
+}
+
 \f
 int
 main (int argc, char **argv)
@@ -3799,9 +4013,17 @@
   size_t i;
   static struct fileloc pos = { this_file, 0 };
   char* inputlist = 0;
+  int do_dump = 0;
   /* fatal uses this */
   progname = "gengtype";
 
+  if (argc >= 2 && !strcmp (argv[1], "-d"))
+    {
+      do_dump = 1;
+      argv = &argv[1];
+      argc--;
+    }
+
   if (argc >= 5 && !strcmp (argv[1], "-p")) 
     {
       srcdir = argv[2];
@@ -3815,7 +4037,7 @@
       inputlist = argv[2];
     } 
   else
-    fatal ("usage: gengtype [-p] srcdir input-list [file1 file2 ... fileN]");
+    fatal ("usage: gengtype [-d] [-p] srcdir input-list [file1 file2 ... fileN]");
 
   srcdir_len = strlen (srcdir);
 
@@ -3859,6 +4081,9 @@
   write_rtx_next ();
   close_output_files ();
 
+  if (do_dump)
+    dump_everything ();
+
   if (hit_error)
     return 1;
   return 0;

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [Repost] RFC: dump gengtype structures
  2009-08-21  8:59   ` [Repost] RFC: dump gengtype structures Laurynas Biveinis
@ 2009-08-21 19:52     ` Ian Lance Taylor
  0 siblings, 0 replies; 2+ messages in thread
From: Ian Lance Taylor @ 2009-08-21 19:52 UTC (permalink / raw)
  To: Laurynas Biveinis; +Cc: gcc

Laurynas Biveinis <laurynas.biveinis@gmail.com> writes:

> [Third try. Apparently the compressed dump was still too big to get through]
>
> So I got fed up with trying to navigate gengtype maze of type_p,
> pair_p and others and trying to figure out the difference between
> GC_POINTED_TO and GC_USED and what is so "maybe" about
> GC_MAYBE_POINTED_TO, thus I extended gengtype to dump its data
> structures representing GCC data types and variables.
>
> I wanted to attach an example dump it produced but it is about 350K
> compressed and so it's too big for this mailing list.  It's not
> perfect since I
> did depth-first processing and the very first type goes very deep
> indeed by pulling virtually all of the remaining types and taking
> perhaps 80% of the output. However it is already much more usable and
> greppable for looking into interesting types than trying to do the
> same in GDB.
>
> I will commit this to gc-improv branch shortly. I think this is
> interesting enough to have on the trunk too and I will submit together
> with some other patches from gc-improv in couple of weeks.
>
> Any comments?

This looks like a good idea to me.  The patch looks fine.

Ian

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-08-21 14:09 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <d1e3ff2b0908012227n21109469j489b774e4f609076@mail.gmail.com>
     [not found] ` <d1e3ff2b0908202341v514d4d2cv6ff49d92bb775c9@mail.gmail.com>
2009-08-21  8:59   ` [Repost] RFC: dump gengtype structures Laurynas Biveinis
2009-08-21 19:52     ` Ian Lance Taylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).