re PR target/16304 (bootstrap failure on AIX 4.3.3: cannot build strstream in libstdc++)
PR target/16304 * defaults.h (TARGET_DEFERRED_OUTPUT_DEFS): Provide default. * toplev.c (compile_file): Call process_pending_assemble_output_defs just before targetm.asm_out.file_end. * tree.h (process_pending_assemble_output_defs): Declare. * varasm.c (assemble_output_def, process_pending_assemble_output_defs): New functions. (assemble_alias): Defer generation of assembly code for defines when TARGET_DEFERRED_OUTPUT_DEFS is true. * config/rs6000/aix41.h (TARGET_DEFERRED_OUTPUT_DEFS): Define. * config/rs6000/aix43.h (TARGET_DEFERRED_OUTPUT_DEFS): Define. * doc/tm.texi (TARGET_DEFERRED_OUTPUT_DEFS): document. From-SVN: r93726
This commit is contained in:
parent
5352b89f60
commit
083b671742
@ -1,3 +1,18 @@
|
||||
2005-01-16 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||
|
||||
PR target/16304
|
||||
* defaults.h (TARGET_DEFERRED_OUTPUT_DEFS): Provide default.
|
||||
* toplev.c (compile_file): Call process_pending_assemble_output_defs
|
||||
just before targetm.asm_out.file_end.
|
||||
* tree.h (process_pending_assemble_output_defs): Declare.
|
||||
* varasm.c (assemble_output_def, process_pending_assemble_output_defs):
|
||||
New functions.
|
||||
(assemble_alias): Defer generation of assembly code for defines when
|
||||
TARGET_DEFERRED_OUTPUT_DEFS is true.
|
||||
* config/rs6000/aix41.h (TARGET_DEFERRED_OUTPUT_DEFS): Define.
|
||||
* config/rs6000/aix43.h (TARGET_DEFERRED_OUTPUT_DEFS): Define.
|
||||
* doc/tm.texi (TARGET_DEFERRED_OUTPUT_DEFS): document.
|
||||
|
||||
2005-01-15 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||
|
||||
PR target/19336
|
||||
|
@ -91,3 +91,7 @@
|
||||
#undef RS6000_CALL_GLUE
|
||||
#define RS6000_CALL_GLUE "{cror 31,31,31|nop}"
|
||||
|
||||
/* The IBM AIX 4.x assembler doesn't support forward references in
|
||||
.set directives. We handle this by deferring the output of .set
|
||||
directives to the end of the compilation unit. */
|
||||
#define TARGET_DEFERRED_OUTPUT_DEFS(DECL,TARGET) true
|
||||
|
@ -181,3 +181,8 @@ do { \
|
||||
|
||||
#undef LD_INIT_SWITCH
|
||||
#define LD_INIT_SWITCH "-binitfini"
|
||||
|
||||
/* The IBM AIX 4.x assembler doesn't support forward references in
|
||||
.set directives. We handle this by deferring the output of .set
|
||||
directives to the end of the compilation unit. */
|
||||
#define TARGET_DEFERRED_OUTPUT_DEFS(DECL,TARGET) true
|
||||
|
@ -137,6 +137,12 @@ do { fputs (integer_asm_op (POINTER_SIZE / BITS_PER_UNIT, TRUE), FILE); \
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Decide whether to defer emitting the assembler output for an equate
|
||||
of two values. The default is to not defer output. */
|
||||
#ifndef TARGET_DEFERRED_OUTPUT_DEFS
|
||||
#define TARGET_DEFERRED_OUTPUT_DEFS(DECL,TARGET) false
|
||||
#endif
|
||||
|
||||
/* This is how to output the definition of a user-level label named
|
||||
NAME, such as the label on a static function or variable NAME. */
|
||||
|
||||
|
@ -7045,6 +7045,15 @@ If @code{SET_ASM_OP} is defined, a default definition is provided which is
|
||||
correct for most systems.
|
||||
@end defmac
|
||||
|
||||
@defmac TARGET_DEFERRED_OUTPUT_DEFS (@var{decl_of_name}, @var{decl_of_value})
|
||||
A C statement that evaluates to true if the assembler code which defines
|
||||
(equates) the symbol whose tree node is @var{decl_of_name} to have the value
|
||||
of the tree node @var{decl_of_value} should be emitted near the end of the
|
||||
current compilation unit. The default is to not defer output of defines.
|
||||
This macro affects defines output by @samp{ASM_OUTPUT_DEF} and
|
||||
@samp{ASM_OUTPUT_DEF_FROM_DECLS}.
|
||||
@end defmac
|
||||
|
||||
@defmac ASM_OUTPUT_WEAK_ALIAS (@var{stream}, @var{name}, @var{value})
|
||||
A C statement to output to the stdio stream @var{stream} assembler code
|
||||
which defines (equates) the weak symbol @var{name} to have the value
|
||||
|
@ -1043,6 +1043,9 @@ compile_file (void)
|
||||
expander can also generate them. */
|
||||
process_pending_assemble_externals ();
|
||||
|
||||
/* Flush any pending equate directives. */
|
||||
process_pending_assemble_output_defs ();
|
||||
|
||||
/* Attach a special .ident directive to the end of the file to identify
|
||||
the version of GCC which compiled this code. The format of the .ident
|
||||
string is patterned after the ones produced by native SVR4 compilers. */
|
||||
|
@ -3703,6 +3703,7 @@ extern void mark_decl_referenced (tree);
|
||||
extern void notice_global_symbol (tree);
|
||||
extern void set_user_assembler_name (tree, const char *);
|
||||
extern void process_pending_assemble_externals (void);
|
||||
extern void process_pending_assemble_output_defs (void);
|
||||
|
||||
/* In stmt.c */
|
||||
extern void expand_computed_goto (tree);
|
||||
|
74
gcc/varasm.c
74
gcc/varasm.c
@ -4347,20 +4347,67 @@ globalize_decl (tree decl)
|
||||
targetm.asm_out.globalize_label (asm_out_file, name);
|
||||
}
|
||||
|
||||
/* Some targets do not allow a forward or undefined reference in a
|
||||
ASM_OUTPUT_DEF. Thus, a mechanism is needed to defer the output of
|
||||
this assembler code. The following struct holds the declaration
|
||||
and target for a deferred output define. */
|
||||
struct output_def_pair GTY(())
|
||||
{
|
||||
tree decl;
|
||||
tree target;
|
||||
};
|
||||
typedef struct output_def_pair *output_def_pair;
|
||||
|
||||
/* Define gc'd vector type. */
|
||||
DEF_VEC_GC_P(output_def_pair);
|
||||
|
||||
/* Vector of output_def_pair pointers. */
|
||||
static GTY(()) VEC(output_def_pair) *output_defs;
|
||||
|
||||
#ifdef ASM_OUTPUT_DEF
|
||||
/* Output the assembler code for a define (equate) using ASM_OUTPUT_DEF
|
||||
or ASM_OUTPUT_DEF_FROM_DECLS. The function defines the symbol whose
|
||||
tree node is DECL to have the value of the tree node TARGET. */
|
||||
|
||||
static void
|
||||
assemble_output_def (tree decl ATTRIBUTE_UNUSED, tree target ATTRIBUTE_UNUSED)
|
||||
{
|
||||
#ifdef ASM_OUTPUT_DEF_FROM_DECLS
|
||||
ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
|
||||
#else
|
||||
ASM_OUTPUT_DEF (asm_out_file,
|
||||
IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
|
||||
IDENTIFIER_POINTER (target));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Process the vector of pending assembler defines. */
|
||||
|
||||
void
|
||||
process_pending_assemble_output_defs (void)
|
||||
{
|
||||
#ifdef ASM_OUTPUT_DEF
|
||||
unsigned i;
|
||||
output_def_pair p;
|
||||
|
||||
for (i = 0; VEC_iterate (output_def_pair, output_defs, i, p); i++)
|
||||
assemble_output_def (p->decl, p->target);
|
||||
|
||||
output_defs = NULL;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Emit an assembler directive to make the symbol for DECL an alias to
|
||||
the symbol for TARGET. */
|
||||
|
||||
void
|
||||
assemble_alias (tree decl, tree target)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
/* We must force creation of DECL_RTL for debug info generation, even though
|
||||
we don't use it here. */
|
||||
make_decl_rtl (decl);
|
||||
|
||||
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
|
||||
|
||||
#ifdef ASM_OUTPUT_DEF
|
||||
/* Make name accessible from other files, if appropriate. */
|
||||
|
||||
@ -4370,16 +4417,25 @@ assemble_alias (tree decl, tree target)
|
||||
maybe_assemble_visibility (decl);
|
||||
}
|
||||
|
||||
#ifdef ASM_OUTPUT_DEF_FROM_DECLS
|
||||
ASM_OUTPUT_DEF_FROM_DECLS (asm_out_file, decl, target);
|
||||
#else
|
||||
ASM_OUTPUT_DEF (asm_out_file, name, IDENTIFIER_POINTER (target));
|
||||
#endif
|
||||
if (TARGET_DEFERRED_OUTPUT_DEFS (decl, target))
|
||||
{
|
||||
output_def_pair p;
|
||||
|
||||
p = ggc_alloc (sizeof (struct output_def_pair));
|
||||
p->decl = decl;
|
||||
p->target = target;
|
||||
VEC_safe_push (output_def_pair, output_defs, p);
|
||||
}
|
||||
else
|
||||
assemble_output_def (decl, target);
|
||||
#else /* !ASM_OUTPUT_DEF */
|
||||
#if defined (ASM_OUTPUT_WEAK_ALIAS) || defined (ASM_WEAKEN_DECL)
|
||||
if (DECL_WEAK (decl))
|
||||
{
|
||||
const char *name;
|
||||
tree *p, t;
|
||||
|
||||
name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
|
||||
#ifdef ASM_WEAKEN_DECL
|
||||
ASM_WEAKEN_DECL (asm_out_file, decl, name, IDENTIFIER_POINTER (target));
|
||||
#else
|
||||
|
Loading…
Reference in New Issue
Block a user