目前,我正在使用CreateEntryBlockAlloca将变量插入块范围的开头:
template <typename VariableType>
static inline llvm::AllocaInst *CreateEntryBlockAlloca(BuilderParameter& buildParameters,
const std::string &VarName) {
HAssertMsg( 1 != 0 , "Not Implemented");
};
template <>
inline llvm::AllocaInst *CreateEntryBlockAlloca<double>(BuilderParameter& buildParameters,
const std::string &VarName) {
llvm::Function* TheFunction = buildParameters.dag.llvmFunction;
llvm::IRBuilder<> TmpB(&TheFunction->getEntryBlock(),
TheFunction->getEntryBlock().begin());
return TmpB.CreateAlloca(llvm::Type::getDoubleTy(buildParameters.getLLVMContext()), 0,
VarName.c_str());
}
现在,我想为非POD类型添加Allocas(可能需要在退出时使用析构函数/清理函数)。但是,在退出作用域块的末尾添加析构函数调用是不够的,因为在抛出常规DWARF异常时不清楚如何调用它们(出于此参数的目的,可以说异常是从调用只抛出POD类型的C ++函数的调用点抛出,所以不,在我的情况下,无知是幸福,我想远离intrinsic llvm exceptions,除非我更好地理解它们。)
我在想,我可能有一个带有Alloca寄存器的堆栈中有偏移量的表,并且有异常处理程序(在堆栈的底部,在JIT函数的调用点)遍历那些偏移量在桌子上并适当地召唤析构函数。
我不知道的是如何查询使用CreateAlloca创建的Alloca'ed寄存器的偏移量。 我怎样才能可靠地做到这一点?
另外,如果您认为有更好的方法可以实现这一点,请在llvm的路径上启发我
答案 0 :(得分:2)
我不知道的是如何查询使用CreateAlloca创建的Alloca'ed寄存器的偏移量。我怎么能可靠地做到这一点?
你可以直接使用alloca的地址......但是没有任何简单的方法可以将它的偏移量放到堆栈帧中。
为什么你不想使用内在的LLVM异常?它们真的不是那么难用,特别是在你的代码从未真正捕获任何东西的简单情况下。你基本上只需要在简单的情况下获取代码clang,然后复制粘贴它。
修改强> 要在简单的情况下了解如何在IR中使用异常,请尝试将以下C ++代码粘贴到http://llvm.org/demo/的演示页面中:
class X { public: ~X() __attribute((nothrow)); };
void a(X* p);
void b() { X x; a(&x); }
这真的不那么复杂。