alpha.c (common_object_handler): New function.

* config/alpha/alpha.c (common_object_handler): New function.
	(vms_attribute_table): Declare a single attribute "common_object".
	(vms_output_aligned_decl_common): New global function.
	(SECTION_VMS_OVERLAY): Delete.
	(SECTION_VMS_GLOBAL): Likewise.
	(SECTION_VMS_INITIALIZE): Likewise.
	(vms_asm_named_section): Remove support for above flags.
	(vms_section_type_flags): Delete.
	(TARGET_SECTION_TYPE_FLAGS): Likewise.
	* config/alpha/alpha-protos.h (vms_output_aligned_decl_common): New.
	* config/alpha/vms.h (ASM_OUTPUT_ALIGNED_COMMON): Delete.
	(ASM_OUTPUT_ALIGNED_DECL_COMMON): New macro.


Co-Authored-By: Douglas B Rupp <rupp@gnat.com>

From-SVN: r150645
This commit is contained in:
Eric Botcazou 2009-08-11 05:00:51 +00:00 committed by Douglas Rupp
parent 41ca42469f
commit 18fd562170
4 changed files with 61 additions and 45 deletions

View File

@ -1,3 +1,19 @@
2009-08-10 Eric Botcazou <botcazou@adacore.com>
Douglas B Rupp <rupp@gnat.com>
* config/alpha/alpha.c (common_object_handler): New function.
(vms_attribute_table): Declare a single attribute "common_object".
(vms_output_aligned_decl_common): New global function.
(SECTION_VMS_OVERLAY): Delete.
(SECTION_VMS_GLOBAL): Likewise.
(SECTION_VMS_INITIALIZE): Likewise.
(vms_asm_named_section): Remove support for above flags.
(vms_section_type_flags): Delete.
(TARGET_SECTION_TYPE_FLAGS): Likewise.
* config/alpha/alpha-protos.h (vms_output_aligned_decl_common): New.
* config/alpha/vms.h (ASM_OUTPUT_ALIGNED_COMMON): Delete.
(ASM_OUTPUT_ALIGNED_DECL_COMMON): New macro.
2009-08-10 SUGIOKA Toshinobu <sugioka@itonet.co.jp>
PR target/41015

View File

@ -113,6 +113,10 @@ extern rtx alpha_use_linkage (rtx, tree, int, int);
extern enum avms_arg_type alpha_arg_type (enum machine_mode);
extern rtx alpha_arg_info_reg_val (CUMULATIVE_ARGS);
extern void avms_asm_output_external (FILE *, tree, const char *);
extern void vms_output_aligned_decl_common (FILE *, tree, const char *,
unsigned HOST_WIDE_INT,
unsigned int);
#endif
extern rtx unicosmk_add_call_info_word (rtx);

View File

