У меня возникает следующая проблема при запуске моей программы:
pseudo instructions should be removed before code emission
UNREACHABLE executed at /home/leonor/llvm/llvm/lib/Target/X86/X86CodeEmitter.cpp:1164!
Stack dump:
0. Running pass 'X86 Machine Code Emitter' on function '@main'
./build/Release+Asserts/bin/llvm-dis: Bitcode stream must be at least 16 bytes in length
Моя программа принимает в качестве входных данных файл .bc, а затем загружает файл и показывает его. Я сомневаюсь: почему эта ошибка возникает только тогда, когда программа C содержит условные операторы (if, for ..). Как решить??
Мой код:
int main(int argc, char **argv) {
InitializeNativeTarget();
LLVMContext &Context = getGlobalContext();
std::string Err;
const std::string InputFile = "teste_f1.bc";
OwningPtr<MemoryBuffer> result;
error_code ec = MemoryBuffer::getFile(InputFile, result);
MemoryBuffer *buffer = result.take();
Module * Mod = ParseBitcodeFile(buffer, Context);
ExecutionEngine* EE = 0;
EngineBuilder builder(Mod);
builder.setErrorStr(&Err);
builder.setEngineKind(EngineKind::JIT);
EE = builder.create();
Function * func = Mod->getFunction("main");
std::vector <std::string> params;
params.push_back(Mod->getModuleIdentifier());
EE->runStaticConstructorsDestructors(false);
int Result = EE->runFunctionAsMain(func, params, NULL);
EE->runStaticConstructorsDestructors(true);
WriteBitcodeToFile(Mod, outs());
delete Mod;
return 0;
}
main
внутри, а затем возвращает содержимое файла .bc (который является двоичным) на выход. И проблема возникает во время выполнения (точнее, JIT-компиляции). Кстати, если вы последуете этому с помощьюllvm-dis
, вы можете просто вместо этого вызватьprint
илиdump
в модуле, чтобы получить текстовое представление. - person Oak   schedule 18.08.2013