llvm.llvm的堆栈保护
我刚开始学习LLVM。我正在阅读位于lib/CodeGen/StackProtector.cpp中的堆栈保护代码。在此文件中,InsertStackProtects函数将插入对llvm.stackprotect的调用,以调用以下代码:llvm.llvm的堆栈保护,llvm,Llvm,我刚开始学习LLVM。我正在阅读位于lib/CodeGen/StackProtector.cpp中的堆栈保护代码。在此文件中,InsertStackProtects函数将插入对llvm.stackprotect的调用,以调用以下代码: // entry: // StackGuardSlot = alloca i8* // StackGuard = load __stack_chk_guard // call void @llvm.stackprotec
// entry:
// StackGuardSlot = alloca i8*
// StackGuard = load __stack_chk_guard
// call void @llvm.stackprotect.create(StackGuard, StackGuardSlot)
// ...(Skip some lines)
CallInst::
Create(Intrinsic::getDeclaration(M, Intrinsic::stackprotector),
Args, "", InsPt);
这个llvm.strackprotect()似乎是llvm的一个内在函数,所以我试图找到这个函数的源代码。但是,我找不到它
我确实在include/llvm/IR/Intrinsics.td中找到了该函数的一行定义,但它没有说明它是如何实现的
因此,我的问题是:
- 在哪里可以找到此llvm.strackprotect函数的代码
- 这些*.td文件的用途是什么
多谢各位 文件
.td
是LLVM使用代码生成来减少样板代码量的方法。在这种特殊情况下,/include/llvm/IR/Intrinsics.gen
在生成目录中生成,并包含描述.td
文件中指定的Intrinsics的代码
至于stackprotector
,后端有一堆代码用于处理它。例如,请参见lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
-在SelectionDAGBuilder::visitIntrinsicCall
中,它生成实现此内在函数的实际DAG节点