Commit 1a625283 by Jim Wilson

(plain_type): Pass additional argument to plain_type_1.

(plain_type_1): New parameter level.  Increment it when making
recursive calls.  Force the type to void_type_mode before starting
a 7th level of recursion.

From-SVN: r9572
parent 97f8690b
...@@ -369,7 +369,7 @@ static int ...@@ -369,7 +369,7 @@ static int
plain_type (type) plain_type (type)
tree type; tree type;
{ {
int val = plain_type_1 (type); int val = plain_type_1 (type, 0);
/* If we have already saved up some array dimensions, print them now. */ /* If we have already saved up some array dimensions, print them now. */
if (sdb_n_dims > 0) if (sdb_n_dims > 0)
...@@ -449,15 +449,25 @@ sdbout_record_type_name (type) ...@@ -449,15 +449,25 @@ sdbout_record_type_name (type)
#endif #endif
} }
/* Return the .type value for type TYPE.
LEVEL indicates how many levels deep we have recursed into the type.
The SDB debug format can only represent 6 derived levels of types.
After that, we must output inaccurate debug info. We deliberately
stop before the 7th level, so that ADA recursive types will not give an
infinite loop. */
static int static int
plain_type_1 (type) plain_type_1 (type, level)
tree type; tree type;
int level;
{ {
if (type == 0) if (type == 0)
type = void_type_node; type = void_type_node;
if (type == error_mark_node) else if (type == error_mark_node)
type = integer_type_node; type = integer_type_node;
type = TYPE_MAIN_VARIANT (type); else
type = TYPE_MAIN_VARIANT (type);
switch (TREE_CODE (type)) switch (TREE_CODE (type))
{ {
...@@ -520,7 +530,10 @@ plain_type_1 (type) ...@@ -520,7 +530,10 @@ plain_type_1 (type)
case ARRAY_TYPE: case ARRAY_TYPE:
{ {
int m; int m;
m = plain_type_1 (TREE_TYPE (type)); if (level >= 6)
return T_VOID;
else
m = plain_type_1 (TREE_TYPE (type), level+1);
if (sdb_n_dims < SDB_MAX_DIM) if (sdb_n_dims < SDB_MAX_DIM)
sdb_dims[sdb_n_dims++] sdb_dims[sdb_n_dims++]
= (TYPE_DOMAIN (type) = (TYPE_DOMAIN (type)
...@@ -569,13 +582,21 @@ plain_type_1 (type) ...@@ -569,13 +582,21 @@ plain_type_1 (type)
case POINTER_TYPE: case POINTER_TYPE:
case REFERENCE_TYPE: case REFERENCE_TYPE:
{ {
int m = plain_type_1 (TREE_TYPE (type)); int m;
if (level >= 6)
return T_VOID;
else
m = plain_type_1 (TREE_TYPE (type), level+1);
return PUSH_DERIVED_LEVEL (DT_PTR, m); return PUSH_DERIVED_LEVEL (DT_PTR, m);
} }
case FUNCTION_TYPE: case FUNCTION_TYPE:
case METHOD_TYPE: case METHOD_TYPE:
{ {
int m = plain_type_1 (TREE_TYPE (type)); int m;
if (level >= 6)
return T_VOID;
else
m = plain_type_1 (TREE_TYPE (type), level+1);
return PUSH_DERIVED_LEVEL (DT_FCN, m); return PUSH_DERIVED_LEVEL (DT_FCN, m);
} }
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment