将LLVM bitcode加载到模块中:无法将'std :: unique_ptr <llvm :: module>'转换为'llvm :: Module *'</llvm :: module>

时间:2015-01-12 12:41:51

标签: c++ llvm

我尝试从here

编译最小的例子
#include <llvm/IR/Module.h>
#include <llvm/IRReader/IRReader.h>
#include <llvm/IR/LLVMContext.h>
#include <llvm/Support/SourceMgr.h>

using namespace llvm;
int main()
{
  LLVMContext context;
  SMDiagnostic error;
  Module *m = parseIRFile("hello.bc", error, context);

  if(m)
  {
    m->dump();
  } 

  return 0;
}
使用

g++ myFile.cpp `llvm-config --cxxflags --ldflags --libs all --system-libs` -std=c++11 -ldl -lpthread

并获取

错误:初始化时无法将'std :: unique_ptr'转换为'llvm :: Module *'

所有示例和llvm源本身到处都使用llvm :: Module *;那么为什么我会收到这个错误?

注意我使用:LLVMVersion = 3.6.0svn LLVM_CONFIGTIME = Thu Dec 18 10:51:37 CET 2014 这是3.6主干的问题吗?我应该选择3.5分支吗?

THX 亚历

1 个答案:

答案 0 :(得分:3)

问题在于parseIRFile为您提供了unique_ptr<Module>,并且没有从unique_ptr<Module>Module*的隐式转换(这很好!!)。要修复,只需使用正确的类型:

std::unique_ptr<Module> m = parseIRFile(..);
auto m = parseIRFile(..); // avoid all future type issues

使用unique_ptr进行内存管理比使用原始指针要聪明得多 - 此界面清楚地表明您负责m的所有权。这样,您就不必记得删除它。

如果您真的确实想要使用原始指针,只需在返回的对象上调用release,使其不再拥有它:

Module* m = parseIRFile(..).release();

我只是为了完整性而提出这一点 - 真的更喜欢让你的对象保持unique_ptr