diff --git a/llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h b/llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h index 8a7c49e7fd223..bafce6c964910 100644 --- a/llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h +++ b/llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h @@ -75,10 +75,6 @@ struct LTOCodeGenerator { LTOCodeGenerator(LLVMContext &Context); ~LTOCodeGenerator(); - /// Return a lto::Config object which contains the options set in - /// LTOCodeGenerator. - lto::Config toConfig() const; - /// Merge given module. Return true on success. /// /// Resets \a HasVerifiedInput. @@ -92,14 +88,16 @@ struct LTOCodeGenerator { void setAsmUndefinedRefs(struct LTOModule *); void setTargetOptions(const TargetOptions &Options); void setDebugInfo(lto_debug_model); - void setCodePICModel(Optional Model) { RelocModel = Model; } + void setCodePICModel(Optional Model) { + Config.RelocModel = Model; + } /// Set the file type to be emitted (assembly or object code). /// The default is CGFT_ObjectFile. - void setFileType(CodeGenFileType FT) { FileType = FT; } + void setFileType(CodeGenFileType FT) { Config.CGFileType = FT; } - void setCpu(StringRef MCpu) { this->MCpu = std::string(MCpu); } - void setAttrs(std::vector MAttrs) { this->MAttrs = MAttrs; } + void setCpu(StringRef MCpu) { Config.CPU = std::string(MCpu); } + void setAttrs(std::vector MAttrs) { Config.MAttrs = MAttrs; } void setOptLevel(unsigned OptLevel); void setShouldInternalize(bool Value) { ShouldInternalize = Value; } @@ -182,11 +180,11 @@ struct LTOCodeGenerator { /// Enable the Freestanding mode: indicate that the optimizer should not /// assume builtins are present on the target. - void setFreestanding(bool Enabled) { Freestanding = Enabled; } + void setFreestanding(bool Enabled) { Config.Freestanding = Enabled; } - void setDisableVerify(bool Value) { DisableVerify = Value; } + void setDisableVerify(bool Value) { Config.DisableVerify = Value; } - void setUseNewPM(bool Value) { UseNewPM = Value; } + void setUseNewPM(bool Value) { Config.UseNewPM = Value; } void setDiagnosticHandler(lto_diagnostic_handler_t, void *); @@ -224,31 +222,23 @@ struct LTOCodeGenerator { bool EmitDwarfDebugInfo = false; bool ScopeRestrictionsDone = false; bool HasVerifiedInput = false; - Optional RelocModel; StringSet<> MustPreserveSymbols; StringSet<> AsmUndefinedRefs; StringMap ExternalSymbols; std::vector CodegenOptions; std::string FeatureStr; - std::string MCpu; - std::vector MAttrs; std::string NativeObjectPath; - TargetOptions Options; - CodeGenOpt::Level CGOptLevel = CodeGenOpt::Default; const Target *MArch = nullptr; std::string TripleStr; - unsigned OptLevel = 2; lto_diagnostic_handler_t DiagHandler = nullptr; void *DiagContext = nullptr; bool ShouldInternalize = EnableLTOInternalization; bool ShouldEmbedUselists = false; bool ShouldRestoreGlobalsLinkage = false; - CodeGenFileType FileType = CGFT_ObjectFile; std::unique_ptr DiagnosticOutputFile; - bool Freestanding = false; std::unique_ptr StatsFile = nullptr; - bool DisableVerify = false; - bool UseNewPM = LLVM_ENABLE_NEW_PASS_MANAGER; + + lto::Config Config; }; } #endif diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index 86c0906caa364..55f2bf39d957e 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -124,32 +124,16 @@ LTOCodeGenerator::LTOCodeGenerator(LLVMContext &Context) TheLinker(new Linker(*MergedModule)) { Context.setDiscardValueNames(LTODiscardValueNames); Context.enableDebugTypeODRUniquing(); -} - -LTOCodeGenerator::~LTOCodeGenerator() {} -lto::Config LTOCodeGenerator::toConfig() const { - lto::Config Conf; - Conf.CGFileType = FileType; - Conf.CPU = MCpu; - Conf.MAttrs = MAttrs; - Conf.RelocModel = RelocModel; - Conf.Options = Options; - Conf.CodeModel = None; - Conf.StatsFile = LTOStatsFile; - Conf.OptLevel = OptLevel; - Conf.Freestanding = Freestanding; - Conf.PTO.LoopVectorization = OptLevel > 1; - Conf.PTO.SLPVectorization = OptLevel > 1; - Conf.DisableVerify = DisableVerify; - Conf.PreCodeGenPassesHook = [](legacy::PassManager &PM) { + Config.CodeModel = None; + Config.StatsFile = LTOStatsFile; + Config.PreCodeGenPassesHook = [](legacy::PassManager &PM) { PM.add(createObjCARCContractPass()); }; - Conf.UseNewPM = UseNewPM; - - return Conf; } +LTOCodeGenerator::~LTOCodeGenerator() {} + void LTOCodeGenerator::setAsmUndefinedRefs(LTOModule *Mod) { const std::vector &undefs = Mod->getAsmUndefinedRefs(); for (int i = 0, e = undefs.size(); i != e; ++i) @@ -184,7 +168,7 @@ void LTOCodeGenerator::setModule(std::unique_ptr Mod) { } void LTOCodeGenerator::setTargetOptions(const TargetOptions &Options) { - this->Options = Options; + Config.Options = Options; } void LTOCodeGenerator::setDebugInfo(lto_debug_model Debug) { @@ -201,19 +185,21 @@ void LTOCodeGenerator::setDebugInfo(lto_debug_model Debug) { } void LTOCodeGenerator::setOptLevel(unsigned Level) { - OptLevel = Level; - switch (OptLevel) { + Config.OptLevel = Level; + Config.PTO.LoopVectorization = Config.OptLevel > 1; + Config.PTO.SLPVectorization = Config.OptLevel > 1; + switch (Config.OptLevel) { case 0: - CGOptLevel = CodeGenOpt::None; + Config.CGOptLevel = CodeGenOpt::None; return; case 1: - CGOptLevel = CodeGenOpt::Less; + Config.CGOptLevel = CodeGenOpt::Less; return; case 2: - CGOptLevel = CodeGenOpt::Default; + Config.CGOptLevel = CodeGenOpt::Default; return; case 3: - CGOptLevel = CodeGenOpt::Aggressive; + Config.CGOptLevel = CodeGenOpt::Aggressive; return; } llvm_unreachable("Unknown optimization level!"); @@ -261,7 +247,7 @@ bool LTOCodeGenerator::compileOptimizedToFile(const char **Name) { auto AddStream = [&](size_t Task) -> std::unique_ptr { - StringRef Extension(FileType == CGFT_AssemblyFile ? "s" : "o"); + StringRef Extension(Config.CGFileType == CGFT_AssemblyFile ? "s" : "o"); int FD; std::error_code EC = @@ -348,20 +334,20 @@ bool LTOCodeGenerator::determineTarget() { // Construct LTOModule, hand over ownership of module and target. Use MAttr as // the default set of features. - SubtargetFeatures Features(join(MAttrs, "")); + SubtargetFeatures Features(join(Config.MAttrs, "")); Features.getDefaultSubtargetFeatures(Triple); FeatureStr = Features.getString(); // Set a default CPU for Darwin triples. - if (MCpu.empty() && Triple.isOSDarwin()) { + if (Config.CPU.empty() && Triple.isOSDarwin()) { if (Triple.getArch() == llvm::Triple::x86_64) - MCpu = "core2"; + Config.CPU = "core2"; else if (Triple.getArch() == llvm::Triple::x86) - MCpu = "yonah"; + Config.CPU = "yonah"; else if (Triple.isArm64e()) - MCpu = "apple-a12"; + Config.CPU = "apple-a12"; else if (Triple.getArch() == llvm::Triple::aarch64 || Triple.getArch() == llvm::Triple::aarch64_32) - MCpu = "cyclone"; + Config.CPU = "cyclone"; } TargetMach = createTargetMachine(); @@ -373,7 +359,8 @@ bool LTOCodeGenerator::determineTarget() { std::unique_ptr LTOCodeGenerator::createTargetMachine() { assert(MArch && "MArch is not set!"); return std::unique_ptr(MArch->createTargetMachine( - TripleStr, MCpu, FeatureStr, Options, RelocModel, None, CGOptLevel)); + TripleStr, Config.CPU, FeatureStr, Config.Options, Config.RelocModel, + None, Config.CGOptLevel)); } // If a linkonce global is present in the MustPreserveSymbols, we need to make @@ -558,11 +545,10 @@ bool LTOCodeGenerator::optimize() { // Add an appropriate DataLayout instance for this module... MergedModule->setDataLayout(TargetMach->createDataLayout()); - lto::Config Conf = toConfig(); ModuleSummaryIndex CombinedIndex(false); TargetMach = createTargetMachine(); - if (!opt(Conf, TargetMach.get(), 0, *MergedModule, /*IsThinLTO=*/false, + if (!opt(Config, TargetMach.get(), 0, *MergedModule, /*IsThinLTO=*/false, /*ExportSummary=*/&CombinedIndex, /*ImportSummary=*/nullptr, /*CmdArgs*/ std::vector())) { emitError("LTO middle-end optimizations failed"); @@ -585,11 +571,10 @@ bool LTOCodeGenerator::compileOptimized(lto::AddStreamFn AddStream, // for splitting restoreLinkageForExternals(); - lto::Config Conf = toConfig(); ModuleSummaryIndex CombinedIndex(false); - Error Err = - backend(Conf, AddStream, ParallelismLevel, *MergedModule, CombinedIndex); + Error Err = backend(Config, AddStream, ParallelismLevel, *MergedModule, + CombinedIndex); assert(!Err && "unexpected code-generation failure"); (void)Err;