void
debug_tree_chain (tree t)
{
+ struct pointer_set_t *seen = pointer_set_create ();
+
while (t)
- {
- print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
- fprintf(stderr, " ");
- t = TREE_CHAIN (t);
- }
+ {
+ print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
+ fprintf (stderr, " ");
+ t = TREE_CHAIN (t);
+ if (pointer_set_insert (seen, t))
+ {
+ fprintf (stderr, "... [cycled back to ");
+ print_generic_expr (stderr, t, TDF_VOPS|TDF_MEMSYMS|TDF_UID);
+ fprintf (stderr, "]");
+ break;
+ }
+ }
fprintf (stderr, "\n");
+
+ pointer_set_destroy (seen);
}
/* Prints declaration DECL to the FILE with details specified by FLAGS. */
case COMPONENT_REF:
op0 = TREE_OPERAND (node, 0);
str = ".";
- if (TREE_CODE (op0) == INDIRECT_REF)
+ if (op0 && TREE_CODE (op0) == INDIRECT_REF)
{
op0 = TREE_OPERAND (op0, 0);
str = "->";
dump_generic_node (buffer, TREE_OPERAND (op0, 2), 0, flags, false);
break;
- case COMPONENT_REF:
- /* The function is a pointer contained in a structure. */
- if (TREE_CODE (TREE_OPERAND (op0, 0)) == INDIRECT_REF ||
- TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
- dump_function_name (buffer, TREE_OPERAND (op0, 1), flags);
- else
- dump_generic_node (buffer, TREE_OPERAND (op0, 0), 0, flags, false);
- /* else
- We can have several levels of structures and a function
- pointer inside. This is not implemented yet... */
- /* NIY;*/
- break;
-
case ARRAY_REF:
if (TREE_CODE (TREE_OPERAND (op0, 0)) == VAR_DECL)
dump_function_name (buffer, TREE_OPERAND (op0, 0), flags);
dump_generic_node (buffer, op0, 0, flags, false);
break;
+ case COMPONENT_REF:
case SSA_NAME:
case OBJ_TYPE_REF:
dump_generic_node (buffer, op0, 0, flags, false);