aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2010-11-25 12:30:07 +0000
committerKai Tietz <ktietz@gcc.gnu.org>2010-11-25 13:30:07 +0100
commit9d602c5900c50a7cda00695c00e1945badc184cf (patch)
tree53c658f06750cdef237c8cdb0035bc208fccf85b /gcc
parentc8230704c44609131a832307f2eee04df3206eb8 (diff)
downloadgcc-9d602c5900c50a7cda00695c00e1945badc184cf.zip
gcc-9d602c5900c50a7cda00695c00e1945badc184cf.tar.gz
gcc-9d602c5900c50a7cda00695c00e1945badc184cf.tar.bz2
cgraphunit.c (process_function_and_variable_attributes): Mark dllexport-ed function/variables as needed.
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. From-SVN: r167144
Diffstat (limited to 'gcc')
-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 c01dd54..c5d0979 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 dd7c0fb..c7c5665 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 28e6872..0b6518b 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 bc51b57..4dc1eee 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 0000000..98afba8
--- /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; }
+