LLVM FunctionPass 迭代器有问题吗?
Issue with LLVM FunctionPass iterator?
我有一个非常基本的过程,需要打印一个函数中有多少个 BasicBlock。
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/Support/raw_ostream.h"
#include "iostream"
using namespace llvm;
namespace {
struct Mypass : public FunctionPass {
public:
static char ID; // Pass identification
Mypass() : FunctionPass(ID){}
bool runOnFunction(Function &F) override {
errs()<<"Function Name:";
errs()<<F.getName()<<"\n";
Function::iterator bb_i = F.begin();
int bb_count = 0;
for (Function::iterator I = F.begin(); I != F.end(); I++){
std::cout<< "Basic Block: BB"<<bb_count++<<std::endl;
}
return false;
}
};
}
char Mypass::ID = 0;
static RegisterPass<Mypass> X("Epass","Pass",true,false);
我运行 使用 opt 的传递。并得到这个错误:
> Function Name:testfnc1
> Basic Block: BB0 0 libLLVM-3.4.so 0x000000388b1935d2 llvm::sys::PrintStackTrace(_IO_FILE*) + 34 1 libLLVM-3.4.so
> 0x000000388b193dfa 2 libpthread.so.0 0x0000003feaa0f790 3
> EstimatePass.so 0x00007f04eb789737 4 libLLVM-3.4.so
> 0x000000388aad12b4 llvm::FPPassManager::runOnFunction(llvm::Function&)
> + 468 5 libLLVM-3.4.so 0x000000388aad139b llvm::FPPassManager::runOnModule(llvm::Module&) + 43 6 libLLVM-3.4.so
> 0x000000388aad0f1e llvm::legacy::PassManagerImpl::run(llvm::Module&) +
> 686 7 opt 0x000000000041f8d9 main + 5977 8 libc.so.6
> 0x0000003fea21ed5d __libc_start_main + 253 9 opt
> 0x000000000040ebf9 Stack dump:
> 0. Program arguments: opt -load /net/home/shaheen/llvm/mypass/EstimatePass.so -Epass -time-passes
> test.bc
> 1. Running pass 'Function Pass Manager' on module 'test.bc'.
> 2. Running pass 'Pass' on function '@testfnc1' Segmentation fault
我缩小了问题范围,它发生在我递增迭代器时。但是不知道为什么。
这是我正在 运行传递的测试文件:
#include "stdio.h"
void testfnc1(){
int i=1;int j=0;
for(i=1;i<10;i++)
for(j=1;j<10;j++)
printf("test");
};
int main()
{
int i;
printf("hello\n");
for(i=0;i<3;i++){
printf("hello:");
for(i=1;i<4;i++)
printf("asd");}
testfnc1();
}
问题是我在编译 pass 时使用的是 llvm 3.6,而我生成的位码文件来自 clang 3.4 版。
我刚刚将 Clang 版本更改为 3.6,现在可以正常运行了。
谢谢
我有一个非常基本的过程,需要打印一个函数中有多少个 BasicBlock。
#include "llvm/Pass.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/Support/raw_ostream.h"
#include "iostream"
using namespace llvm;
namespace {
struct Mypass : public FunctionPass {
public:
static char ID; // Pass identification
Mypass() : FunctionPass(ID){}
bool runOnFunction(Function &F) override {
errs()<<"Function Name:";
errs()<<F.getName()<<"\n";
Function::iterator bb_i = F.begin();
int bb_count = 0;
for (Function::iterator I = F.begin(); I != F.end(); I++){
std::cout<< "Basic Block: BB"<<bb_count++<<std::endl;
}
return false;
}
};
}
char Mypass::ID = 0;
static RegisterPass<Mypass> X("Epass","Pass",true,false);
我运行 使用 opt 的传递。并得到这个错误:
> Function Name:testfnc1
> Basic Block: BB0 0 libLLVM-3.4.so 0x000000388b1935d2 llvm::sys::PrintStackTrace(_IO_FILE*) + 34 1 libLLVM-3.4.so
> 0x000000388b193dfa 2 libpthread.so.0 0x0000003feaa0f790 3
> EstimatePass.so 0x00007f04eb789737 4 libLLVM-3.4.so
> 0x000000388aad12b4 llvm::FPPassManager::runOnFunction(llvm::Function&)
> + 468 5 libLLVM-3.4.so 0x000000388aad139b llvm::FPPassManager::runOnModule(llvm::Module&) + 43 6 libLLVM-3.4.so
> 0x000000388aad0f1e llvm::legacy::PassManagerImpl::run(llvm::Module&) +
> 686 7 opt 0x000000000041f8d9 main + 5977 8 libc.so.6
> 0x0000003fea21ed5d __libc_start_main + 253 9 opt
> 0x000000000040ebf9 Stack dump:
> 0. Program arguments: opt -load /net/home/shaheen/llvm/mypass/EstimatePass.so -Epass -time-passes
> test.bc
> 1. Running pass 'Function Pass Manager' on module 'test.bc'.
> 2. Running pass 'Pass' on function '@testfnc1' Segmentation fault
我缩小了问题范围,它发生在我递增迭代器时。但是不知道为什么。
这是我正在 运行传递的测试文件:
#include "stdio.h"
void testfnc1(){
int i=1;int j=0;
for(i=1;i<10;i++)
for(j=1;j<10;j++)
printf("test");
};
int main()
{
int i;
printf("hello\n");
for(i=0;i<3;i++){
printf("hello:");
for(i=1;i<4;i++)
printf("asd");}
testfnc1();
}
问题是我在编译 pass 时使用的是 llvm 3.6,而我生成的位码文件来自 clang 3.4 版。
我刚刚将 Clang 版本更改为 3.6,现在可以正常运行了。
谢谢