[ast-optimizer-branch]: Make c-pretty-print print more things pretty

Daniel Berlin dberlin@dberlin.org
Fri May 10 11:34:00 GMT 2002


Before, for the simplified version of jason's recent pmf.c example, we'd 
see:


f()    (ORIGINAL)
{
  int i;
  for (i = 0; i <= 499999999;  ++i)
    {
      <<< Unknown tree: call_expr >>>
 ();
    }
}

f()    (SIMPLIFIED)
{
  int i;
   * T.6;
  int T.5;
   * T.4;
  void * T.3;
  void * T.2;
  int T.1;
  for (i = 0; i <= 499999999; i = i + 1)
    {
            T.6 = (
      {
      );
      <<< Unknown tree: call_expr >>>
 ();
    }
}


Which is wrong, and ugly.

With these patches, we see:

f()    (ORIGINAL)
{
  int i;
  for (i = 0; i <= 499999999;  ++i)
    {
      (
{
  struct A * ap = ap;
  struct PMF pmf = pmf;
  void (*pfn_type) () <unnamed var>;
  {
    if (pmf.u.idx & 1)
      {
        int idx = pmf.u.idx - 1;
        void * pos = (void *)*ap.vptr + (void *)idx;
        void * pos2 = (void *)*ap.vptr + (void *)idx;
        <unnamed var> = *pos;
        goto <unnamed label>;
      }
    else
      <unnamed var> = pmf.u.pfn;
  }
  <unnamed label>:;
  <unnamed var>;
}
) ();
    }
}
f()    (SIMPLIFIED)
{
  int i;
  void (*pfn_type) () T.12;
  int T.11;
  int T.10;
  void (*<unnamed pfn>) () T.9;
  void (*pfn_type) () * pos.8;
  void * idx.7;
  unsigned int idx.6;
  void * T.5;
  void * idx.4;
  unsigned int idx.3;
  void * T.2;
  int T.1;
  for (i = 0; i <= 499999999;  ++i)
    {
      {
        struct A * ap;
        struct PMF pmf = pmf;
        void (*pfn_type) () <unnamed var>;
        ap = ap;
        {
          T.10 = pmf.u.idx;
          T.11 = T.10 & 1;
          if (T.11 != 0)
            {
              int idx;
              void * pos;
              void * pos2;
              T.1 = pmf.u.idx;
              idx = T.1 - 1;
              T.2 = (void *)*ap.vptr;
              idx.3 = idx;
              idx.4 = (void *)idx.3;
              pos = T.2 + idx.4;
              T.5 = (void *)*ap.vptr;
              idx.6 = idx;
              idx.7 = (void *)idx.6;
              pos2 = T.5 + idx.7;
              pos.8 = pos;
              T.9 = *pos.8;
              <unnamed var> = T.9;
              goto <unnamed label>;
            }
          else
            {
              <unnamed var> = pmf.u.pfn;
              goto <unnamed label>;
            }
        }
        <unnamed label>:;
        T.12 = <unnamed var>;
      }
      T.12 ();
    }
}



Okay to commit?

I got rid of the // comments as well while i was in here.

Index: c-pretty-print.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/c-pretty-print.c,v
retrieving revision 1.1.2.9
diff -u -p -w -B -b -r1.1.2.9 c-pretty-print.c
--- c-pretty-print.c	7 May 2002 15:46:02 -0000	1.1.2.9
+++ c-pretty-print.c	10 May 2002 18:20:25 -0000
@@ -206,6 +206,8 @@ dump_c_node (buffer, node, spc)
 	    if (DECL_NAME (node))
 	      output_add_string (buffer, 
 				 IDENTIFIER_POINTER (DECL_NAME (node)));
+	    else
+              output_add_string (buffer, "<unnamed type decl>");
 	  }
 	else if (class == 't')
 	  {
@@ -218,13 +220,51 @@ dump_c_node (buffer, node, spc)
 			 && DECL_NAME (TYPE_NAME (node)))
 		  output_add_string (buffer,
 				     IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
+		else
+                  output_add_string (buffer, "<unnamed type>");
 	      }
