LLVM FunctionPass迭代器的问题?

时间:2015-12-10 12:50:16

标签: c++11 llvm llvm-clang llvm-gcc

我有一个非常基本的传递,需要打印函数中有多少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();
}

1 个答案:

答案 0 :(得分:1)

问题是我在编译传递时使用llvm 3.6而我生成的bitcode文件来自clang 3.4版。

我刚刚将Clang版本更改为3.6,现在它完全正常工作。

谢谢