Optimize linkonce_odr unnamed_addr functions during LTO.
[oota-llvm.git] / lib / LTO / LTOCodeGenerator.cpp
index 3abb6238b3e6a07d519d61dbc4a533a275f76da4..e35e33666ecb357c9d23543db70545e46c57b35b 100644 (file)
@@ -310,6 +310,7 @@ bool LTOCodeGenerator::determineTarget(std::string &errMsg) {
 void LTOCodeGenerator::
 applyRestriction(GlobalValue &GV,
                  std::vector<const char*> &MustPreserveList,
+                 std::vector<const char*> &DSOList,
                  SmallPtrSet<GlobalValue*, 8> &AsmUsed,
                  Mangler &Mangler) {
   SmallString<64> Buffer;
@@ -319,6 +320,8 @@ applyRestriction(GlobalValue &GV,
     return;
   if (MustPreserveSymbols.count(Buffer))
     MustPreserveList.push_back(GV.getName().data());
+  if (DSOSymbols.count(Buffer))
+    DSOList.push_back(GV.getName().data());
   if (AsmUndefinedRefs.count(Buffer))
     AsmUsed.insert(&GV);
 }
@@ -348,17 +351,18 @@ void LTOCodeGenerator::applyScopeRestrictions() {
                      NULL);
   Mangler Mangler(MContext, TargetMach);
   std::vector<const char*> MustPreserveList;
+  std::vector<const char*> DSOList;
   SmallPtrSet<GlobalValue*, 8> AsmUsed;
 
   for (Module::iterator f = mergedModule->begin(),
          e = mergedModule->end(); f != e; ++f)
-    applyRestriction(*f, MustPreserveList, AsmUsed, Mangler);
+    applyRestriction(*f, MustPreserveList, DSOList, AsmUsed, Mangler);
   for (Module::global_iterator v = mergedModule->global_begin(),
          e = mergedModule->global_end(); v !=  e; ++v)
-    applyRestriction(*v, MustPreserveList, AsmUsed, Mangler);
+    applyRestriction(*v, MustPreserveList, DSOList, AsmUsed, Mangler);
   for (Module::alias_iterator a = mergedModule->alias_begin(),
          e = mergedModule->alias_end(); a != e; ++a)
-    applyRestriction(*a, MustPreserveList, AsmUsed, Mangler);
+    applyRestriction(*a, MustPreserveList, DSOList, AsmUsed, Mangler);
 
   GlobalVariable *LLVMCompilerUsed =
     mergedModule->getGlobalVariable("llvm.compiler.used");
@@ -386,7 +390,7 @@ void LTOCodeGenerator::applyScopeRestrictions() {
     LLVMCompilerUsed->setSection("llvm.metadata");
   }
 
-  passes.add(createInternalizePass(MustPreserveList));
+  passes.add(createInternalizePass(MustPreserveList, DSOList));
 
   // apply scope restrictions
   passes.run(*mergedModule);