static llvm::Module* linkFilesToModule(llvm::cl::list<std::string>& Inputs, llvm::LLVMContext& Ctx) { std::string ErrMsg; llvm::Module* M = getModuleFromFilename(Inputs[0], Ctx, ErrMsg); llvm::Linker Linker("llvm-ndk-link", M); for (unsigned i=1; i<Inputs.size(); ++i) { llvm::Module* M = getModuleFromFilename(Inputs[i], Ctx, ErrMsg); if (!Linker.LinkInModule(M, &ErrMsg)) { assert(false && ErrMsg); } optimizeModule(M); } M = Linker.releaseModule(); llvm::PassManager PM; const std::string &ModuleDataLayout = M->getDataLayout(); if (!ModuleDataLayout.empty()) if (llvm::TargetData *TD = new llvm::TargetData(ModuleDataLayout)) PM.add(TD); #if 0 FIXME REMOVE llvm::createStandardFunctionPasses(&PM, 3 /* OptLevel*/); llvm::createStandardModulePasses(&PM, 3, /* OptimizationLevel */ true, /* OptimizeSize */ true, /* UnitAtATime */ true, /* UnrollLoops */ true, /* SimplifyLibCalls */ false, /* HaveExceptions */ NULL /* InliningPass */); #endif llvm::PassManagerBuilder PMBuilder; //PMBuilder.OptLevel = 3; //PMBuilder.populateFunctionPassManager(PM); PMBuilder.OptLevel = 3; PMBuilder.SizeLevel = true; PMBuilder.DisableUnitAtATime = false; PMBuilder.DisableUnrollLoops = false; PMBuilder.DisableSimplifyLibCalls = false; PMBuilder.populateModulePassManager(PM); PM.run(*M); return M; }
bool linkDwarf(StringRef OutputFilename, const DebugMap &DM, bool Verbose) { DwarfLinker Linker(OutputFilename, Verbose); return Linker.link(DM); }