diff options
author | Richard Stallman <rms@gnu.org> | 1993-08-09 07:30:04 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1993-08-09 07:30:04 +0000 |
commit | 2e9effae27bd4227a8d8504ead761e96364e95a9 (patch) | |
tree | 19fe2d8fbc0f6a455536539cd6ade817b5ee2b18 /gcc | |
parent | 654209e6a1ae75b80ea06103c6fc97ff455ba22e (diff) | |
download | gcc-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.c | 41 |
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. */ |