summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-25 12:30:07 +0000
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>2010-11-25 12:30:07 +0000
commit62433d51b557afd16e16f5db9e8fb3e5d86ba694 (patch)
tree53c658f06750cdef237c8cdb0035bc208fccf85b
parent50540fea265e7347f25e20bda369b96e00869d17 (diff)
downloadgcc-62433d51b557afd16e16f5db9e8fb3e5d86ba694.tar.gz
2010-11-25 Kai Tietz <kai.tietz@onevision.com>
* cgraphunit.c (process_function_and_variable_attributes): Mark dllexport-ed function/variables as needed. * ipa.c (cgraph_externally_visible_p): Make dllexport-ed as externally visible. 2010-11-25 Kai Tietz <kai.tietz@onevision.com> * gcc.dg/dll-8.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@167144 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/cgraphunit.c18
-rw-r--r--gcc/ipa.c8
-rw-r--r--gcc/testsuite/ChangeLog4
-rwxr-xr-xgcc/testsuite/gcc.dg/dll-8.c14
5 files changed, 48 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c01dd54cb82..c5d09798f4f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-11-25 Kai Tietz <kai.tietz@onevision.com>
+
+ * cgraphunit.c (process_function_and_variable_attributes):
+ Mark dllexport-ed function/variables as needed.
+ * ipa.c (cgraph_externally_visible_p): Make dllexport-ed
+ as externally visible.
+
2010-11-25 Alexander Monakov <amonakov@ispras.ru>
PR rtl-optimization/46585
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index dd7c0fbffce..c7c566540f0 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -816,7 +816,14 @@ process_function_and_variable_attributes (struct cgraph_node *first,
tree decl = node->decl;
if (DECL_PRESERVE_P (decl))
cgraph_mark_needed_node (node);
- if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
+ if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))
+ && TREE_PUBLIC (node->decl))
+ {
+ if (node->local.finalized)
+ cgraph_mark_needed_node (node);
+ }
+ else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
{
if (! TREE_PUBLIC (node->decl))
warning_at (DECL_SOURCE_LOCATION (node->decl), OPT_Wattributes,
@@ -835,7 +842,14 @@ process_function_and_variable_attributes (struct cgraph_node *first,
if (vnode->finalized)
varpool_mark_needed_node (vnode);
}
- if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
+ if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllexport", DECL_ATTRIBUTES (decl))
+ && TREE_PUBLIC (node->decl))
+ {
+ if (vnode->finalized)
+ varpool_mark_needed_node (vnode);
+ }
+ else if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (decl)))
{
if (! TREE_PUBLIC (vnode->decl))
warning_at (DECL_SOURCE_LOCATION (vnode->decl), OPT_Wattributes,
diff --git a/gcc/ipa.c b/gcc/ipa.c
index 28e6872ef7f..0b6518bf449 100644
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -662,7 +662,9 @@ cgraph_externally_visible_p (struct cgraph_node *node, bool whole_program, bool
return true;
if (lookup_attribute ("externally_visible", DECL_ATTRIBUTES (node->decl)))
return true;
-
+ if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllexport", DECL_ATTRIBUTES (node->decl)))
+ return true;
/* When doing LTO or whole program, we can bring COMDAT functoins static.
This improves code quality and we know we will duplicate them at most twice
(in the case that we are not using plugin and link with object file
@@ -724,6 +726,10 @@ varpool_externally_visible_p (struct varpool_node *vnode, bool aliased)
if (lookup_attribute ("externally_visible",
DECL_ATTRIBUTES (vnode->decl)))
return true;
+ if (TARGET_DLLIMPORT_DECL_ATTRIBUTES
+ && lookup_attribute ("dllexport",
+ DECL_ATTRIBUTES (vnode->decl)))
+ return true;
/* See if we have linker information about symbol not being used or
if we need to make guess based on the declaration.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bc51b578620..4dc1eeee11f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-11-25 Kai Tietz <kai.tietz@onevision.com>
+
+ * gcc.dg/dll-8.c: New.
+
2010-11-25 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/loop_optimization7.adb: Remove dg-require-effective-target.
diff --git a/gcc/testsuite/gcc.dg/dll-8.c b/gcc/testsuite/gcc.dg/dll-8.c
new file mode 100755
index 00000000000..98afba8d0d2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/dll-8.c
@@ -0,0 +1,14 @@
+/* { dg-do compile { target i?86-pc-cygwin } } */
+/* { dg-do compile { target i?86-*-mingw* x86_64-*-mingw*} } */
+/* { dg-options "-O3 -fwhole-program" } */
+/* { dg-final { scan-assembler "foo1" } } */
+/* { dg-final { scan-assembler-not "foo2" } } */
+/* { dg-final { scan-assembler "doo1" } } */
+/* { dg-final { scan-assembler-not "doo2" } } */
+
+__declspec(dllexport) int doo1 = 2;
+int doo2 = 3;
+__declspec(dllexport) int foo1 (void) { return 0; }
+int foo2 (void) { return 1; }
+int main() { return 0; }
+