1

I have a very basic pass that need to print how many BasicBlocks are there in a Function.

#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);

I run the pass using opt. And get this error:

> 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

I narrowed down to the issue and it happens when I increment the iterator. But I dont know why.

Here is the test file I am running my pass on:

#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();
}
3
  • I can't reproduce the problem. I'm using 3.7, and it's working fine. Commented Dec 11, 2015 at 13:06
  • Im using 3.6. and c++11 Commented Dec 14, 2015 at 9:17
  • And my clang version is 3.4.2 Commented Dec 14, 2015 at 9:28

1 Answer 1

1

The problem was that I was using llvm 3.6 while compiling the pass and the bitcode file I was generating was from clang version 3.4.

I just changed the Clang version to 3.6 and its now clompletely working fine.

Thank you

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.