Commit 9be6533a by Richard Sandiford Committed by Richard Sandiford

varasm.c (incorporeal_function_p): New.

	* varasm.c (incorporeal_function_p): New.
	(assemble_external): Use it as a filter.
	* config/mips/mips.c (mips_output_external): Don't check for builtin
	functions here.

From-SVN: r74368
parent e25c906a
2003-12-06 Richard Sandiford <rsandifo@redhat.com>
* varasm.c (incorporeal_function_p): New.
(assemble_external): Use it as a filter.
* config/mips/mips.c (mips_output_external): Don't check for builtin
functions here.
2003-12-06 Richard Earnshaw <reanrsha@arm.com> 2003-12-06 Richard Earnshaw <reanrsha@arm.com>
* arm.md (IOR (COMPARISON) (AND)): New define_splits. * arm.md (IOR (COMPARISON) (AND)): New define_splits.
......
...@@ -5574,9 +5574,7 @@ mips_output_external (FILE *file ATTRIBUTE_UNUSED, tree decl, const char *name) ...@@ -5574,9 +5574,7 @@ mips_output_external (FILE *file ATTRIBUTE_UNUSED, tree decl, const char *name)
extern_head = p; extern_head = p;
} }
if (TARGET_IRIX && mips_abi == ABI_32 if (TARGET_IRIX && mips_abi == ABI_32 && TREE_CODE (decl) == FUNCTION_DECL)
&& TREE_CODE (decl) == FUNCTION_DECL
&& !DECL_BUILT_IN (decl))
{ {
p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list)); p = (struct extern_list *) ggc_alloc (sizeof (struct extern_list));
p->next = extern_head; p->next = extern_head;
......
...@@ -137,6 +137,9 @@ static HOST_WIDE_INT const_alias_set; ...@@ -137,6 +137,9 @@ static HOST_WIDE_INT const_alias_set;
static const char *strip_reg_name (const char *); static const char *strip_reg_name (const char *);
static int contains_pointers_p (tree); static int contains_pointers_p (tree);
#ifdef ASM_OUTPUT_EXTERNAL
static bool incorporeal_function_p (tree);
#endif
static void decode_addr_const (tree, struct addr_const *); static void decode_addr_const (tree, struct addr_const *);
static hashval_t const_desc_hash (const void *); static hashval_t const_desc_hash (const void *);
static int const_desc_eq (const void *, const void *); static int const_desc_eq (const void *, const void *);
...@@ -1599,6 +1602,29 @@ contains_pointers_p (tree type) ...@@ -1599,6 +1602,29 @@ contains_pointers_p (tree type)
} }
} }
#ifdef ASM_OUTPUT_EXTERNAL
/* True if DECL is a function decl for which no out-of-line copy exists.
It is assumed that DECL's assembler name has been set. */
static bool
incorporeal_function_p (tree decl)
{
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
{
const char *name;
if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
&& DECL_FUNCTION_CODE (decl) == BUILT_IN_ALLOCA)
return true;
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
if (strncmp (name, "__builtin_", strlen ("__builtin_")) == 0)
return true;
}
return false;
}
#endif
/* 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. */
...@@ -1619,7 +1645,8 @@ assemble_external (tree decl ATTRIBUTE_UNUSED) ...@@ -1619,7 +1645,8 @@ assemble_external (tree decl ATTRIBUTE_UNUSED)
rtx rtl = DECL_RTL (decl); rtx rtl = DECL_RTL (decl);
if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF if (GET_CODE (rtl) == MEM && GET_CODE (XEXP (rtl, 0)) == SYMBOL_REF
&& ! SYMBOL_REF_USED (XEXP (rtl, 0))) && !SYMBOL_REF_USED (XEXP (rtl, 0))
&& !incorporeal_function_p (decl))
{ {
/* Some systems do require some output. */ /* Some systems do require some output. */
SYMBOL_REF_USED (XEXP (rtl, 0)) = 1; SYMBOL_REF_USED (XEXP (rtl, 0)) = 1;
......
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