49 Triple TT(M.getTargetTriple());
50 auto CGOptLevel = CodeGenOpt::getLevel(OptLevel);
51 if (CGOptLevel == std::nullopt)
55 const Target *T = TargetRegistry::lookupTarget(M.getTargetTriple(), Msg);
57 return make_error<StringError>(Msg, inconvertibleErrorCode());
59 SubtargetFeatures Features;
60 Features.getDefaultSubtargetFeatures(TT);
62 std::optional<Reloc::Model> RelocModel;
63 if (M.getModuleFlag(
"PIC Level"))
65 M.getPICLevel() == PICLevel::NotPIC ? Reloc::Static : Reloc::PIC_;
67 std::optional<CodeModel::Model> CodeModel = M.getCodeModel();
72 TargetOptions Options;
73 std::unique_ptr<TargetMachine> TM(T->createTargetMachine(
74 M.getTargetTriple(), Arch, Features.getString(), Options, RelocModel,
75 CodeModel, CGOptLevel.value()));
77 return make_error<StringError>(
"Failed to create target machine",
78 inconvertibleErrorCode());
84 unsigned CodegenOptLevel = 3) {
85 PipelineTuningOptions PTO;
87 std::optional<PGOOptions> PGOOpt;
89 if (
auto Err = TM.takeError())
90 report_fatal_error(std::move(Err));
91 TargetLibraryInfoImpl TLII(Triple(M.getTargetTriple()));
93 PassBuilder PB(TM->get(), PTO, PGOOpt,
nullptr);
94 LoopAnalysisManager LAM;
95 FunctionAnalysisManager FAM;
96 CGSCCAnalysisManager CGAM;
97 ModuleAnalysisManager MAM;
99 FAM.registerPass([&] {
return TargetLibraryAnalysis(TLII); });
101 PB.registerModuleAnalyses(MAM);
102 PB.registerCGSCCAnalyses(CGAM);
103 PB.registerFunctionAnalyses(FAM);
104 PB.registerLoopAnalyses(LAM);
105 PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
107 OptimizationLevel OptSetting;
110 OptSetting = OptimizationLevel::O0;
113 OptSetting = OptimizationLevel::O1;
116 OptSetting = OptimizationLevel::O2;
119 OptSetting = OptimizationLevel::O3;
122 OptSetting = OptimizationLevel::Os;
125 OptSetting = OptimizationLevel::Oz;
131 ModulePassManager Passes = PB.buildPerModuleDefaultPipeline(OptSetting);