llvm.llvm的堆栈保护

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

我刚开始学习LLVM。我正在阅读位于lib/CodeGen/StackProtector.cpp中的堆栈保护代码。在此文件中,InsertStackProtects函数将插入对llvm.stackprotect的调用,以调用以下代码:

  //   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节点