Commit 2e9effae by Richard Stallman

(contains_pointers_p): New function.

(assemble_variable): Use that.

From-SVN: r5117
parent 654209e6
...@@ -89,6 +89,7 @@ extern FILE *asm_out_file; ...@@ -89,6 +89,7 @@ extern FILE *asm_out_file;
static char *compare_constant_1 (); static char *compare_constant_1 ();
static void record_constant_1 (); static void record_constant_1 ();
static void output_constant_def_contents (); static void output_constant_def_contents ();
static int contains_pointers_p ();
void output_constant_pool (); void output_constant_pool ();
void assemble_name (); void assemble_name ();
...@@ -923,7 +924,9 @@ assemble_variable (decl, top_level, at_end, dont_output_data) ...@@ -923,7 +924,9 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
#endif #endif
/* Output any data that we will need to use the address of. */ /* 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)); reloc = output_addressed_constants (DECL_INITIAL (decl));
/* Switch to the proper section for this data. */ /* Switch to the proper section for this data. */
...@@ -1052,6 +1055,42 @@ assemble_variable (decl, top_level, at_end, dont_output_data) ...@@ -1052,6 +1055,42 @@ assemble_variable (decl, top_level, at_end, dont_output_data)
#endif #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. /* Output something to declare an external symbol to the assembler.
(Most assemblers don't need this, so we normally output nothing.) (Most assemblers don't need this, so we normally output nothing.)
Do nothing if DECL is not external. */ Do nothing if DECL is not external. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment