Don't ever call materializeAllPermanently during LTO.
[oota-llvm.git] / lib / Linker / LinkModules.cpp
index 0313e2b8a7e085f55453873d2898276537c90f0e..510813ad972a3115e6055a4e72691cfb7ca25d64 100644 (file)
@@ -672,21 +672,10 @@ bool ModuleLinker::getComdatResult(const Comdat *SrcC,
                                        LinkFromSrc);
 }
 
-// FIXME: Duplicated from the gold plugin. This should be refactored somewhere.
-static bool isDeclaration(const GlobalValue &V) {
-  if (V.hasAvailableExternallyLinkage())
-    return true;
-
-  if (V.isMaterializable())
-    return false;
-
-  return V.isDeclaration();
-}
-
 bool ModuleLinker::shouldLinkFromSource(const GlobalValue &Dest,
                                         const GlobalValue &Src) {
-  bool SrcIsDeclaration = isDeclaration(Src);
-  bool DestIsDeclaration = isDeclaration(Dest);
+  bool SrcIsDeclaration = Src.isDeclarationForLinker();
+  bool DestIsDeclaration = Dest.isDeclarationForLinker();
 
   // FIXME: Make datalayout mandatory and just use getDataLayout().
   DataLayout DL(Dest.getParent());
@@ -1635,14 +1624,16 @@ bool ModuleLinker::run() {
           SF->getPrefixData(), ValueMap, RF_None, &TypeMap, &ValMaterializer));
     }
 
-    // Skip if no body (function is external) or materialize.
-    if (SF->isDeclaration()) {
-      if (!SF->isMaterializable())
-        continue;
+    // Materialize if needed.
+    if (SF->isMaterializable()) {
       if (SF->Materialize(&ErrorMsg))
         return true;
     }
 
+    // Skip if no body (function is external).
+    if (SF->isDeclaration())
+      continue;
+
     linkFunctionBody(DF, SF);
     SF->Dematerialize();
   }
@@ -1684,14 +1675,16 @@ bool ModuleLinker::run() {
                                    &ValMaterializer));
       }
 
-      // Materialize if necessary.
-      if (SF->isDeclaration()) {
-        if (!SF->isMaterializable())
-          continue;
+      // Materialize if needed.
+      if (SF->isMaterializable()) {
         if (SF->Materialize(&ErrorMsg))
           return true;
       }
 
+      // Skip if no body (function is external).
+      if (SF->isDeclaration())
+        continue;
+
       // Erase from vector *before* the function body is linked - linkFunctionBody could
       // invalidate I.
       LazilyLinkFunctions.erase(I);