2

我刚开始使用 LLVM。我正在阅读位于 lib/CodeGen/StackProtector.cpp 中的堆栈保护代码。在此文件中,InsertStackProtectors 函数将对 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( http://llvm.org/docs/LangRef.html#llvm-stackprotector-intrinsic )似乎是llvm的一个内在函数,所以我试图找到这个函数的源代码。但是,我找不到它...

我确实在 include/llvm/IR/Intrinsics.td 中找到了这个函数的一行定义,但它没有说明它是如何实现的。

所以我的问题是:

  • 我在哪里可以找到这个 llvm.strackprotect 函数的代码?
  • 这些 *.td 文件的目的是什么?

非常感谢!

4

1 回答 1

3

.td文件是 LLVM 使用代码生成来减少样板代码量。在这种特殊情况下,./include/llvm/IR/Intrinsics.gen在构建目录中生成并包含描述文件中指定的内在函数的代码.td

至于stackprotector,后端有一堆代码来处理它。参见例如lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp-SelectionDAGBuilder::visitIntrinsicCall它生成实现此内在的实际 DAG 节点

于 2013-11-04T22:01:40.350 回答