hpux.h (TARGET_HPUX_LD): New, define true.
* config/ia64/hpux.h (TARGET_HPUX_LD): New, define true. (ASM_FILE_END) New. * config/ia64/ia64.h (TARGET_HPUX_LD): New, define false. * config/ia64/ia64-protos.h (ia64_hpux_asm_file_end): New. * config/ia64/ia64.c (ia64_asm_output_external): Create list of external functions if TARGET_HPUX_LD is true. (ia64_hpux_add_extern_decl): New, routine to put names on list of external functions. (ia64_hpux_asm_file_end): Put out declarations for external functions if and only if they are used. From-SVN: r56986
This commit is contained in:
parent
0c263f4ed2
commit
686f3bf031
|
@ -1,3 +1,16 @@
|
||||||
|
2002-09-09 Steve Ellcey <sje@cup.hp.com>
|
||||||
|
|
||||||
|
* config/ia64/hpux.h (TARGET_HPUX_LD): New, define true.
|
||||||
|
(ASM_FILE_END) New.
|
||||||
|
* config/ia64/ia64.h (TARGET_HPUX_LD): New, define false.
|
||||||
|
* config/ia64/ia64-protos.h (ia64_hpux_asm_file_end): New.
|
||||||
|
* config/ia64/ia64.c (ia64_asm_output_external): Create list
|
||||||
|
of external functions if TARGET_HPUX_LD is true.
|
||||||
|
(ia64_hpux_add_extern_decl): New, routine to put names on
|
||||||
|
list of external functions.
|
||||||
|
(ia64_hpux_asm_file_end): Put out declarations for external
|
||||||
|
functions if and only if they are used.
|
||||||
|
|
||||||
2002-09-09 John David Anglin <dave@hiauly1.hia.nrc.ca>
|
2002-09-09 John David Anglin <dave@hiauly1.hia.nrc.ca>
|
||||||
|
|
||||||
* pa.md (exception_receiver, builtin_setjmp_receiver): Add blockage
|
* pa.md (exception_receiver, builtin_setjmp_receiver): Add blockage
|
||||||
|
|
|
@ -127,3 +127,14 @@ do { \
|
||||||
|
|
||||||
#define REGISTER_TARGET_PRAGMAS(PFILE) \
|
#define REGISTER_TARGET_PRAGMAS(PFILE) \
|
||||||
cpp_register_pragma (PFILE, 0, "builtin", ia64_hpux_handle_builtin_pragma)
|
cpp_register_pragma (PFILE, 0, "builtin", ia64_hpux_handle_builtin_pragma)
|
||||||
|
|
||||||
|
/* Tell ia64.c that we are using the HP linker and we should delay output of
|
||||||
|
function extern declarations so that we don't output them for functions
|
||||||
|
which are never used (and may not be defined). */
|
||||||
|
|
||||||
|
#undef TARGET_HPUX_LD
|
||||||
|
#define TARGET_HPUX_LD 1
|
||||||
|
|
||||||
|
/* Put out the needed function declarations at the end. */
|
||||||
|
|
||||||
|
#define ASM_FILE_END(STREAM) ia64_hpux_asm_file_end(STREAM)
|
||||||
|
|
|
@ -148,3 +148,5 @@ extern enum direction ia64_hpux_function_arg_padding PARAMS ((enum machine_mode,
|
||||||
#ifdef GCC_C_PRAGMA_H
|
#ifdef GCC_C_PRAGMA_H
|
||||||
extern void ia64_hpux_handle_builtin_pragma PARAMS ((cpp_reader *));
|
extern void ia64_hpux_handle_builtin_pragma PARAMS ((cpp_reader *));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void ia64_hpux_asm_file_end PARAMS ((FILE *));
|
||||||
|
|
|
@ -171,6 +171,9 @@ static void ia64_aix_unique_section PARAMS ((tree, int))
|
||||||
static void ia64_aix_select_rtx_section PARAMS ((enum machine_mode, rtx,
|
static void ia64_aix_select_rtx_section PARAMS ((enum machine_mode, rtx,
|
||||||
unsigned HOST_WIDE_INT))
|
unsigned HOST_WIDE_INT))
|
||||||
ATTRIBUTE_UNUSED;
|
ATTRIBUTE_UNUSED;
|
||||||
|
|
||||||
|
static void ia64_hpux_add_extern_decl PARAMS ((const char *name))
|
||||||
|
ATTRIBUTE_UNUSED;
|
||||||
|
|
||||||
/* Table of valid machine attributes. */
|
/* Table of valid machine attributes. */
|
||||||
static const struct attribute_spec ia64_attribute_table[] =
|
static const struct attribute_spec ia64_attribute_table[] =
|
||||||
|
@ -4039,8 +4042,13 @@ ia64_asm_output_external (file, decl, name)
|
||||||
{
|
{
|
||||||
int save_referenced;
|
int save_referenced;
|
||||||
|
|
||||||
/* GNU as does not need anything here. */
|
/* GNU as does not need anything here, but the HP linker does need
|
||||||
if (TARGET_GNU_AS)
|
something for external functions. */
|
||||||
|
|
||||||
|
if (TARGET_GNU_AS
|
||||||
|
&& (!TARGET_HPUX_LD
|
||||||
|
|| TREE_CODE (decl) != FUNCTION_DECL
|
||||||
|
|| strstr(name, "__builtin_") == name))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* ??? The Intel assembler creates a reference that needs to be satisfied by
|
/* ??? The Intel assembler creates a reference that needs to be satisfied by
|
||||||
|
@ -4055,13 +4063,18 @@ ia64_asm_output_external (file, decl, name)
|
||||||
|| ! strcmp (name, "__builtin_args_info"))
|
|| ! strcmp (name, "__builtin_args_info"))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* assemble_name will set TREE_SYMBOL_REFERENCED, so we must save and
|
if (TARGET_HPUX_LD)
|
||||||
restore it. */
|
ia64_hpux_add_extern_decl (name);
|
||||||
save_referenced = TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl));
|
else
|
||||||
if (TREE_CODE (decl) == FUNCTION_DECL)
|
{
|
||||||
ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
|
/* assemble_name will set TREE_SYMBOL_REFERENCED, so we must save and
|
||||||
(*targetm.asm_out.globalize_label) (file, name);
|
restore it. */
|
||||||
TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = save_referenced;
|
save_referenced = TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl));
|
||||||
|
if (TREE_CODE (decl) == FUNCTION_DECL)
|
||||||
|
ASM_OUTPUT_TYPE_DIRECTIVE (file, name, "function");
|
||||||
|
(*targetm.asm_out.globalize_label) (file, name);
|
||||||
|
TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)) = save_referenced;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parse the -mfixed-range= option string. */
|
/* Parse the -mfixed-range= option string. */
|
||||||
|
@ -8050,6 +8063,57 @@ ia64_hpux_function_arg_padding (mode, type)
|
||||||
: GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
|
: GET_MODE_BITSIZE (mode) < PARM_BOUNDARY)
|
||||||
? downward : upward);
|
? downward : upward);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Linked list of all external functions that are to be emitted by GCC.
|
||||||
|
We output the name if and only if TREE_SYMBOL_REFERENCED is set in
|
||||||
|
order to avoid putting out names that are never really used. */
|
||||||
|
|
||||||
|
struct extern_func_list
|
||||||
|
{
|
||||||
|
struct extern_func_list *next; /* next external */
|
||||||
|
char *name; /* name of the external */
|
||||||
|
} *extern_func_head = 0;
|
||||||
|
|
||||||
|
static void
|
||||||
|
ia64_hpux_add_extern_decl (name)
|
||||||
|
const char *name;
|
||||||
|
{
|
||||||
|
struct extern_func_list *p;
|
||||||
|
|
||||||
|
p = (struct extern_func_list *) xmalloc (sizeof (struct extern_func_list));
|
||||||
|
p->name = xmalloc (strlen (name) + 1);
|
||||||
|
strcpy(p->name, name);
|
||||||
|
p->next = extern_func_head;
|
||||||
|
extern_func_head = p;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Print out the list of used global functions. */
|
||||||
|
|
||||||
|
void
|
||||||
|
ia64_hpux_asm_file_end (file)
|
||||||
|
FILE *file;
|
||||||
|
{
|
||||||
|
while (extern_func_head)
|
||||||
|
{
|
||||||
|
char *real_name;
|
||||||
|
tree decl;
|
||||||
|
|
||||||
|
real_name = (* targetm.strip_name_encoding) (extern_func_head->name);
|
||||||
|
decl = get_identifier (real_name);
|
||||||
|
if (decl && ! TREE_ASM_WRITTEN (decl) && TREE_SYMBOL_REFERENCED (decl))
|
||||||
|
{
|
||||||
|
TREE_ASM_WRITTEN (decl) = 1;
|
||||||
|
(*targetm.asm_out.globalize_label) (file, real_name);
|
||||||
|
fprintf (file, "%s", TYPE_ASM_OP);
|
||||||
|
assemble_name (file, real_name);
|
||||||
|
putc (',', file);
|
||||||
|
fprintf (file, TYPE_OPERAND_FMT, "function");
|
||||||
|
putc ('\n', file);
|
||||||
|
}
|
||||||
|
extern_func_head = extern_func_head->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Switch to the section to which we should output X. The only thing
|
/* Switch to the section to which we should output X. The only thing
|
||||||
special we do here is to honor small data. */
|
special we do here is to honor small data. */
|
||||||
|
|
|
@ -127,6 +127,8 @@ extern int ia64_tls_size;
|
||||||
#define TARGET_TLS22 (ia64_tls_size == 22)
|
#define TARGET_TLS22 (ia64_tls_size == 22)
|
||||||
#define TARGET_TLS64 (ia64_tls_size == 64)
|
#define TARGET_TLS64 (ia64_tls_size == 64)
|
||||||
|
|
||||||
|
#define TARGET_HPUX_LD 0
|
||||||
|
|
||||||
/* This macro defines names of command options to set and clear bits in
|
/* This macro defines names of command options to set and clear bits in
|
||||||
`target_flags'. Its definition is an initializer with a subgrouping for
|
`target_flags'. Its definition is an initializer with a subgrouping for
|
||||||
each command option. */
|
each command option. */
|
||||||
|
|
Loading…
Reference in New Issue