(contains_pointers_p): New function.

(assemble_variable): Use that.

From-SVN: r5117
This commit is contained in:
Richard Stallman 1993-08-09 07:30:04 +00:00
parent 654209e6a1
commit 2e9effae27

View File

@ -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. */