gpt4 book ai didi

c++ - LLVM 异常;如何放松

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:39 24 4
gpt4 key购买 nike

此刻,我正在使用 CreateEntryBlockAlloca 将变量插入到 block 作用域的开头:

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(这可能需要在退出时使用析构函数/清理函数)。然而,仅仅在退出范围 block 的末尾添加析构函数调用是不够的,因为不清楚在抛出常规 DWARF 异常时如何调用它们(为了这个论点的目的,可以说异常是从调用仅抛出 POD 类型的 C++ 函数的调用点抛出,所以不,在我的情况下,无知是幸福的,我想远离 intrinsic llvm exceptions 除非我更好地理解它们)。

我在想也许我可以在堆栈中有一个带有 Alloca 寄存器偏移量的表,并让异常处理程序(在堆栈底部,在 JIT 函数的调用点)遍历这些偏移量在 table 上并适本地调用析构函数。

我不知道的是如何查询使用 CreateAlloca 创建的分配寄存器的偏移量。 我怎样才能可靠地做到这一点?

另外,如果你觉得有更好的实现方式,请指教一下llvm的路径

  • 技术评论:在 boost::context 中调用 JIT 代码它只调用 try catch 中的 JIT 代码,对 catch 什么也不做,它只是从上下文中退出并返回到主执行堆栈。这个想法是,如果我处理主执行堆栈中的展开,我调用的任何函数(例如,清理堆栈变量)都不会覆盖已终止的 JIT 上下文中的相同堆栈内容,因此它不会被破坏。希望我说得够明白

最佳答案

The thing i don't know is how to query the offset of the Alloca'ed registers created with CreateAlloca. How can i do that reliably?

您可以直接使用 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); }

其实并没有那么复杂。

关于c++ - LLVM 异常;如何放松,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7531692/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com