Simplify the loop linking function bodies. NFC.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 5 Dec 2014 21:04:36 +0000 (21:04 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 5 Dec 2014 21:04:36 +0000 (21:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223512 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Linker/LinkModules.cpp

index 1d4dae4c479dda79fa909edd675b2e6446cc90f5..c7cf9f6900351f5e19b590c0d04f383332168c05 100644 (file)
@@ -1514,48 +1514,32 @@ bool ModuleLinker::run() {
   linkGlobalInits();
 
   // Process vector of lazily linked in functions.
-  bool LinkedInAnyFunctions;
-  do {
-    LinkedInAnyFunctions = false;
-
-    for(std::vector<Function*>::iterator I = LazilyLinkFunctions.begin(),
-        E = LazilyLinkFunctions.end(); I != E; ++I) {
-      Function *SF = *I;
-      if (!SF)
-        continue;
-
-      Function *DF = cast<Function>(ValueMap[SF]);
-      if (SF->hasPrefixData()) {
-        // Link in the prefix data.
-        DF->setPrefixData(MapValue(SF->getPrefixData(),
-                                   ValueMap,
-                                   RF_None,
-                                   &TypeMap,
-                                   &ValMaterializer));
-      }
+  while (!LazilyLinkFunctions.empty()) {
+    Function *SF = LazilyLinkFunctions.back();
+    LazilyLinkFunctions.pop_back();
 
-      // Materialize if needed.
-      if (std::error_code EC = SF->materialize())
-        return emitError(EC.message());
+    if (!SF)
+      continue;
 
-      // Skip if no body (function is external).
-      if (SF->isDeclaration())
-        continue;
+    Function *DF = cast<Function>(ValueMap[SF]);
+    if (SF->hasPrefixData()) {
+      // Link in the prefix data.
+      DF->setPrefixData(MapValue(SF->getPrefixData(), ValueMap, RF_None,
+                                 &TypeMap, &ValMaterializer));
+    }
 
-      // Erase from vector *before* the function body is linked - linkFunctionBody could
-      // invalidate I.
-      LazilyLinkFunctions.erase(I);
+    // Materialize if needed.
+    if (std::error_code EC = SF->materialize())
+      return emitError(EC.message());
 
-      // Link in function body.
-      linkFunctionBody(DF, SF);
-      SF->Dematerialize();
+    // Skip if no body (function is external).
+    if (SF->isDeclaration())
+      continue;
 
-      // Set flag to indicate we may have more functions to lazily link in
-      // since we linked in a function.
-      LinkedInAnyFunctions = true;
-      break;
-    }
-  } while (LinkedInAnyFunctions);
+    // Link in function body.
+    linkFunctionBody(DF, SF);
+    SF->Dematerialize();
+  }
 
   return false;
 }