2015-02-08 6 views
1

Я следую примеру here. Мой полный кодSegfault при дешифровании итератора

#include "llvm/IR/Function.h" 
#include "llvm/Pass.h" 
#include "llvm/IR/InstIterator.h" 
using namespace llvm; 

namespace { 
    struct Hello2 : public FunctionPass { 
    static char ID; // Pass identification, replacement for typeid 
    Hello2() : FunctionPass(ID) {} 

    bool runOnFunction(Function &F) override { 
     inst_iterator iter = inst_begin(F); // causes a segfault  
     return false; 
    } 
    }; 
} 

char Hello2::ID = 0; 
static RegisterPass<Hello2> Y("hello2", "Hello World Pass"); 

после "HelloWorld" PASS пример объяснил here. Когда я точно следил за примером, он работал нормально, но с измененным паровым кодом выше я получаю segfault, когда я запускаю opt. (я использую один и тот же файл «hello.c» для ввода, как и в «HelloWorld» передать пример, компиляции с лязгом, работает make и называя мою библиотеку opt так же, как в примере.)

Что вызывая мой segfault, и есть ли способ проверить его/избежать?

EDIT

Я проследил Segfault к линии 61 из InstIterator.h: BI = BB->begin();. Когда мой код достигает этой точки, BBs не является NULL, но BB=BBs->begin() NULL. Таким образом, разыменование BB приводит к segfault. Вопрос почемуBB NULL (и почему конструктор этого не проверяет) остается.

+0

Можете ли вы предоставить ИК вы работаете в этот проход? И какую версию LLVM вы используете? –

+0

LLVM 3.5.1, используя файл 'hello.bc', созданный clang 3.5.0, следуя указаниям в ссылке для прохода' HelloWord'. – crockeea

ответ

0

Эта проблема была решена, когда моя система выполнила автоматическое обновление и получила новую версию нескольких пакетов llvm-3.5 (сегодня). Ранее opt --version вернулся

LLVM version 3.5 

Optimized build. 
Built Mar 23 2014 (21:41:30). 
Default target: x86_64-pc-linux-gnu 
Host CPU: corei7 

теперь возвращает

LLVM version 3.5.0 

Optimized build. 
Built Jan 27 2015 (00:14:48). 
Default target: x86_64-pc-linux-gnu 
Host CPU: corei7 
Смежные вопросы