Index: lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp =================================================================== --- lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/raw_ostream.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/IPO/FunctionAttrs.h" +#include "llvm/Transforms/IPO/FunctionImport.h" #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Transforms/Utils/ModuleUtils.h" using namespace llvm; @@ -169,45 +170,17 @@ } } -void filterModule( - Module *M, function_ref ShouldKeepDefinition) { - for (Module::alias_iterator I = M->alias_begin(), E = M->alias_end(); - I != E;) { - GlobalAlias *GA = &*I++; - if (ShouldKeepDefinition(GA)) +static void filterModule(Module *M, + function_ref ShouldKeep) { + auto I = M->global_values().begin(); + auto E = M->global_values().end(); + while (I != E) { + GlobalValue &GA = *I++; + if (ShouldKeep(&GA)) continue; - - GlobalObject *GO; - if (GA->getValueType()->isFunctionTy()) - GO = Function::Create(cast(GA->getValueType()), - GlobalValue::ExternalLinkage, "", M); - else - GO = new GlobalVariable( - *M, GA->getValueType(), false, GlobalValue::ExternalLinkage, - nullptr, "", nullptr, - GA->getThreadLocalMode(), GA->getType()->getAddressSpace()); - GO->takeName(GA); - GA->replaceAllUsesWith(GO); - GA->eraseFromParent(); - } - - for (Function &F : *M) { - if (ShouldKeepDefinition(&F)) + if (convertToDeclaration(GA)) continue; - - F.deleteBody(); - F.setComdat(nullptr); - F.clearMetadata(); - } - - for (GlobalVariable &GV : M->globals()) { - if (ShouldKeepDefinition(&GV)) - continue; - - GV.setInitializer(nullptr); - GV.setLinkage(GlobalValue::ExternalLinkage); - GV.setComdat(nullptr); - GV.clearMetadata(); + GA.eraseFromParent(); } }