varasm.c (merge_weak): Error for any weakening after definition.
* varasm.c (merge_weak): Error for any weakening after definition. Adjust weakening after use warning to catch more cases. (assemble_alias): Set TREE_USED and TREE_ASM_WRITTEN consistently. * config/alpha/alpha.c (alpha_encode_section_info): Do not abort. * gcc.dg/weak-5.c (vfoo1c): No warning here. (vfoo1f): Warning here. (vfoo1l): Don't redefine the alias. From-SVN: r53491
This commit is contained in:
parent
d2aa36f5d9
commit
14285ace88
@ -1,3 +1,10 @@
|
||||
2002-05-15 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* varasm.c (merge_weak): Error for any weakening after definition.
|
||||
Adjust weakening after use warning to catch more cases.
|
||||
(assemble_alias): Set TREE_USED and TREE_ASM_WRITTEN consistently.
|
||||
* config/alpha/alpha.c (alpha_encode_section_info): Do not abort.
|
||||
|
||||
Wed May 15 10:38:27 CEST 2002 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* invoke.texi (-malign-double): Re-add lost warning.
|
||||
@ -11,7 +18,7 @@ Wed May 15 10:38:27 CEST 2002 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* flags.h (flag_reorder_functions): Declare.
|
||||
* function.c (prepare_function_start): Initialize frequnecy.
|
||||
* params.def (HOT_BB_COUNT_FRACTION, HOT_BB_FREQUENCY_FRACTION): New paramters.
|
||||
* params.def (HOT_BB_COUNT_FRACTION, HOT_BB_FREQUENCY_FRACTION): New.
|
||||
* Makefile.in (predict.o): Add dependency on target.h and params.h
|
||||
* defaults.h (HOT_TEXT_SECTION_NAME,
|
||||
UNLIKELY_EXECUTED_TEXT_SECTION_NAME): New macros.
|
||||
|
@ -1678,7 +1678,11 @@ alpha_encode_section_info (decl, first)
|
||||
XSTR (XEXP (DECL_RTL (decl), 0), 0) = string;
|
||||
}
|
||||
else if (symbol_str[0] == '@')
|
||||
abort ();
|
||||
{
|
||||
/* We're hosed. This can happen when the user adds a weak
|
||||
attribute after rtl generation. They should have gotten
|
||||
a warning about unspecified behaviour from varasm.c. */
|
||||
}
|
||||
}
|
||||
|
||||
/* legitimate_address_p recognizes an RTL expression that is a valid
|
||||
|
@ -1,3 +1,9 @@
|
||||
2002-05-15 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* gcc.dg/weak-5.c (vfoo1c): No warning here.
|
||||
(vfoo1f): Warning here.
|
||||
(vfoo1l): Don't redefine the alias.
|
||||
|
||||
2002-05-14 Jason Merrill <jason@redhat.com>, Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* g++.dg/init/pm1.C: New test.
|
||||
|
@ -44,7 +44,7 @@ void * foo1c (void)
|
||||
{
|
||||
return (void *)&vfoo1c;
|
||||
}
|
||||
extern int vfoo1c __attribute__((weak)); /* { dg-warning "weak declaration" "weak declaration" } */
|
||||
extern int vfoo1c __attribute__((weak));
|
||||
|
||||
|
||||
extern int vfoo1d __attribute__((weak));
|
||||
@ -68,7 +68,7 @@ void * foo1f (void)
|
||||
{
|
||||
return (void *)&vfoo1f;
|
||||
}
|
||||
extern int vfoo1f __attribute__((weak));
|
||||
extern int vfoo1f __attribute__((weak)); /* { dg-warning "weak declaration" "weak declaration" } */
|
||||
|
||||
|
||||
extern int vfoo1g;
|
||||
@ -111,6 +111,4 @@ int vfoo1k = 1;
|
||||
|
||||
|
||||
int vfoox1l = 1;
|
||||
extern int vfoo1l __attribute__((alias ("vfoox1l")));
|
||||
extern int vfoo1l __attribute__((weak, alias ("vfoox1l")));
|
||||
|
||||
|
34
gcc/varasm.c
34
gcc/varasm.c
@ -4830,14 +4830,6 @@ merge_weak (newdecl, olddecl)
|
||||
if (DECL_WEAK (newdecl) == DECL_WEAK (olddecl))
|
||||
return;
|
||||
|
||||
if (SUPPORTS_WEAK
|
||||
&& DECL_WEAK (newdecl)
|
||||
&& DECL_EXTERNAL (newdecl) && DECL_EXTERNAL (olddecl)
|
||||
&& (TREE_CODE (olddecl) != VAR_DECL || ! TREE_STATIC (olddecl))
|
||||
&& TREE_USED (olddecl)
|
||||
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl)))
|
||||
warning_with_decl (newdecl, "weak declaration of `%s' after first use results in unspecified behavior");
|
||||
|
||||
if (DECL_WEAK (newdecl))
|
||||
{
|
||||
tree wd;
|
||||
@ -4848,10 +4840,26 @@ merge_weak (newdecl, olddecl)
|
||||
go back and make it weak. This error cannot caught in
|
||||
declare_weak because the NEWDECL and OLDDECL was not yet
|
||||
been merged; therefore, TREE_ASM_WRITTEN was not set. */
|
||||
if (TREE_CODE (olddecl) == FUNCTION_DECL && TREE_ASM_WRITTEN (olddecl))
|
||||
if (TREE_ASM_WRITTEN (olddecl))
|
||||
error_with_decl (newdecl,
|
||||
"weak declaration of `%s' must precede definition");
|
||||
|
||||
|
||||
/* If we've already generated rtl referencing OLDDECL, we may
|
||||
have done so in a way that will not function properly with
|
||||
a weak symbol. */
|
||||
else if (TREE_USED (olddecl)
|
||||
&& TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (olddecl))
|
||||
/* ??? Not impossible that some platform may generate code
|
||||
that doesn't function *at all* with incorrect declaration
|
||||
before use. However, all known at present will assume
|
||||
exteral and common symbols are not "local". */
|
||||
/* ??? Probably these exceptions to the rule will just
|
||||
confuse users about the true nature of the problem and
|
||||
we should warn for *any* use before weakening. */
|
||||
&& ! (DECL_EXTERNAL (olddecl)
|
||||
|| DECL_COMMON (olddecl)))
|
||||
warning_with_decl (newdecl, "weak declaration of `%s' after first use results in unspecified behavior");
|
||||
|
||||
if (SUPPORTS_WEAK)
|
||||
{
|
||||
/* We put the NEWDECL on the weak_decls list at some point.
|
||||
@ -4992,7 +5000,6 @@ assemble_alias (decl, target)
|
||||
#else
|
||||
ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
|
||||
#endif
|
||||
TREE_ASM_WRITTEN (decl) = 1;
|
||||
#else /* !ASM_OUTPUT_DEF */
|
||||
#if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
|
||||
if (! DECL_WEAK (decl))
|
||||
@ -5003,11 +5010,14 @@ assemble_alias (decl, target)
|
||||
#else
|
||||
ASM_OUTPUT_WEAK_ALIAS (asm_out_file, name, IDENTIFIER_POINTER (target));
|
||||
#endif
|
||||
TREE_ASM_WRITTEN (decl) = 1;
|
||||
#else
|
||||
warning ("alias definitions not supported in this configuration; ignored");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
TREE_USED (decl) = 1;
|
||||
TREE_ASM_WRITTEN (decl) = 1;
|
||||
TREE_ASM_WRITTEN (DECL_ASSEMBLER_NAME (decl)) = 1;
|
||||
}
|
||||
|
||||
/* Emit an assembler directive to set symbol for DECL visibility to
|
||||
|
Loading…
x
Reference in New Issue
Block a user