From 2e9effae27bd4227a8d8504ead761e96364e95a9 Mon Sep 17 00:00:00 2001 From: Richard Stallman Date: Mon, 9 Aug 1993 07:30:04 +0000 Subject: [PATCH] (contains_pointers_p): New function. (assemble_variable): Use that. From-SVN: r5117 --- gcc/varasm.c | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/gcc/varasm.c b/gcc/varasm.c index dc1a6262a2e..75f620ac479 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. */ -- 2.30.2