aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/i386/winnt.c59
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl.c10
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/g++.dg/ext/dllimport4.C32
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" }
+