@ -7461,16 +7461,50 @@ alpha_using_fp (void)
}
#if TARGET_ABI_OPEN_VMS
#define COMMON_OBJECT "common_object"
static tree
common_object_handler (tree *node, tree name ATTRIBUTE_UNUSED,
tree args ATTRIBUTE_UNUSED, int flags ATTRIBUTE_UNUSED,
bool *no_add_attrs ATTRIBUTE_UNUSED)
{
tree decl = *node;
gcc_assert (DECL_P (decl));
DECL_COMMON (decl) = 1;
return NULL_TREE;
}
static const struct attribute_spec vms_attribute_table[] =
{
/* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */
{ "overlaid", 0, 0, true, false, false, NULL },
{ "global", 0, 0, true, false, false, NULL },
{ "initialize", 0, 0, true, false, false, NULL },
{ NULL, 0, 0, false, false, false, NULL }
{ COMMON_OBJECT, 0, 1, true, false, false, common_object_handler },
{ NULL, 0, 0, false, false, false, NULL }
};
void
vms_output_aligned_decl_common(FILE *file, tree decl, const char *name,
unsigned HOST_WIDE_INT size,
unsigned int align)
{
tree attr = DECL_ATTRIBUTES (decl);
fprintf (file, "%s", COMMON_ASM_OP);
assemble_name (file, name);
fprintf (file, "," HOST_WIDE_INT_PRINT_UNSIGNED, size);
/* ??? Unlike on OSF/1, the alignment factor is not in log units. */
fprintf (file, ",%u", align / BITS_PER_UNIT);
if (attr)
{
attr = lookup_attribute (COMMON_OBJECT, attr);
if (attr)
fprintf (file, ",%s",
IDENTIFIER_POINTER (TREE_VALUE (TREE_VALUE (attr))));
}
fputc ('\n', file);
}
#undef COMMON_OBJECT
#endif
static int
@ -9971,31 +10005,6 @@ alpha_write_linkage (FILE *stream, const char *funname, tree fundecl)
}
}
/* Given a decl, a section name, and whether the decl initializer
has relocs, choose attributes for the section. */
#define SECTION_VMS_OVERLAY SECTION_FORGET
#define SECTION_VMS_GLOBAL SECTION_MACH_DEP
#define SECTION_VMS_INITIALIZE (SECTION_VMS_GLOBAL << 1)
static unsigned int
vms_section_type_flags (tree decl, const char *name, int reloc)
{
unsigned int flags = default_section_type_flags (decl, name, reloc);
if (decl && DECL_ATTRIBUTES (decl)
&& lookup_attribute ("overlaid", DECL_ATTRIBUTES (decl)))
flags |= SECTION_VMS_OVERLAY;
if (decl && DECL_ATTRIBUTES (decl)
&& lookup_attribute ("global", DECL_ATTRIBUTES (decl)))
flags |= SECTION_VMS_GLOBAL;
if (decl && DECL_ATTRIBUTES (decl)
&& lookup_attribute ("initialize", DECL_ATTRIBUTES (decl)))
flags |= SECTION_VMS_INITIALIZE;
return flags;
}
/* Switch to an arbitrary section NAME with attributes as specified
by FLAGS. ALIGN specifies any known alignment requirements for
the section; 0 if the default should be used. */
@ -10007,12 +10016,6 @@ vms_asm_named_section (const char *name, unsigned int flags,
fputc ('\n', asm_out_file);
fprintf (asm_out_file, ".section\t%s", name);
if (flags & SECTION_VMS_OVERLAY)
fprintf (asm_out_file, ",OVR");
if (flags & SECTION_VMS_GLOBAL)
fprintf (asm_out_file, ",GBL");
if (flags & SECTION_VMS_INITIALIZE)
fprintf (asm_out_file, ",NOMOD");
if (flags & SECTION_DEBUG)
fprintf (asm_out_file, ",NOWRT");
@ -10876,8 +10879,6 @@ alpha_init_libfuncs (void)
#if TARGET_ABI_OPEN_VMS
# undef TARGET_ATTRIBUTE_TABLE
# define TARGET_ATTRIBUTE_TABLE vms_attribute_table
# undef TARGET_SECTION_TYPE_FLAGS
# define TARGET_SECTION_TYPE_FLAGS vms_section_type_flags
#endif
#undef TARGET_IN_SMALL_DATA_P

View File

@ -242,14 +242,9 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info;
#define COMMON_ASM_OP "\t.comm\t"
#undef ASM_OUTPUT_ALIGNED_COMMON
#define ASM_OUTPUT_ALIGNED_COMMON(FILE, NAME, SIZE, ALIGN) \
do { \
fprintf ((FILE), "%s", COMMON_ASM_OP); \
assemble_name ((FILE), (NAME)); \
fprintf ((FILE), "," HOST_WIDE_INT_PRINT_UNSIGNED ",%u\n", (SIZE), (ALIGN) / BITS_PER_UNIT); \
} while (0)
#undef ASM_OUTPUT_ALIGNED_DECL_COMMON
#define ASM_OUTPUT_ALIGNED_DECL_COMMON(FILE, DECL, NAME, SIZE, ALIGN) \
vms_output_aligned_decl_common (FILE, DECL, NAME, SIZE, ALIGN)
#undef TRAMPOLINE_TEMPLATE