diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/config/i386/winnt.c | 59 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/decl.c | 10 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/dllimport4.C | 32 |
6 files changed, 102 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3960717..28eda6e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2006-06-23 Danny Smith <dannysmith@users.sourceforge.net> + + PR target/27789 + * config/i386/winnt.c (ix86_handle_selectany_attribute): Move check + for initialization and setting of one_only flag to ... + (i386_pe_encode_section_info): ...here. + (i386_pe_dllimport_p): Check for DECL_DLLIMPORT_P also. + Recheck that the symbol has not been defined. + 2006-06-23 Richard Guenther <rguenther@suse.de> * ggc-page.c (init_ggc): Do not round up the extra_order_size_table @@ -26,6 +35,7 @@ * reload1.c (gen_reload): Call mark_jump_label on the new insns generated by gen_move_insn to add REG_LABEL notes if necessary. +>>>>>>> .r114926 2006-06-22 Bob Wilson <bob.wilson@acm.org> * config/xtensa/lib1funcs.asm (MIN_ESA): Delete. diff --git a/gcc/config/i386/winnt.c b/gcc/config/i386/winnt.c index c7eae6c..a46fc5b 100644 --- a/gcc/config/i386/winnt.c +++ b/gcc/config/i386/winnt.c @@ -1,7 +1,7 @@ /* Subroutines for insn-output.c for Windows NT. Contributed by Douglas Rupp (drupp@cs.washington.edu) - Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 - Free Software Foundation, Inc. + Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, + 2005, 2006 Free Software Foundation, Inc. This file is part of GCC. @@ -88,17 +88,10 @@ ix86_handle_selectany_attribute (tree *node, tree name, 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 + external linkage. However, we may not know about initialization + until the language frontend has processed the decl. We'll check for + initialization later in encode_section_info. */ + if (TREE_CODE (*node) != VAR_DECL || !TREE_PUBLIC (*node)) { error ("%qs attribute applies only to initialized variables" " with external linkage", IDENTIFIER_POINTER (name)); @@ -148,18 +141,28 @@ i386_pe_dllimport_p (tree decl) && TREE_CODE (decl) != FUNCTION_DECL) return false; - /* Lookup the attribute rather than rely on the DECL_DLLIMPORT_P flag. + /* Lookup the attribute in addition to checking the DECL_DLLIMPORT_P flag. We may need to override an earlier decision. */ - if (lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))) - return true; - + if (DECL_DLLIMPORT_P (decl) + && lookup_attribute ("dllimport", DECL_ATTRIBUTES (decl))) + { + /* Make a final check to see if this is a definition before we generate + RTL for an indirect reference. */ + if (!DECL_EXTERNAL (decl)) + { + error ("%q+D: definition is marked as dllimport", decl); + DECL_DLLIMPORT_P (decl) = 0; + return false; + } + return true; + } /* The DECL_DLLIMPORT_P flag was set for decls in the class definition by targetm.cxx.adjust_class_at_definition. Check again to emit warnings if the class attribute has been overridden by an out-of-class definition. */ - if (associated_type (decl) - && lookup_attribute ("dllimport", - TYPE_ATTRIBUTES (associated_type (decl)))) + else if (associated_type (decl) + && lookup_attribute ("dllimport", + TYPE_ATTRIBUTES (associated_type (decl)))) return i386_pe_type_dllimport_p (decl); return false; @@ -362,6 +365,22 @@ i386_pe_encode_section_info (tree decl, rtx rtl, int first) } } + else if (TREE_CODE (decl) == VAR_DECL + && lookup_attribute ("selectany", DECL_ATTRIBUTES (decl))) + { + if (DECL_INITIAL (decl) + /* 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 (decl))) + make_decl_one_only (decl); + else + error ("%q+D:'selectany' attribute applies only to initialized objects", + decl); + } + /* Mark the decl so we can tell from the rtl whether the object is dllexport'd or dllimport'd. tree.c: merge_dllimport_decl_attributes handles dllexport/dllimport override semantics. */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fcea368..30c66d3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2006-06-23 Danny Smith <dannysmith@users.sourceforge.net> + + PR target/27789 + * decl.c (start_decl): Check that dllimports are not initialized. + 2006-06-22 Lee Millward <lee.millward@gmail.com> PR c++/27805 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 5bb61cb..e3c9297 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -3873,6 +3873,16 @@ start_decl (const cp_declarator *declarator, /* Set attributes here so if duplicate decl, will have proper attributes. */ cplus_decl_attributes (&decl, attributes, 0); + /* Dllimported symbols cannot be defined. Static data members (which + can be initialized in-class and dllimported) go through grokfield, + not here, so we don't need to exclude those decls when checking for + a definition. */ + if (initialized && DECL_DLLIMPORT_P (decl)) + { + error ("definition of %q#D is marked %<dllimport%>", decl); + DECL_DLLIMPORT_P (decl) = 0; + } + /* If #pragma weak was used, mark the decl weak now. */ maybe_apply_pragma_weak (decl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f0a68e5..b9204ec 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-06-23 Danny Smith <dannysmith@users.sourceforge.net> + + PR target/27789 + * g++.dg/ext/dllimport4.C. Add more tests for invalid + initialization. + 2006-06-22 Roger Sayle <roger@eyesopen.com> PR target/27531 diff --git a/gcc/testsuite/g++.dg/ext/dllimport4.C b/gcc/testsuite/g++.dg/ext/dllimport4.C index f61773b..2baa944 100644 --- a/gcc/testsuite/g++.dg/ext/dllimport4.C +++ b/gcc/testsuite/g++.dg/ext/dllimport4.C @@ -4,3 +4,35 @@ __attribute__((dllimport)) void bar () { } // { dg-error "definition" } __attribute__((dllimport)) int foo = 1; // { dg-error "definition" } + +void faz() +{ + __attribute__((dllimport)) int faa = 1; // { dg-error "definition" } + faa++; +} + +__attribute__((dllimport)) int fee (1); // { dg-error "definition" } + + +// In-class initialization of a static data member is not a definition. +struct F +{ + __attribute__ ((dllimport)) static const int i = 1; // OK +}; + +// Reference the dllimport'd static data member. +void f () +{ + const int* j = &F::i; +} + +struct G +{ + __attribute__ ((dllimport)) static const int i = 1; +}; + +// Define the static data member _without_ the dllimport. +// This should override the prior declaration with dllimport. + +const int G::i; // { dg-warning "dllimport ignored" } + |