aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1994-03-01 18:33:22 -0500
committerRichard Kenner <kenner@gcc.gnu.org>1994-03-01 18:33:22 -0500
commitbe1ad04c385fa02ff124ffe38c6b85b7dfbd2c33 (patch)
tree3cebe1786de1fa19fdfc1350f89f369cb020005c
parent2d57146b6ee86f1cbff948b98eecdc940c2f0412 (diff)
downloadgcc-be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33.zip
gcc-be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33.tar.gz
gcc-be1ad04c385fa02ff124ffe38c6b85b7dfbd2c33.tar.bz2
(output_constant): Strip off some NOP_EXPRs before further processing.
From-SVN: r6683
-rw-r--r--gcc/varasm.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index d4576f8..89c1bba 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -3323,6 +3323,17 @@ output_constant (exp, size)
if (size == 0)
return;
+ /* Eliminate the NON_LVALUE_EXPR_EXPR that makes a cast not be an lvalue.
+ That way we get the constant (we hope) inside it. Also, strip
+ off any NOP_EXPR that converts between two record or union types. */
+ while ((TREE_CODE (exp) == NOP_EXPR
+ && (TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0))
+ || TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
+ || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE
+ || TREE_CODE (TREE_TYPE (exp)) == QUAL_UNION_TYPE))
+ || TREE_CODE (exp) == NON_LVALUE_EXPR)
+ exp = TREE_OPERAND (exp, 0);
+
/* Allow a constructor with no elements for any data type.
This means to fill the space with zeros. */
if (TREE_CODE (exp) == CONSTRUCTOR && CONSTRUCTOR_ELTS (exp) == 0)
@@ -3334,12 +3345,6 @@ output_constant (exp, size)
return;
}
- /* Eliminate the NOP_EXPR that makes a cast not be an lvalue.
- That way we get the constant (we hope) inside it. */
- if (TREE_CODE (exp) == NOP_EXPR
- && TREE_TYPE (exp) == TREE_TYPE (TREE_OPERAND (exp, 0)))
- exp = TREE_OPERAND (exp, 0);
-
switch (code)
{
case CHAR_TYPE: