llvm
Tutorial2 introduction to LLVM Ⅱ
操作基本指令依靠 instruction class, basic block class or BasicBlockUtils class。
User-Use-Value
我们如何确保所有引用(i.e. uses)会被正确的更新?User-Use-Value relationship 用来解决这个问题。
LLVM 有一个很重要的基类:Value。几乎所有的 object types 都是继承于此。
Assignment1
FunctionInfoPass 中的 run 函数的 todo 部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| PreservedAnalyses run(Module &M, ModuleAnalysisManager &) { outs() << "CSCD70 Function Information Pass" << "\n";
for (auto iter = M.begin(); iter != M.end(); ++iter) { Function &func = *iter; outs() << "Function name: " << func.getName() << "\n"; outs() << "Number of Arguments: " << func.arg_size() << "\n"; outs() << "Number of Calls: " << func.getNumUses() << "\n"; outs() << "Number OF BBs: " << func.size() << "\n"; int funcInstrSize = 0; for (BasicBlock &BB : func) { funcInstrSize += BB.size(); } outs() << "Number of Instructions: " << funcInstrSize << "\n\n"; }
return PreservedAnalyses::all(); }
|
1 2
| $ clang -O0 -emit-llvm -c ./test/Loop.c -o ./test/Loop.bc $ opt -load-pass-plugin=./libFunctionInfo.so -passes=function-info ./test/Loop.bc -o ./test/LoopFunctionInfo.bc
|
参考文章
- 代码优化与LLVM IR pass | Kiprey’s Blog
- eternalsakura/sakura_llvm_opt: 15-745 note (github.com)
- About — LLVM 17.0.0git documentation
- UofT-EcoSystem/CSCD70: CSCD70 Compiler Optimization (github.com)