计算函数中 LLVM 指令的数量

zel*_*ell 3 llvm

我一直在使用

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)

什么是正确的选择?我用谷歌搜索了很多,但还没有得到答案。

jvs*_*ech 6

创建函数分析通道。(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)