(record_constant_1): Handle NON_LVALUE_EXPR.
Rewrite to use switch instead of if/then/elseif/else. From-SVN: r9141
This commit is contained in:
parent
9040d8731a
commit
2871d24f4a
141
gcc/varasm.c
141
gcc/varasm.c
|
@ -2403,102 +2403,111 @@ record_constant_1 (exp)
|
|||
|
||||
obstack_1grow (&permanent_obstack, (unsigned int) code);
|
||||
|
||||
if (code == INTEGER_CST)
|
||||
switch (code)
|
||||
{
|
||||
case INTEGER_CST:
|
||||
obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
|
||||
strp = (char *) &TREE_INT_CST_LOW (exp);
|
||||
len = 2 * sizeof TREE_INT_CST_LOW (exp);
|
||||
}
|
||||
else if (code == REAL_CST)
|
||||
{
|
||||
break;
|
||||
|
||||
case REAL_CST:
|
||||
obstack_1grow (&permanent_obstack, TYPE_PRECISION (TREE_TYPE (exp)));
|
||||
strp = (char *) &TREE_REAL_CST (exp);
|
||||
len = sizeof TREE_REAL_CST (exp);
|
||||
}
|
||||
else if (code == STRING_CST)
|
||||
{
|
||||
break;
|
||||
|
||||
case STRING_CST:
|
||||
if (flag_writable_strings)
|
||||
return;
|
||||
|
||||
strp = TREE_STRING_POINTER (exp);
|
||||
len = TREE_STRING_LENGTH (exp);
|
||||
obstack_grow (&permanent_obstack, (char *) &TREE_STRING_LENGTH (exp),
|
||||
sizeof TREE_STRING_LENGTH (exp));
|
||||
}
|
||||
else if (code == COMPLEX_CST)
|
||||
{
|
||||
break;
|
||||
|
||||
case COMPLEX_CST:
|
||||
record_constant_1 (TREE_REALPART (exp));
|
||||
record_constant_1 (TREE_IMAGPART (exp));
|
||||
return;
|
||||
}
|
||||
else if (code == CONSTRUCTOR && TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
|
||||
{
|
||||
int nbytes = int_size_in_bytes (TREE_TYPE (exp));
|
||||
obstack_grow (&permanent_obstack, &nbytes, sizeof (nbytes));
|
||||
obstack_blank (&permanent_obstack, nbytes);
|
||||
get_set_constructor_bytes (exp,
|
||||
(unsigned char *) permanent_obstack.next_free,
|
||||
nbytes);
|
||||
return;
|
||||
}
|
||||
else if (code == CONSTRUCTOR)
|
||||
{
|
||||
register tree link;
|
||||
int length = list_length (CONSTRUCTOR_ELTS (exp));
|
||||
tree type;
|
||||
|
||||
obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
|
||||
|
||||
/* For record constructors, insist that the types match.
|
||||
For arrays, just verify both constructors are for arrays. */
|
||||
if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
|
||||
type = TREE_TYPE (exp);
|
||||
else
|
||||
type = 0;
|
||||
obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
|
||||
|
||||
/* For arrays, insist that the size in bytes match. */
|
||||
if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
|
||||
case CONSTRUCTOR:
|
||||
if (TREE_CODE (TREE_TYPE (exp)) == SET_TYPE)
|
||||
{
|
||||
int size = int_size_in_bytes (TREE_TYPE (exp));
|
||||
obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
|
||||
int nbytes = int_size_in_bytes (TREE_TYPE (exp));
|
||||
obstack_grow (&permanent_obstack, &nbytes, sizeof (nbytes));
|
||||
obstack_blank (&permanent_obstack, nbytes);
|
||||
get_set_constructor_bytes
|
||||
(exp, (unsigned char *) permanent_obstack.next_free, nbytes);
|
||||
return;
|
||||
}
|
||||
|
||||
for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
|
||||
else
|
||||
{
|
||||
if (TREE_VALUE (link))
|
||||
record_constant_1 (TREE_VALUE (link));
|
||||
else
|
||||
{
|
||||
tree zero = 0;
|
||||
register tree link;
|
||||
int length = list_length (CONSTRUCTOR_ELTS (exp));
|
||||
tree type;
|
||||
|
||||
obstack_grow (&permanent_obstack, (char *) &zero, sizeof zero);
|
||||
obstack_grow (&permanent_obstack, (char *) &length, sizeof length);
|
||||
|
||||
/* For record constructors, insist that the types match.
|
||||
For arrays, just verify both constructors are for arrays. */
|
||||
if (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE)
|
||||
type = TREE_TYPE (exp);
|
||||
else
|
||||
type = 0;
|
||||
obstack_grow (&permanent_obstack, (char *) &type, sizeof type);
|
||||
|
||||
/* For arrays, insist that the size in bytes match. */
|
||||
if (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE)
|
||||
{
|
||||
int size = int_size_in_bytes (TREE_TYPE (exp));
|
||||
obstack_grow (&permanent_obstack, (char *) &size, sizeof size);
|
||||
}
|
||||
|
||||
for (link = CONSTRUCTOR_ELTS (exp); link; link = TREE_CHAIN (link))
|
||||
{
|
||||
if (TREE_VALUE (link))
|
||||
record_constant_1 (TREE_VALUE (link));
|
||||
else
|
||||
{
|
||||
tree zero = 0;
|
||||
|
||||
obstack_grow (&permanent_obstack,
|
||||
(char *) &zero, sizeof zero);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
case ADDR_EXPR:
|
||||
{
|
||||
struct addr_const value;
|
||||
|
||||
decode_addr_const (exp, &value);
|
||||
/* Record the offset. */
|
||||
obstack_grow (&permanent_obstack,
|
||||
(char *) &value.offset, sizeof value.offset);
|
||||
/* Record the symbol name. */
|
||||
obstack_grow (&permanent_obstack, XSTR (value.base, 0),
|
||||
strlen (XSTR (value.base, 0)) + 1);
|
||||
}
|
||||
return;
|
||||
}
|
||||
else if (code == ADDR_EXPR)
|
||||
{
|
||||
struct addr_const value;
|
||||
decode_addr_const (exp, &value);
|
||||
/* Record the offset. */
|
||||
obstack_grow (&permanent_obstack,
|
||||
(char *) &value.offset, sizeof value.offset);
|
||||
/* Record the symbol name. */
|
||||
obstack_grow (&permanent_obstack, XSTR (value.base, 0),
|
||||
strlen (XSTR (value.base, 0)) + 1);
|
||||
return;
|
||||
}
|
||||
else if (code == PLUS_EXPR || code == MINUS_EXPR)
|
||||
{
|
||||
|
||||
case PLUS_EXPR:
|
||||
case MINUS_EXPR:
|
||||
record_constant_1 (TREE_OPERAND (exp, 0));
|
||||
record_constant_1 (TREE_OPERAND (exp, 1));
|
||||
return;
|
||||
}
|
||||
else if (code == NOP_EXPR || code == CONVERT_EXPR)
|
||||
{
|
||||
|
||||
case NOP_EXPR:
|
||||
case CONVERT_EXPR:
|
||||
case NON_LVALUE_EXPR:
|
||||
record_constant_1 (TREE_OPERAND (exp, 0));
|
||||
return;
|
||||
|
||||
default:
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Record constant contents. */
|
||||
|
|
Loading…
Reference in New Issue