[llvm-commits] [dragonegg] r137215 - /dragonegg/trunk/src/Backend.cpp

Duncan Sands baldrick at free.fr
Wed Aug 10 08:59:56 PDT 2011


Author: baldrick
Date: Wed Aug 10 10:59:56 2011
New Revision: 137215

URL: http://llvm.org/viewvc/llvm-project?rev=137215&view=rev
Log:
Moving output of externally visible global variables into the
PLUGIN_ALL_IPA_PASSES_END hook means it runs just before cgraph
removes unneeded variables (while before it was running after).
This results in lots of extra variables being output with gcc-4.6,
causing link failures due to linkage not being output quite right.
This patch tweaks linkage, making that part of things a bit better
(I'm not convinced it is completely correct though); and it uses a
more powerful test for which variables need to be output, resulting
in essentially the same output as if cgraph variable removal had
been done first.

Modified:
    dragonegg/trunk/src/Backend.cpp

Modified: dragonegg/trunk/src/Backend.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Backend.cpp?rev=137215&r1=137214&r2=137215&view=diff
==============================================================================
--- dragonegg/trunk/src/Backend.cpp (original)
+++ dragonegg/trunk/src/Backend.cpp Wed Aug 10 10:59:56 2011
@@ -863,25 +863,23 @@
   // Set the linkage.
   GlobalValue::LinkageTypes Linkage;
 
-  if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
-      && false) {// FIXME DECL_LLVM_PRIVATE(decl)) {
+  if (false) {// FIXME DECL_LLVM_PRIVATE(decl)) {
     Linkage = GlobalValue::PrivateLinkage;
-  } else if (CODE_CONTAINS_STRUCT (TREE_CODE (decl), TS_DECL_WITH_VIS)
-             && false) {//FIXME DECL_LLVM_LINKER_PRIVATE(decl)) {
+  } else if (false) {//FIXME DECL_LLVM_LINKER_PRIVATE(decl)) {
     Linkage = GlobalValue::LinkerPrivateLinkage;
   } else if (!TREE_PUBLIC(decl)) {
     Linkage = GlobalValue::InternalLinkage;
+  } else if (DECL_COMDAT(decl)) {
+    Linkage = GlobalValue::getLinkOnceLinkage(flag_odr);
+  } else if (DECL_ONE_ONLY(decl)) {
+    Linkage = GlobalValue::getWeakLinkage(flag_odr);
   } else if (DECL_WEAK(decl)) {
     // The user may have explicitly asked for weak linkage - ignore flag_odr.
     Linkage = GlobalValue::WeakAnyLinkage;
-  } else if (DECL_ONE_ONLY(decl)) {
-    Linkage = GlobalValue::getWeakLinkage(flag_odr);
   } else if (DECL_COMMON(decl) &&  // DECL_COMMON is only meaningful if no init
              (!DECL_INITIAL(decl) || DECL_INITIAL(decl) == error_mark_node)) {
     // llvm-gcc also includes DECL_VIRTUAL_P here.
     Linkage = GlobalValue::CommonLinkage;
-  } else if (DECL_COMDAT(decl)) {
-    Linkage = GlobalValue::getLinkOnceLinkage(flag_odr);
   } else {
     Linkage = GV->getLinkage();
   }
@@ -1664,11 +1662,17 @@
   for (struct varpool_node *vnode = varpool_nodes; vnode; vnode = vnode->next) {
     if (!vnode->needed || vnode->alias)
       continue;
+    tree decl = vnode->decl;
+    // If this variable need not be output if unused, then skip it.
+    if (!vnode->force_output && vnode->analyzed &&
 #if (GCC_MINOR > 5)
-    if (vnode->in_other_partition)
-      continue;
+        varpool_can_remove_if_no_refs(vnode)
+#else
+        (DECL_COMDAT(decl) || (DECL_ARTIFICIAL(decl) &&
+                               !vnode->externally_visible))
 #endif
-    tree decl = vnode->decl;
+       )
+      continue;
     if (TREE_CODE(decl) == VAR_DECL && !DECL_EXTERNAL(decl) &&
         (TREE_PUBLIC(decl) || DECL_PRESERVE_P(decl) ||
          TREE_THIS_VOLATILE(decl)))





More information about the llvm-commits mailing list