我刚开始学习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中找到了这个函数的一行定义,但是它没有说明它是如何实现的。
所以我的问题是:
非常感谢!
发布于 2013-11-04 22:01:40
.td文件是LLVM使用代码生成来减少样板代码的数量。在这种情况下,./include/llvm/IR/Intrinsics.gen是在构建目录中生成的,包含描述.td文件中指定的本质的代码。
至于stackprotector,后端有一堆用于处理它的代码。例如,在lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp - in SelectionDAGBuilder::visitIntrinsicCall中,它生成实际的DAG节点,这些节点实现了这个内部
https://stackoverflow.com/questions/19775744
复制相似问题