[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