+	    else
+              output_add_string (buffer, "<unnamed type>");
 	  }
 	break;
       }
     case POINTER_TYPE:
+      if (TREE_CODE (TREE_TYPE (node)) == FUNCTION_TYPE)
+        {
+	  tree fnode = TREE_TYPE (node);
+	  dump_c_node (buffer, TREE_TYPE (fnode), spc);
+	  output_add_space (buffer);
+	  output_add_string (buffer, "(*");
+	  if (TYPE_NAME (node) && DECL_NAME (TYPE_NAME (node)))
+	    output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
+	  else
+	    output_add_string (buffer, "<unnamed pfn>");
+	  
+	  output_add_character (buffer, ')');
+          output_add_space (buffer);
+	  output_add_character (buffer, '(');
+	  /* Print the argument types.  The last element in the list is a 
+	     VOID_TYPE.  The following avoid to print the last element.  */
+	  {
+	    tree tmp = TYPE_ARG_TYPES (TREE_TYPE (fnode));
+	    while (tmp && TREE_CHAIN (tmp) && tmp != error_mark_node)
+	      {
+		dump_c_node (buffer, TREE_VALUE (tmp), spc);
+		tmp = TREE_CHAIN (tmp);
+		if (TREE_CHAIN (tmp) && TREE_CODE (TREE_CHAIN (tmp)) == TREE_LIST)
+		  {
+		    output_add_character (buffer, ',');
+		    output_add_space (buffer);
+		  }
+	      }
+	  }
+	  output_add_character (buffer, ')');	  
+	}
+      else
+        {
       dump_c_node (buffer, TREE_TYPE (node), spc);
       output_add_string (buffer, " *");
+	}
       break;
 
     case OFFSET_TYPE:
@@ -280,6 +320,8 @@ dump_c_node (buffer, node, spc)
 
 	  dump_c_node (buffer, TYPE_NAME (node), spc);
 	}
+      else
+        output_add_string (buffer, "<unnamed type>");
       /* Don't print the contents of the structure since the user don't asked 
 	 for explicitly.  */
       break;
@@ -287,8 +329,6 @@ dump_c_node (buffer, node, spc)
     case QUAL_UNION_TYPE:
       NIY;
 
-    case FUNCTION_TYPE:
-      break;
 
     case LANG_TYPE:
       NIY;
@@ -343,6 +383,8 @@ dump_c_node (buffer, node, spc)
       output_add_string (buffer, "\"");
       break;
 
+    case FUNCTION_TYPE:
+      break;
     case FUNCTION_DECL:
       /* Print the prototype of the function.  */
       INDENT (spc);
@@ -382,11 +424,15 @@ dump_c_node (buffer, node, spc)
     case LABEL_DECL:
       if (DECL_NAME (node))
 	output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (node)));
+      else
+        output_add_string (buffer, "<unnamed label>");
       break;
 
     case CONST_DECL:
       if (DECL_NAME (node))
 	output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (node)));
+      else
+        output_add_string (buffer, "<unnamed constant>");
       break;
 
     case TYPE_DECL:
@@ -424,6 +470,8 @@ dump_c_node (buffer, node, spc)
     case PARM_DECL:
       if (DECL_NAME (node))
 	output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (node)));
+      else
+        output_add_string (buffer, "<unnamed var>");
       break;
 
     case RESULT_DECL:
@@ -433,11 +481,15 @@ dump_c_node (buffer, node, spc)
     case FIELD_DECL:
       if (DECL_NAME (node))
 	output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (node)));
+      else
+        output_add_string (buffer, "<unnamed field>");
       break;
 
     case NAMESPACE_DECL:
       if (DECL_NAME (node))
 	output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (node)));
+      else
+        output_add_string (buffer, "<unnamed namespace>");
       break;
 
     case COMPONENT_REF:
