From 9d602c5900c50a7cda00695c00e1945badc184cf Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Thu, 25 Nov 2010 12:30:07 +0000 Subject: [PATCH] cgraphunit.c (process_function_and_variable_attributes): Mark dllexport-ed function/variables as needed. 2010-11-25 Kai Tietz * 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 * gcc.dg/dll-8.c: New. From-SVN: r167144 --- gcc/ChangeLog | 7 +++++++ gcc/cgraphunit.c | 18 ++++++++++++++++-- gcc/ipa.c | 8 +++++++- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/dll-8.c | 14 ++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100755 gcc/testsuite/gcc.dg/dll-8.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c01dd54cb827..c5d09798f4ff 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-11-25 Kai Tietz + + * 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 PR rtl-optimization/46585 diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index dd7c0fbffce4..c7c566540f00 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 28e6872ef7ff..0b6518bf4497 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 bc51b578620e..4dc1eeee11f7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-11-25 Kai Tietz + + * gcc.dg/dll-8.c: New. + 2010-11-25 Eric Botcazou * 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 000000000000..98afba8d0d2b --- /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; } +