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,现在可以正常运行了。

谢谢