因此,我正在为LLVM编写FunctionPass,并尝试向函数添加一些调用指令。

如果我这样拨打Type::getVoidTy();:

Type::getVoidTy(F.getContext());

一切都编译良好。

但是,如果我这样做:
llvm::LLVMContext context = F.getContext();
Type::getVoidTy(context);

尝试编译过程时,出现以下编译错误:
llvm-3.2.src/include/llvm/LLVMContext.h: In member function ‘virtual bool {anonymous}::Hello::runOnFunction(llvm::Function&)’:
llvm-3.2.src/include/llvm/LLVMContext.h:93:3: error: ‘llvm::LLVMContext::LLVMContext(llvm::LLVMContext&)’ is private
   LLVMContext(LLVMContext&) LLVM_DELETED_FUNCTION;
   ^
llvm-3.2.src/lib/Transforms/Hello/Hello.cpp:370:48: error: within this context
       llvm::LLVMContext context = F.getContext();
                                                ^

所以我想这是我对c++的理解所引起的问题,但是我不明白为什么在同一情况下对访问器的调用在一种情况下有效,而在另一种情况下却无效。

最佳答案

明确删除了LLVMContext的copy ctor和副本分配运算符(请参见the code here)。
Function::getContext返回对LLVMContext的可变引用。通过分配给:

llvm::LLVMContext& context = F.getContext();

您正在尝试调用已删除的构造函数。您应该随身携带llvm::LLVMContext&

07-28 09:46