]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2010-11-25 Kai Tietz <kai.tietz@onevision.com>
authorktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Nov 2010 12:30:07 +0000 (12:30 +0000)
committerktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 25 Nov 2010 12:30:07 +0000 (12:30 +0000)
* 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

gcc/ChangeLog
gcc/cgraphunit.c
gcc/ipa.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/dll-8.c [new file with mode: 0755]

index c01dd54cb827986db0fa797a7f242833a7f3ccc2..c5d09798f4ff270fc3395d93f41e1c95bcd018da 100644 (file)
@@ -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
index dd7c0fbffce4b46b138f76f765d0710481285e8e..c7c566540f0082c2c5fd815544d30707c5d9dbae 100644 (file)
@@ -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,
index 28e6872ef7ffe2a47e1ee88e92e8b1c90799e5b4..0b6518bf44972eccbe715b57415c818ec6793fd4 100644 (file)
--- 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.
index bc51b578620e5cbb0245c5871baed4b899c744d0..4dc1eeee11f758bc54f8fd9613e3a8fd166358db 100644 (file)
@@ -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 (executable)
index 0000000..98afba8
--- /dev/null
@@ -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; }
+