X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FLTO%2FLTOCodeGenerator.cpp;h=c663d43fe7fdec56979651a2bde5f3052427c54a;hb=93e03df3cf2cc71a1e2550857da84a1c38dc9e82;hp=fe179cf1ac6e4a3eab0eb29eda6f3564412c00e3;hpb=9f85dccfc64b5f0b0c63ddfa0a42d8615aa1fcb3;p=oota-llvm.git diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index fe179cf1ac6..c663d43fe7f 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -64,18 +64,30 @@ const char* LTOCodeGenerator::getVersionString() { } LTOCodeGenerator::LTOCodeGenerator() - : Context(getGlobalContext()), IRLinker(new Module("ld-temp.o", Context)), - TargetMach(nullptr), EmitDwarfDebugInfo(false), - ScopeRestrictionsDone(false), CodeModel(LTO_CODEGEN_PIC_MODEL_DEFAULT), - NativeObjectFile(nullptr), DiagHandler(nullptr), DiagContext(nullptr) { + : Context(getGlobalContext()), IRLinker(new Module("ld-temp.o", Context)) { + initialize(); +} + +LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr Context) + : OwnedContext(std::move(Context)), Context(*OwnedContext), + IRLinker(new Module("ld-temp.o", *OwnedContext)) { + initialize(); +} + +void LTOCodeGenerator::initialize() { + TargetMach = nullptr; + EmitDwarfDebugInfo = false; + ScopeRestrictionsDone = false; + CodeModel = LTO_CODEGEN_PIC_MODEL_DEFAULT; + DiagHandler = nullptr; + DiagContext = nullptr; + initializeLTOPasses(); } LTOCodeGenerator::~LTOCodeGenerator() { delete TargetMach; - delete NativeObjectFile; TargetMach = nullptr; - NativeObjectFile = nullptr; IRLinker.deleteModule(); @@ -115,8 +127,11 @@ void LTOCodeGenerator::initializeLTOPasses() { initializeCFGSimplifyPassPass(R); } -bool LTOCodeGenerator::addModule(LTOModule* mod, std::string& errMsg) { - bool ret = IRLinker.linkInModule(&mod->getModule(), &errMsg); +bool LTOCodeGenerator::addModule(LTOModule *mod) { + assert(&mod->getModule().getContext() == &Context && + "Expected module in same context"); + + bool ret = IRLinker.linkInModule(&mod->getModule()); const std::vector &undefs = mod->getAsmUndefinedRefs(); for (int i = 0, e = undefs.size(); i != e; ++i) @@ -163,9 +178,9 @@ bool LTOCodeGenerator::writeMergedModules(const char *path, applyScopeRestrictions(); // create output file - std::string ErrInfo; - tool_output_file Out(path, ErrInfo, sys::fs::F_None); - if (!ErrInfo.empty()) { + std::error_code EC; + tool_output_file Out(path, EC, sys::fs::F_None); + if (EC) { errMsg = "could not open bitcode file for writing: "; errMsg += path; return false; @@ -190,6 +205,7 @@ bool LTOCodeGenerator::compile_to_file(const char** name, bool disableOpt, bool disableInline, bool disableGVNLoadPRE, + bool disableVectorization, std::string& errMsg) { // make unique temp .o file to put generated object file SmallString<128> Filename; @@ -204,8 +220,9 @@ bool LTOCodeGenerator::compile_to_file(const char** name, // generate object file tool_output_file objFile(Filename.c_str(), FD); - bool genResult = generateObjectFile(objFile.os(), disableOpt, disableInline, - disableGVNLoadPRE, errMsg); + bool genResult = + generateObjectFile(objFile.os(), disableOpt, disableInline, + disableGVNLoadPRE, disableVectorization, errMsg); objFile.os().close(); if (objFile.os().has_error()) { objFile.os().clear_error(); @@ -228,15 +245,13 @@ const void* LTOCodeGenerator::compile(size_t* length, bool disableOpt, bool disableInline, bool disableGVNLoadPRE, + bool disableVectorization, std::string& errMsg) { const char *name; if (!compile_to_file(&name, disableOpt, disableInline, disableGVNLoadPRE, - errMsg)) + disableVectorization, errMsg)) return nullptr; - // remove old buffer if compile() called twice - delete NativeObjectFile; - // read .o file into memory buffer ErrorOr> BufferOrErr = MemoryBuffer::getFile(name, -1, false); @@ -245,7 +260,7 @@ const void* LTOCodeGenerator::compile(size_t* length, sys::fs::remove(NativeObjectPath); return nullptr; } - NativeObjectFile = BufferOrErr.get().release(); + NativeObjectFile = std::move(*BufferOrErr); // remove temp files sys::fs::remove(NativeObjectPath); @@ -312,9 +327,9 @@ bool LTOCodeGenerator::determineTarget(std::string &errMsg) { void LTOCodeGenerator:: applyRestriction(GlobalValue &GV, - const ArrayRef &Libcalls, + ArrayRef Libcalls, std::vector &MustPreserveList, - SmallPtrSet &AsmUsed, + SmallPtrSetImpl &AsmUsed, Mangler &Mangler) { // There are no restrictions to apply to declarations. if (GV.isDeclaration()) @@ -343,7 +358,7 @@ applyRestriction(GlobalValue &GV, } static void findUsedValues(GlobalVariable *LLVMUsed, - SmallPtrSet &UsedValues) { + SmallPtrSetImpl &UsedValues) { if (!LLVMUsed) return; ConstantArray *Inits = cast(LLVMUsed->getInitializer()); @@ -446,6 +461,7 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out, bool DisableOpt, bool DisableInline, bool DisableGVNLoadPRE, + bool DisableVectorization, std::string &errMsg) { if (!this->determineTarget(errMsg)) return false; @@ -458,35 +474,27 @@ bool LTOCodeGenerator::generateObjectFile(raw_ostream &out, // Instantiate the pass manager to organize the passes. PassManager passes; - // Start off with a verification pass. - passes.add(createVerifierPass()); - passes.add(createDebugInfoVerifierPass()); - // Add an appropriate DataLayout instance for this module... mergedModule->setDataLayout(TargetMach->getSubtargetImpl()->getDataLayout()); - passes.add(new DataLayoutPass(mergedModule)); - - // Add appropriate TargetLibraryInfo for this module. - passes.add(new TargetLibraryInfo(Triple(TargetMach->getTargetTriple()))); - TargetMach->addAnalysisPasses(passes); - - // Enabling internalize here would use its AllButMain variant. It - // keeps only main if it exists and does nothing for libraries. Instead - // we create the pass ourselves with the symbol list provided by the linker. - if (!DisableOpt) - PassManagerBuilder().populateLTOPassManager(passes, - /*Internalize=*/false, - !DisableInline, - DisableGVNLoadPRE); - - // Make sure everything is still good. - passes.add(createVerifierPass()); - passes.add(createDebugInfoVerifierPass()); + Triple TargetTriple(TargetMach->getTargetTriple()); + PassManagerBuilder PMB; + PMB.DisableGVNLoadPRE = DisableGVNLoadPRE; + PMB.LoopVectorize = !DisableVectorization; + PMB.SLPVectorize = !DisableVectorization; + if (!DisableInline) + PMB.Inliner = createFunctionInliningPass(); + PMB.LibraryInfo = new TargetLibraryInfo(TargetTriple); + if (DisableOpt) + PMB.OptLevel = 0; + PMB.VerifyInput = true; + PMB.VerifyOutput = true; + + PMB.populateLTOPassManager(passes, TargetMach); PassManager codeGenPasses; - codeGenPasses.add(new DataLayoutPass(mergedModule)); + codeGenPasses.add(new DataLayoutPass()); formatted_raw_ostream Out(out); @@ -573,5 +581,6 @@ LTOCodeGenerator::setDiagnosticHandler(lto_diagnostic_handler_t DiagHandler, return Context.setDiagnosticHandler(nullptr, nullptr); // Register the LTOCodeGenerator stub in the LLVMContext to forward the // diagnostic to the external DiagHandler. - Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this); + Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this, + /* RespectFilters */ true); }