Я следую примеру 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 (и почему конструктор этого не проверяет) остается.
Можете ли вы предоставить ИК вы работаете в этот проход? И какую версию LLVM вы используете? –
LLVM 3.5.1, используя файл 'hello.bc', созданный clang 3.5.0, следуя указаниям в ссылке для прохода' HelloWord'. – crockeea