错误:X86CodeEmitter LLVM

错误:X86CodeEmitter LLVM,llvm,error-code,llvm-3.2,Llvm,Error Code,Llvm 3.2,我在运行程序时遇到以下问题: 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/Relea

我在运行程序时遇到以下问题:

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程序包含条件语句时才会发生这种错误,例如。。。如何解决

我的代码:

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;

}

这是因为包含条件语句的代码(例如etc)会导致包含phi节点的IR。可以使用reg2mem pass删除phi节点。命令是:

opt -reg2mem -o output.bc input.bc

我的程序将一个.bc文件作为输入,然后加载该文件并显示它——好吧,代码不是这样做的。代码加载一个.bc文件,执行其中的main函数,然后将二进制的.bc文件内容转储回输出。问题发生在执行过程中,或者更准确地说,是JIT编译。顺便说一句,如果您在llvm dis中遵循这一点,您可以在模块上调用print或dump来获取文本表示。reg2mem过程添加phi节点,而不是通过用phis替换加载和存储来删除它们。另外,我不明白为什么phi节点的存在会使x86代码发射器无法工作…@Oak reg2mem没有添加phi节点,请查看llvm邮件列表中的以下链接。如果您仍然不确信,请自己在一段代码上尝试一下。您认为机器将如何在汇编中执行phi节点?如果机器无法执行phi节点,为什么代码发射器会发出phi节点?链接:和我的错误;我把reg2mem理解为mem2reg:但我仍然不理解关于phi节点和发射代码的部分。LLVM IR确实不是x86程序集,这就是为什么会有指令降低和选择,这应该负责phi节点。@Oak OP在x86CodeEmitter而不是LLVM IR emitter处遇到错误。有一个称为phi消除的机器函数过程,这意味着phi节点被降低到组装,但仍然需要在发出最终代码之前删除。至于为什么phi节点传播到组装,这是一个很好的问题,可能是因为一些机器级的过程依赖于它。考虑通过投票纠正你的错误。