From 95d1d167d0a5255b3f523c23b08efb3deae9c426 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 8 Dec 2014 13:29:33 +0000 Subject: [PATCH] Move materialize/Dematerialize calls to linkFunctionBody. NFC. Just less code duplication. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223653 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Linker/LinkModules.cpp | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 87f195ead2f..9834502a0dd 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -492,7 +492,7 @@ private: void linkAppendingVarInit(const AppendingVarInfo &AVI); void linkGlobalInits(); - void linkFunctionBody(Function *Dst, Function *Src); + bool linkFunctionBody(Function *Dst, Function *Src); void linkAliasBodies(); void linkNamedMDNodes(); }; @@ -1170,9 +1170,13 @@ void ModuleLinker::linkGlobalInits() { /// Copy the source function over into the dest function and fix up references /// to values. At this point we know that Dest is an external function, and /// that Src is not. -void ModuleLinker::linkFunctionBody(Function *Dst, Function *Src) { +bool ModuleLinker::linkFunctionBody(Function *Dst, Function *Src) { assert(Src && Dst && Dst->isDeclaration() && !Src->isDeclaration()); + // Materialize if needed. + if (std::error_code EC = Src->materialize()) + return emitError(EC.message()); + // Go through and convert function arguments over, remembering the mapping. Function::arg_iterator DI = Dst->arg_begin(); for (Function::arg_iterator I = Src->arg_begin(), E = Src->arg_end(); @@ -1200,6 +1204,8 @@ void ModuleLinker::linkFunctionBody(Function *Dst, Function *Src) { I != E; ++I) ValueMap.erase(I); + Src->Dematerialize(); + return false; } /// Insert all of the aliases in Src into the Dest module. @@ -1485,16 +1491,12 @@ bool ModuleLinker::run() { DF->setPrologueData(MapValue( SF->getPrologueData(), ValueMap, RF_None, &TypeMap, &ValMaterializer)); - // Materialize if needed. - if (std::error_code EC = SF->materialize()) - return emitError(EC.message()); - // Skip if no body (function is external). if (SF->isDeclaration()) continue; - linkFunctionBody(DF, SF); - SF->Dematerialize(); + if (linkFunctionBody(DF, SF)) + return true; } // Resolve all uses of aliases with aliasees. @@ -1525,14 +1527,9 @@ bool ModuleLinker::run() { &TypeMap, &ValMaterializer)); } - // Materialize if needed. - if (std::error_code EC = SF->materialize()) - return emitError(EC.message()); - // Link in function body. - assert(!SF->isDeclaration()); - linkFunctionBody(DF, SF); - SF->Dematerialize(); + if (linkFunctionBody(DF, SF)) + return true; } return false;