LLVM 选择找不到函数传递

LLVM opt cannot find function pass

本文关键字:函数 找不到 选择 LLVM      更新时间:2023-10-16

给定以下函数传递定义和注册:

// STL 
#include <map>
#include <vector>
#include <utility>
// LLVM 
#include <llvm/Pass.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/IR/Function.h>
#include <llvm/IR/Instruction.h>
#include <llvm/IR/Instructions.h>
#include <llvm/IR/CFG.h>
#include <llvm/Support/raw_ostream.h>
#include <llvm/IR/InstIterator.h>
#include <llvm/IR/Constants.h>
// For older versions of llvm you may have to include instead:
// #include "llvm/Support/CFG.h"
// #include <llvm/Support/InstIterator.h>
using namespace llvm;
namespace {
class DefinitionPass  : public FunctionPass {
public:
static char ID;
DefinitionPass() : FunctionPass(ID) {}
virtual void getAnalysisUsage(AnalysisUsage &au) const {
au.setPreservesAll();
}
virtual bool runOnFunction(Function &F) {
// TODO
errs() << "def-passn";
return false;
}
};
class FixingPass : public FunctionPass {
public:
static char ID;
FixingPass() : FunctionPass(ID){}
virtual bool runOnFunction(Function &F){
// TODO
errs() << "fix-passn";
return true;
}
};
} // namespace

char DefinitionPass::ID = 0;
char FixingPass::ID = 1;
// Pass registrations
static RegisterPass<DefinitionPass> X("defpass", "Reaching definitions pass");
static RegisterPass<FixingPass> Y("fixpass", "Fixing initialization pass");

我根据以下制作文件编译它。编译成功:

CXXFLAGS = -rdynamic $(shell llvm-config --cxxflags) -g -O0 -std=c++0x
all: p34.so
%.so: %.o
$(CXX) $(CXXFLAGS) -dylib -shared -fPIC  $^ -o $@
clean:
rm -f *.o *~ *.so

然后,我使用以下方法为要分析的文件创建位码文件:

clang -O3 -emit-llvm test1.c -c -o test1.bc

并通过以下方式使用 opt:

opt -load p34.so -defpass < test1.bc > /dev/null

但是 opt 无法找到函数 pass "defpass":

opt: Unknown command line argument '-defpass'.  Try: 'opt --help'

我在OSX上并使用自制安装的LLVM版本。

安博迪是否知道为什么选择找不到通行证?

.so 文件适用于 Linux/Unix。在MAC上,您应该使用p34.dylib

引用"https://github.com/banach-space/llvm-tutor" "最后,使用 opt 运行 HelloWorld(在 Linux 上使用 libHelloWorld.so,在 Mac OS 上运行 libHelloWorld.dylib(:">