Global variables with APPENDING linkage are very important to keep around!
authorChris Lattner <sabre@nondot.org>
Sat, 20 Sep 2003 19:00:50 +0000 (19:00 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 20 Sep 2003 19:00:50 +0000 (19:00 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8632 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/GlobalDCE.cpp

index 2e18c43bac37c34ff253961d32dd71af1aae8832..b47b365d59d1ca7e28c8cd7df91240e5cddcbcc8 100644 (file)
@@ -48,14 +48,17 @@ bool GlobalDCE::run(Module &M) {
   for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
     Changed |= RemoveUnusedConstantPointerRef(*I);
     // Functions with external linkage are needed if they have a body
-    if (I->hasExternalLinkage() && !I->isExternal())
+    if ((!I->hasInternalLinkage() && !I->hasLinkOnceLinkage()) &&
+        !I->isExternal())
       GlobalIsNeeded(I);
   }
 
   for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I) {
     Changed |= RemoveUnusedConstantPointerRef(*I);
-    // Externally visible globals are needed, if they have an initializer.
-    if (I->hasExternalLinkage() && !I->isExternal())
+    // Externally visible & appending globals are needed, if they have an
+    // initializer.
+    if ((!I->hasInternalLinkage() && !I->hasLinkOnceLinkage()) &&
+        !I->isExternal())
       GlobalIsNeeded(I);
   }