53 Triple TT(M.getTargetTriple());
54 auto CGOptLevel = CodeGenOpt::getLevel(OptLevel);
55 if (CGOptLevel == std::nullopt)
59 const Target *T = TargetRegistry::lookupTarget(M.getTargetTriple(), Msg);
61 return make_error<StringError>(Msg, inconvertibleErrorCode());
63 SubtargetFeatures Features;
64 Features.getDefaultSubtargetFeatures(TT);
66 std::optional<Reloc::Model> RelocModel;
67 if (M.getModuleFlag(
"PIC Level"))
69 M.getPICLevel() == PICLevel::NotPIC ? Reloc::Static : Reloc::PIC_;
71 std::optional<CodeModel::Model> CodeModel = M.getCodeModel();
76 TargetOptions Options;
77 std::unique_ptr<TargetMachine> TM(T->createTargetMachine(
78 M.getTargetTriple(), Arch, Features.getString(), Options, RelocModel,
79 CodeModel, CGOptLevel.value()));
81 return make_error<StringError>(
"Failed to create target machine",
82 inconvertibleErrorCode());
88 unsigned CodegenOptLevel = 3) {
89 PipelineTuningOptions PTO;
91 std::optional<PGOOptions> PGOOpt;
93 if (
auto Err = TM.takeError())
94 report_fatal_error(std::move(Err));
95 TargetLibraryInfoImpl TLII(Triple(M.getTargetTriple()));
97 PassBuilder PB(TM->get(), PTO, PGOOpt,
nullptr);
98 LoopAnalysisManager LAM;
99 FunctionAnalysisManager FAM;
100 CGSCCAnalysisManager CGAM;
101 ModuleAnalysisManager MAM;
103 FAM.registerPass([&] {
return TargetLibraryAnalysis(TLII); });
105 PB.registerModuleAnalyses(MAM);
106 PB.registerCGSCCAnalyses(CGAM);
107 PB.registerFunctionAnalyses(FAM);
108 PB.registerLoopAnalyses(LAM);
109 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
111 OptimizationLevel OptSetting;
114 OptSetting = OptimizationLevel::O0;
117 OptSetting = OptimizationLevel::O1;
120 OptSetting = OptimizationLevel::O2;
123 OptSetting = OptimizationLevel::O3;
126 OptSetting = OptimizationLevel::Os;
129 OptSetting = OptimizationLevel::Oz;
135 ModulePassManager Passes = PB.buildPerModuleDefaultPipeline(OptSetting);