LLVM异常;如何放松

时间:2011-09-23 15:55:44

标签: c++ exception-handling llvm jit dwarf

目前,我正在使用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的路径上启发我

  • 技术评论:JIT代码是在boost::context内调用的,它只调用try catch中的JIT代码,并且对catch只执行任何操作,它只是从上下文中退出并返回主执行堆栈。我的想法是,如果我在主执行堆栈中处理展开,我调用的任何函数(例如,清理堆栈变量)都不会从终止的JIT上下文覆盖那些相同的堆栈内容,因此它不会被破坏。希望我有足够的理解

1 个答案:

答案 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); }

这真的不那么复杂。