@@ -464,9 +516,48 @@ dump_c_node (buffer, node, spc)
       NIY;
 
     case CONSTRUCTOR:
+      {
+	tree lnode;
+	bool is_struct_init = FALSE;
       output_add_character (buffer, '{');
-      dump_c_node (buffer, TREE_OPERAND (node, 1), spc);
+	/*	dump_c_node (buffer, TREE_OPERAND (node, 1), spc);  */
+	lnode = TREE_OPERAND (node, 1);
+	if (TREE_CODE (TREE_TYPE (node)) == RECORD_TYPE
+	    || TREE_CODE (TREE_TYPE (node)) == UNION_TYPE)
+	  is_struct_init = TRUE;
+	while (lnode && lnode != error_mark_node)
+	  {
+	    tree val;
+	    if (TREE_PURPOSE (lnode) && is_struct_init)
+	      {
+		output_add_character (buffer, '.');
+		dump_c_node (buffer, TREE_PURPOSE (lnode), spc);
+		output_add_string (buffer, "=");
+	      }
+	    val = TREE_VALUE (lnode);
+	    if (val && TREE_CODE (val) == ADDR_EXPR)
+	      if (TREE_CODE (TREE_OPERAND (val, 0)) == FUNCTION_DECL)
+		val = TREE_OPERAND (val, 0);
+	    if (val && TREE_CODE (val) == FUNCTION_DECL)	      
+	      {
+		if (DECL_NAME (val))
+		  output_add_string (buffer, IDENTIFIER_POINTER (DECL_NAME (val)));
+		else
+		  output_add_string (buffer, "<unnamed function>");
+	      }
+	    else
+	      {
+		dump_c_node (buffer, TREE_VALUE (lnode), spc);
+	      }
+	    lnode = TREE_CHAIN (lnode);
+	    if (lnode && TREE_CODE (lnode) == TREE_LIST)
+	      {
+		output_add_character (buffer, ',');
+		output_add_space (buffer);
+	      }
+	  }
       output_add_character (buffer, '}');
+      }
       break;
 
     case COMPOUND_EXPR:
@@ -721,7 +812,9 @@ dump_c_node (buffer, node, spc)
       break;
 
     case SAVE_EXPR:
+      output_add_string (buffer, "SAVE_EXPR (");
       dump_c_node (buffer, TREE_OPERAND (node, 0), spc);
+      output_add_character (buffer, ')');
       break;
 
     case UNSAVE_EXPR:
@@ -996,7 +1089,7 @@ dump_c_node (buffer, node, spc)
       break;
 
     case FILE_STMT:
-      // FIXME : What is the exact syntax of this node ? #line 123 ?
+      /* FIXME : What is the exact syntax of this node ? #line 123 ?*/
       output_printf (buffer, "<<< file : %s >>>\n", FILE_STMT_FILENAME (node));
       break;
 
@@ -1471,6 +1564,13 @@ print_call_name (buffer, node)
       PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 0));
       break;
       
+    case EXPR_WITH_FILE_LOCATION:
+      if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
+        PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 0));
+      else
+	dump_c_node (buffer, TREE_OPERAND (op0, 0), 0);
+      break;
+    
     case COND_EXPR:
       PRINT_FUNCTION_NAME (TREE_OPERAND (TREE_OPERAND (op0, 0), 1));
       PRINT_FUNCTION_NAME (TREE_OPERAND (TREE_OPERAND (op0, 0), 2));
@@ -1481,10 +1581,12 @@ print_call_name (buffer, node)
       if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
 	  TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
 	PRINT_FUNCTION_NAME (TREE_OPERAND (op0, 1));
+      else
+	dump_c_node (buffer, TREE_OPERAND (op0, 0), 0);
       /* else
 	 We can have several levels of structures and a function 
 	 pointer inside.  This is not implemented yet...  */
-      //		  NIY;
+      /*		  NIY;*/
       break;
       
     case ARRAY_REF:



More information about the Gcc-patches mailing list