-
Notifications
You must be signed in to change notification settings - Fork 57
/
Copy pathmain.cpp
76 lines (64 loc) · 1.83 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <iostream>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Module.h>
#include <llvm/IR/Verifier.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/Passes/PassBuilder.h>
#include <llvm/Support/raw_ostream.h>
#include "ConstantFolding.hpp"
#include "Mem2Reg.hpp"
#include "StaticCallCounter.hpp"
#include "StaticCallCounterPrinter.hpp"
void
opt(llvm::Module& mod)
{
using namespace llvm;
// 定义分析pass的管理器
LoopAnalysisManager lam;
FunctionAnalysisManager fam;
CGSCCAnalysisManager cgam;
ModuleAnalysisManager mam;
ModulePassManager mpm;
// 注册分析pass的管理器
PassBuilder pb;
pb.registerModuleAnalyses(mam);
pb.registerCGSCCAnalyses(cgam);
pb.registerFunctionAnalyses(fam);
pb.registerLoopAnalyses(lam);
pb.crossRegisterProxies(lam, fam, cgam, mam);
// 添加分析pass到管理器中
mam.registerPass([]() { return StaticCallCounter(); });
// 添加优化pass到管理器中
mpm.addPass(StaticCallCounterPrinter(llvm::errs()));
mpm.addPass(Mem2Reg());
mpm.addPass(ConstantFolding(llvm::errs()));
// 运行优化pass
mpm.run(mod, mam);
}
int
main(int argc, char** argv)
{
if (argc != 3) {
std::cout << "Usage: " << argv[0] << " <input> <output>\n";
return -1;
}
llvm::LLVMContext ctx;
llvm::SMDiagnostic err;
auto mod = llvm::parseIRFile(argv[1], err, ctx);
if (!mod) {
std::cout << "Error: unable to parse input file: " << argv[1] << '\n';
err.print(argv[0], llvm::errs());
return -2;
}
std::error_code ec;
llvm::StringRef outPath(argv[2]);
llvm::raw_fd_ostream outFile(outPath, ec);
if (ec) {
std::cout << "Error: unable to open output file: " << argv[2] << '\n';
return -3;
}
opt(*mod); // IR的优化发生在这里
mod->print(outFile, nullptr, false, true);
if (llvm::verifyModule(*mod, &llvm::outs()))
return 3;
}