X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FLTO%2FLTOCodeGenerator.cpp;h=66df23bab1b59e8cf7a49f1413194e976af78649;hb=7609bf251117db67abfe0d5b6622860afc769278;hp=56240502c02821f51f7785c39623ad6fb4e9f9bf;hpb=8de34ad8f7dd5c159c1989c011fa70fd6f62026a;p=oota-llvm.git diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 56240502c02..66df23bab1b 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -64,17 +64,9 @@ const char* LTOCodeGenerator::getVersionString() { #endif } -LTOCodeGenerator::LTOCodeGenerator() - : Context(getGlobalContext()), - MergedModule(new Module("ld-temp.o", Context)), - IRLinker(MergedModule.get()) { - initializeLTOPasses(); -} - -LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr Context) - : OwnedContext(std::move(Context)), Context(*OwnedContext), - MergedModule(new Module("ld-temp.o", *OwnedContext)), - IRLinker(MergedModule.get()) { +LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context) + : Context(Context), MergedModule(new Module("ld-temp.o", Context)), + TheLinker(new Linker(*MergedModule)) { initializeLTOPasses(); } @@ -100,7 +92,8 @@ void LTOCodeGenerator::initializeLTOPasses() { initializeSROALegacyPassPass(R); initializeSROA_DTPass(R); initializeSROA_SSAUpPass(R); - initializeFunctionAttrsPass(R); + initializePostOrderFunctionAttrsPass(R); + initializeReversePostOrderFunctionAttrsPass(R); initializeGlobalsAAWrapperPassPass(R); initializeLICMPass(R); initializeMergedLoadStoreMotionPass(R); @@ -114,7 +107,7 @@ bool LTOCodeGenerator::addModule(LTOModule *Mod) { assert(&Mod->getModule().getContext() == &Context && "Expected module in same context"); - bool ret = IRLinker.linkInModule(&Mod->getModule()); + bool ret = TheLinker->linkInModule(Mod->takeModule()); const std::vector &undefs = Mod->getAsmUndefinedRefs(); for (int i = 0, e = undefs.size(); i != e; ++i) @@ -130,7 +123,7 @@ void LTOCodeGenerator::setModule(std::unique_ptr Mod) { AsmUndefinedRefs.clear(); MergedModule = Mod->takeModule(); - IRLinker.setModule(MergedModule.get()); + TheLinker = make_unique(*MergedModule); const std::vector &Undefs = Mod->getAsmUndefinedRefs(); for (int I = 0, E = Undefs.size(); I != E; ++I) @@ -172,9 +165,8 @@ void LTOCodeGenerator::setOptLevel(unsigned Level) { } } -bool LTOCodeGenerator::writeMergedModules(const char *Path, - std::string &ErrMsg) { - if (!determineTarget(ErrMsg)) +bool LTOCodeGenerator::writeMergedModules(const char *Path) { + if (!determineTarget()) return false; // mark which symbols can not be internalized @@ -184,8 +176,9 @@ bool LTOCodeGenerator::writeMergedModules(const char *Path, std::error_code EC; tool_output_file Out(Path, EC, sys::fs::F_None); if (EC) { - ErrMsg = "could not open bitcode file for writing: "; + std::string ErrMsg = "could not open bitcode file for writing: "; ErrMsg += Path; + emitError(ErrMsg); return false; } @@ -194,8 +187,9 @@ bool LTOCodeGenerator::writeMergedModules(const char *Path, Out.os().close(); if (Out.os().has_error()) { - ErrMsg = "could not write bitcode file: "; + std::string ErrMsg = "could not write bitcode file: "; ErrMsg += Path; + emitError(ErrMsg); Out.os().clear_error(); return false; } @@ -204,22 +198,25 @@ bool LTOCodeGenerator::writeMergedModules(const char *Path, return true; } -bool LTOCodeGenerator::compileOptimizedToFile(const char **Name, - std::string &ErrMsg) { - // make unique temp .o file to put generated object file +bool LTOCodeGenerator::compileOptimizedToFile(const char **Name) { + // make unique temp output file to put generated code SmallString<128> Filename; int FD; + + const char *Extension = + (FileType == TargetMachine::CGFT_AssemblyFile ? "s" : "o"); + std::error_code EC = - sys::fs::createTemporaryFile("lto-llvm", "o", FD, Filename); + sys::fs::createTemporaryFile("lto-llvm", Extension, FD, Filename); if (EC) { - ErrMsg = EC.message(); + emitError(EC.message()); return false; } // generate object file tool_output_file objFile(Filename.c_str(), FD); - bool genResult = compileOptimized(&objFile.os(), ErrMsg); + bool genResult = compileOptimized(&objFile.os()); objFile.os().close(); if (objFile.os().has_error()) { objFile.os().clear_error(); @@ -239,16 +236,16 @@ bool LTOCodeGenerator::compileOptimizedToFile(const char **Name, } std::unique_ptr -LTOCodeGenerator::compileOptimized(std::string &ErrMsg) { +LTOCodeGenerator::compileOptimized() { const char *name; - if (!compileOptimizedToFile(&name, ErrMsg)) + if (!compileOptimizedToFile(&name)) return nullptr; // read .o file into memory buffer ErrorOr> BufferOrErr = MemoryBuffer::getFile(name, -1, false); if (std::error_code EC = BufferOrErr.getError()) { - ErrMsg = EC.message(); + emitError(EC.message()); sys::fs::remove(NativeObjectPath); return nullptr; } @@ -262,27 +259,25 @@ LTOCodeGenerator::compileOptimized(std::string &ErrMsg) { bool LTOCodeGenerator::compile_to_file(const char **Name, bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, - bool DisableVectorization, - std::string &ErrMsg) { + bool DisableVectorization) { if (!optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, - DisableVectorization, ErrMsg)) + DisableVectorization)) return false; - return compileOptimizedToFile(Name, ErrMsg); + return compileOptimizedToFile(Name); } std::unique_ptr LTOCodeGenerator::compile(bool DisableVerify, bool DisableInline, - bool DisableGVNLoadPRE, bool DisableVectorization, - std::string &ErrMsg) { + bool DisableGVNLoadPRE, bool DisableVectorization) { if (!optimize(DisableVerify, DisableInline, DisableGVNLoadPRE, - DisableVectorization, ErrMsg)) + DisableVectorization)) return nullptr; - return compileOptimized(ErrMsg); + return compileOptimized(); } -bool LTOCodeGenerator::determineTarget(std::string &ErrMsg) { +bool LTOCodeGenerator::determineTarget() { if (TargetMach) return true; @@ -294,9 +289,12 @@ bool LTOCodeGenerator::determineTarget(std::string &ErrMsg) { llvm::Triple Triple(TripleStr); // create target machine from info for merged modules + std::string ErrMsg; const Target *march = TargetRegistry::lookupTarget(TripleStr, ErrMsg); - if (!march) + if (!march) { + emitError(ErrMsg); return false; + } // Construct LTOModule, hand over ownership of module and target. Use MAttr as // the default set of features. @@ -459,9 +457,8 @@ void LTOCodeGenerator::applyScopeRestrictions() { /// Optimize merged modules using various IPO passes bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline, bool DisableGVNLoadPRE, - bool DisableVectorization, - std::string &ErrMsg) { - if (!this->determineTarget(ErrMsg)) + bool DisableVectorization) { + if (!this->determineTarget()) return false; // Mark which symbols can not be internalized @@ -496,9 +493,8 @@ bool LTOCodeGenerator::optimize(bool DisableVerify, bool DisableInline, return true; } -bool LTOCodeGenerator::compileOptimized(ArrayRef Out, - std::string &ErrMsg) { - if (!this->determineTarget(ErrMsg)) +bool LTOCodeGenerator::compileOptimized(ArrayRef Out) { + if (!this->determineTarget()) return false; legacy::PassManager preCodeGenPasses; @@ -515,7 +511,7 @@ bool LTOCodeGenerator::compileOptimized(ArrayRef Out, // MergedModule. MergedModule = splitCodeGen(std::move(MergedModule), Out, MCpu, FeatureStr, Options, - RelocModel, CodeModel::Default, CGOptLevel); + RelocModel, CodeModel::Default, CGOptLevel, FileType); return true; } @@ -586,3 +582,20 @@ LTOCodeGenerator::setDiagnosticHandler(lto_diagnostic_handler_t DiagHandler, Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this, /* RespectFilters */ true); } + +namespace { +class LTODiagnosticInfo : public DiagnosticInfo { + const Twine &Msg; +public: + LTODiagnosticInfo(const Twine &DiagMsg, DiagnosticSeverity Severity=DS_Error) + : DiagnosticInfo(DK_Linker, Severity), Msg(DiagMsg) {} + void print(DiagnosticPrinter &DP) const override { DP << Msg; } +}; +} + +void LTOCodeGenerator::emitError(const std::string &ErrMsg) { + if (DiagHandler) + (*DiagHandler)(LTO_DS_ERROR, ErrMsg.c_str(), DiagContext); + else + Context.diagnose(LTODiagnosticInfo(ErrMsg)); +}