我一直在使用
opt -stats -analyze -instcount file.bc
Run Code Online (Sandbox Code Playgroud)
获取代码的统计信息。现在我想获取特定名称(例如“bar”)的函数中 LLVM 指令的数量。
理想情况下,我希望有一个选项opt,它会以这种方式工作
opt -stats -analyze -instcount funcname="bar"
Run Code Online (Sandbox Code Playgroud)
什么是正确的选择?我用谷歌搜索了很多,但还没有得到答案。
创建函数分析通道。(llvm::FunctionPass 文档)
你的代码看起来像这样:
// This is a contrived example.
#include <iterator>
#include <string>
#include "llvm/Pass.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instruction.h"
#include "llvm/Support/raw_ostream.h"
namespace
{
using namespace llvm;
cl::opt<std::string> functionName("funcname", cl::ValueRequired,
cl::desc("Function name"), cl::NotHidden);
class FunctionInstCounter : public FunctionPass
{
public:
static char ID;
FunctionInstCounter()
: FunctionPass(ID)
{
initializeFunctionInstCounterPass(*PassRegistry::getPassRegistry());
}
bool runOnFunction(Function& func) override
{
if (func.getName() != functionName)
{
return false;
}
unsigned int instCount = 0;
for (BasicBlock& bb : func)
{
instCount += std::distance(bb.begin(), bb.end());
}
llvm::outs() << "Number of instructions in " << func.getName() << ": "
<< instCount << "\n";
return false;
}
};
} // namespace
char FunctionInstCounter::ID = 0;
INITIALIZE_PASS(FunctionInstCounter, "funcinstcount",
"Function instruction counter", false, true)
llvm::Pass* llvm::createFunctionInstCounterPass()
{
return new FunctionInstCounter();
}
Run Code Online (Sandbox Code Playgroud)
你可以这样称呼它:
opt -funcinstcount -funcname=NameOfFunctionHere
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4334 次 |
| 最近记录: |