diff options
author | Danny Smith <dannysmith@users.sourceforge.net> | 2005-04-01 08:13:50 +0000 |
---|---|---|
committer | Danny Smith <dannysmith@gcc.gnu.org> | 2005-04-01 08:13:50 +0000 |
commit | a20f6f00bf53a4debcbf361256ed098f8e930850 (patch) | |
tree | 9133f30c16e782e07da95fa27630f892ccaa5114 /gcc | |
parent | 7c93c2cc4dd591cfc88bd058611befae64c6238a (diff) | |
download | gcc-a20f6f00bf53a4debcbf361256ed098f8e930850.zip gcc-a20f6f00bf53a4debcbf361256ed098f8e930850.tar.gz gcc-a20f6f00bf53a4debcbf361256ed098f8e930850.tar.bz2 |
cygming.h (SUBTARGET_ATTRIBUTE_TABLE): Define, with entry for selectany attribute.
* config/i386/cygming.h (SUBTARGET_ATTRIBUTE_TABLE): Define,
with entry for selectany attribute.
* config/i386/i386-protos.h (ix86_handle_selectany_attribute):
Declare.
* config/i386/winnt.c (ix86_handle_selectany_attribute): Define.
(i386_pe_asm_named_section): Handle sections generated by
selectany attribute.
* doc/extend.texi (selectany): Document attribute.
From-SVN: r97377
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/i386/cygming.h | 4 | ||||
-rw-r--r-- | gcc/config/i386/i386-protos.h | 1 | ||||
-rw-r--r-- | gcc/config/i386/winnt.c | 44 | ||||
-rw-r--r-- | gcc/doc/extend.texi | 20 |
5 files changed, 76 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ab5c35f..0a78483 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2005-04-01 Danny Smith <dannysmith@users.sourceforge.net> + + * config/i386/cygming.h (SUBTARGET_ATTRIBUTE_TABLE): Define, + with entry for selectany attribute. + * config/i386/i386-protos.h (ix86_handle_selectany_attribute): + Declare. + * config/i386/winnt.c (ix86_handle_selectany_attribute): Define. + (i386_pe_asm_named_section): Handle sections generated by + selectany attribute. + * doc/extend.texi (selectany): Document attribute. + 2005-04-01 Paolo Bonzini <bonzini@gnu.org> Jan Hubicka <jh@suse.cz> diff --git a/gcc/config/i386/cygming.h b/gcc/config/i386/cygming.h index a354994..de731bb 100644 --- a/gcc/config/i386/cygming.h +++ b/gcc/config/i386/cygming.h @@ -418,6 +418,10 @@ extern int i386_pe_dllimport_name_p (const char *); #undef TARGET_USE_LOCAL_THUNK_ALIAS_P #define TARGET_USE_LOCAL_THUNK_ALIAS_P(DECL) (!DECL_ONE_ONLY (DECL)) +#define SUBTARGET_ATTRIBUTE_TABLE \ + /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler } */ \ + { "selectany", 0, 0, true, false, false, ix86_handle_selectany_attribute } + #undef TREE #ifndef BUFSIZ diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h index bf69386..1ecc3ae 100644 --- a/gcc/config/i386/i386-protos.h +++ b/gcc/config/i386/i386-protos.h @@ -216,6 +216,7 @@ extern int ix86_data_alignment (tree, int); extern int ix86_local_alignment (tree, int); extern int ix86_constant_alignment (tree, int); extern tree ix86_handle_shared_attribute (tree *, tree, tree, int, bool *); +extern tree ix86_handle_selectany_attribute (tree *, tree, tree, int, bool *); extern unsigned int i386_pe_section_type_flags (tree, const char *, int); extern void i386_pe_asm_named_section (const char *, unsigned int, tree); diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c index c8a7544..ebd8db7 100644 --- a/gcc/config/i386/winnt.c +++ b/gcc/config/i386/winnt.c @@ -78,6 +78,36 @@ ix86_handle_shared_attribute (tree *node, tree name, return NULL_TREE; } + +/* Handle a "selectany" attribute; + arguments as in struct attribute_spec.handler. */ +tree +ix86_handle_selectany_attribute (tree *node, tree name, + tree args ATTRIBUTE_UNUSED, + int flags ATTRIBUTE_UNUSED, + bool *no_add_attrs) +{ + /* The attribute applies only to objects that are initialized and have + external linkage, */ + if (TREE_CODE (*node) == VAR_DECL && TREE_PUBLIC (*node) + && (DECL_INITIAL (*node) + /* If an object is initialized with a ctor, the static + initialization and destruction code for it is present in + each unit defining the object. The code that calls the + ctor is protected by a link-once guard variable, so that + the object still has link-once semantics, */ + || TYPE_NEEDS_CONSTRUCTING (TREE_TYPE (*node)))) + make_decl_one_only (*node); + else + { + error ("%qs attribute applies only to initialized variables" + " with external linkage", IDENTIFIER_POINTER (name)); + *no_add_attrs = true; + } + + return NULL_TREE; +} + /* Return the type that we should use to determine if DECL is imported or exported. */ @@ -622,7 +652,7 @@ i386_pe_section_type_flags (tree decl, const char *name, int reloc) void i386_pe_asm_named_section (const char *name, unsigned int flags, - tree decl ATTRIBUTE_UNUSED) + tree decl) { char flagchars[8], *f = flagchars; @@ -649,10 +679,16 @@ i386_pe_asm_named_section (const char *name, unsigned int flags, if (flags & SECTION_LINKONCE) { /* Functions may have been compiled at various levels of - optimization so we can't use `same_size' here. - Instead, have the linker pick one. */ + optimization so we can't use `same_size' here. + Instead, have the linker pick one, without warning. + If 'selectany' attibute has been specified, MS compiler + sets 'discard' characteristic, rather than telling linker + to warn of size or content mismatch, so do the same. */ + bool discard = (flags & SECTION_CODE) + || lookup_attribute ("selectany", + DECL_ATTRIBUTES (decl)); fprintf (asm_out_file, "\t.linkonce %s\n", - (flags & SECTION_CODE ? "discard" : "same_size")); + (discard ? "discard" : "same_size")); } } diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 02a03ec..48784af 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -3000,6 +3000,26 @@ struct S __attribute__ ((vector_size (16))) foo; is invalid even if the size of the structure is the same as the size of the @code{int}. +@item selectany +The @code{selectany} attribute causes an initialized global variable to +have link-once semantics. When multiple definitions of the variable are +encountered by the linker, the first is selected and the remainder are +discarded. Following usage by the Microsoft compiler, the linker is told +@emph{not} to warn about size or content differences of the multiple +definitions. + +Although the primary usage of this attribute is for POD types, the +attribute can also be applied to global C++ objects that are initialized +by a constructor. In this case, the static initialization and destruction +code for the object is emitted in each translation defining the object, +but the calls to the constructor and destructor are protected by a +link-once guard variable. + +The @code{selectany} attribute is only available on Microsoft Windows +targets. You can use @code{__declspec (selectany)} as a synonym for +@code{__attribute__ ((selectany))} for compatibility with other +compilers. + @item weak The @code{weak} attribute is described in @xref{Function Attributes}. |