|
1 | 1 | // SPDX-License-Identifier: Apache-2.0 |
2 | 2 |
|
3 | 3 | #include <llvm/Support/TargetSelect.h> |
| 4 | +#include <llvm/TargetParser/Host.h> |
| 5 | +#include <llvm/MC/TargetRegistry.h> |
4 | 6 | #include <llvm/Passes/PassBuilder.h> |
5 | 7 | #include <llvm/IR/Verifier.h> |
6 | 8 |
|
@@ -70,20 +72,7 @@ void LLVMCompilerContext::initJit() |
70 | 72 | #endif |
71 | 73 |
|
72 | 74 | // Optimize |
73 | | - llvm::PassBuilder passBuilder; |
74 | | - llvm::LoopAnalysisManager loopAnalysisManager; |
75 | | - llvm::FunctionAnalysisManager functionAnalysisManager; |
76 | | - llvm::CGSCCAnalysisManager cGSCCAnalysisManager; |
77 | | - llvm::ModuleAnalysisManager moduleAnalysisManager; |
78 | | - |
79 | | - passBuilder.registerModuleAnalyses(moduleAnalysisManager); |
80 | | - passBuilder.registerCGSCCAnalyses(cGSCCAnalysisManager); |
81 | | - passBuilder.registerFunctionAnalyses(functionAnalysisManager); |
82 | | - passBuilder.registerLoopAnalyses(loopAnalysisManager); |
83 | | - passBuilder.crossRegisterProxies(loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager, moduleAnalysisManager); |
84 | | - |
85 | | - llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::OptimizationLevel::O3); |
86 | | - modulePassManager.run(*m_module, moduleAnalysisManager); |
| 75 | + optimize(llvm::OptimizationLevel::O3); |
87 | 76 |
|
88 | 77 | const auto &functions = m_module->getFunctionList(); |
89 | 78 | std::vector<std::string> lookupNames; |
@@ -151,6 +140,71 @@ void LLVMCompilerContext::initTarget() |
151 | 140 | llvm::InitializeNativeTarget(); |
152 | 141 | llvm::InitializeNativeTargetAsmPrinter(); |
153 | 142 | llvm::InitializeNativeTargetAsmParser(); |
| 143 | + |
| 144 | + createTargetMachine(); |
| 145 | + |
| 146 | + m_module->setDataLayout(m_targetMachine->createDataLayout()); |
| 147 | +} |
| 148 | + |
| 149 | +void LLVMCompilerContext::createTargetMachine() |
| 150 | +{ |
| 151 | + std::string error; |
| 152 | + std::string targetTriple = llvm::sys::getDefaultTargetTriple(); |
| 153 | + m_module->setTargetTriple(targetTriple); |
| 154 | + |
| 155 | + const llvm::Target *target = llvm::TargetRegistry::lookupTarget(targetTriple, error); |
| 156 | + |
| 157 | + if (!target) { |
| 158 | + llvm::errs() << error; |
| 159 | + return; |
| 160 | + } |
| 161 | + |
| 162 | + llvm::TargetOptions opt; |
| 163 | + const char *cpu = "generic"; |
| 164 | + const char *features = ""; |
| 165 | + |
| 166 | + m_targetMachine = std::unique_ptr<llvm::TargetMachine>(target->createTargetMachine(targetTriple, cpu, features, opt, llvm::Reloc::PIC_)); |
| 167 | +} |
| 168 | + |
| 169 | +void LLVMCompilerContext::optimize(llvm::OptimizationLevel optLevel) |
| 170 | +{ |
| 171 | + llvm::PassBuilder passBuilder(m_targetMachine.get()); |
| 172 | + llvm::LoopAnalysisManager loopAnalysisManager; |
| 173 | + llvm::FunctionAnalysisManager functionAnalysisManager; |
| 174 | + llvm::CGSCCAnalysisManager cGSCCAnalysisManager; |
| 175 | + llvm::ModuleAnalysisManager moduleAnalysisManager; |
| 176 | + |
| 177 | + passBuilder.registerModuleAnalyses(moduleAnalysisManager); |
| 178 | + passBuilder.registerCGSCCAnalyses(cGSCCAnalysisManager); |
| 179 | + passBuilder.registerFunctionAnalyses(functionAnalysisManager); |
| 180 | + passBuilder.registerLoopAnalyses(loopAnalysisManager); |
| 181 | + passBuilder.crossRegisterProxies(loopAnalysisManager, functionAnalysisManager, cGSCCAnalysisManager, moduleAnalysisManager); |
| 182 | + |
| 183 | + llvm::ModulePassManager modulePassManager = passBuilder.buildPerModuleDefaultPipeline(llvm::OptimizationLevel::O3); |
| 184 | + |
| 185 | + std::string pipeline; |
| 186 | + |
| 187 | + if (optLevel == llvm::OptimizationLevel::O0) |
| 188 | + pipeline = "default<O0>"; |
| 189 | + else if (optLevel == llvm::OptimizationLevel::O1) |
| 190 | + pipeline = "default<O1>"; |
| 191 | + else if (optLevel == llvm::OptimizationLevel::O2) |
| 192 | + pipeline = "default<O2>"; |
| 193 | + else if (optLevel == llvm::OptimizationLevel::O3) |
| 194 | + pipeline = "default<O3>"; |
| 195 | + else if (optLevel == llvm::OptimizationLevel::Os) |
| 196 | + pipeline = "default<Os>"; |
| 197 | + else if (optLevel == llvm::OptimizationLevel::Oz) |
| 198 | + pipeline = "default<Oz>"; |
| 199 | + else |
| 200 | + assert(false); |
| 201 | + |
| 202 | + if (passBuilder.parsePassPipeline(modulePassManager, pipeline)) { |
| 203 | + llvm::errs() << "Failed to parse pipeline\n"; |
| 204 | + return; |
| 205 | + } |
| 206 | + |
| 207 | + modulePassManager.run(*m_module, moduleAnalysisManager); |
154 | 208 | } |
155 | 209 |
|
156 | 210 | llvm::Function *LLVMCompilerContext::createCoroResumeFunction() |
|
0 commit comments