diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2014-12-05 21:04:36 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2014-12-05 21:04:36 +0000 |
commit | 28a2451b35bde35c09a28ef608a73c6da2bd8333 (patch) | |
tree | 7b39e48d2fc815dc203aeb1e8a5c5b15c300be3b /llvm/lib/Linker/LinkModules.cpp | |
parent | 2f02fe0bd3db6a9e3c73cc6c0cc4ad3bc500dbfc (diff) | |
download | bcm5719-llvm-28a2451b35bde35c09a28ef608a73c6da2bd8333.tar.gz bcm5719-llvm-28a2451b35bde35c09a28ef608a73c6da2bd8333.zip |
Simplify the loop linking function bodies. NFC.
llvm-svn: 223512
Diffstat (limited to 'llvm/lib/Linker/LinkModules.cpp')
-rw-r--r-- | llvm/lib/Linker/LinkModules.cpp | 58 |
1 files changed, 21 insertions, 37 deletions
diff --git a/llvm/lib/Linker/LinkModules.cpp b/llvm/lib/Linker/LinkModules.cpp index 1d4dae4c479..c7cf9f69003 100644 --- a/llvm/lib/Linker/LinkModules.cpp +++ b/llvm/lib/Linker/LinkModules.cpp @@ -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; } |