aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-08-09 07:30:04 +0000
committerRichard Stallman <rms@gnu.org>1993-08-09 07:30:04 +0000
commit2e9effae27bd4227a8d8504ead761e96364e95a9 (patch)
tree19fe2d8fbc0f6a455536539cd6ade817b5ee2b18 /gcc
parent654209e6a1ae75b80ea06103c6fc97ff455ba22e (diff)
downloadgcc-2e9effae27bd4227a8d8504ead761e96364e95a9.zip
gcc-2e9effae27bd4227a8d8504ead761e96364e95a9.tar.gz
gcc-2e9effae27bd4227a8d8504ead761e96364e95a9.tar.bz2
(contains_pointers_p): New function.
(assemble_variable): Use that. From-SVN: r5117
Diffstat (limited to 'gcc')
-rw-r--r--gcc/varasm.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index dc1a626..75f620a 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -89,6 +89,7 @@ extern FILE *asm_out_file;
static char *compare_constant_1 ();
static void record_constant_1 ();
static void output_constant_def_contents ();
+static int contains_pointers_p ();
void output_constant_pool ();
void assemble_name ();
@@ -923,7 +924,9 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
#endif
/* Output any data that we will need to use the address of. */
- if (DECL_INITIAL (decl))
+ if (DECL_INITIAL (decl) == error_mark_node)
+ reloc = contains_pointers_p (TREE_TYPE (decl));
+ else if (DECL_INITIAL (decl))
reloc = output_addressed_constants (DECL_INITIAL (decl));
/* Switch to the proper section for this data. */
@@ -1052,6 +1055,42 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
#endif
}
+/* Return 1 if type TYPE contains any pointers. */
+
+static int
+contains_pointers_p (type)
+ tree type;
+{
+ switch (TREE_CODE (type))
+ {
+ case POINTER_TYPE:
+ case REFERENCE_TYPE:
+ /* I'm not sure whether OFFSET_TYPE needs this treatment,
+ so I'll play safe and return 1. */
+ case OFFSET_TYPE:
+ return 1;
+
+ case RECORD_TYPE:
+ case UNION_TYPE:
+ case QUAL_UNION_TYPE:
+ {
+ tree fields;
+ /* For a type that has fields, see if the fields have pointers. */
+ for (fields = TYPE_FIELDS (type); fields; fields = TREE_CHAIN (fields))
+ if (contains_pointers_p (TREE_TYPE (fields)))
+ return 1;
+ return 0;
+ }
+
+ case ARRAY_TYPE:
+ /* An array type contains pointers if its element type does. */
+ return contains_pointers_p (TREE_TYPE (type));
+
+ default:
+ return 0;
+ }
+}
+
/* Output something to declare an external symbol to the assembler.
(Most assemblers don't need this, so we normally output nothing.)
Do nothing if DECL is not external. */