llvm.stackprotect LLVM
Я только начал работать с 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, поэтому я попытался найти исходный код этой функции. Тем не менее, я не могу найти это...
Я нахожу одно строчное определение этой функции в include / llvm / IR / Intrinsics.td, но она не говорит, как она реализована.
Итак, мои вопросы:
- Где я могу найти код для этой функции llvm.strackprotect?
- Какова цель этих *.td файлов?
Большое спасибо!
1 ответ
.td
В файле LLVM используется генерация кода для уменьшения количества стандартного кода. В этом конкретном случае ./include/llvm/IR/Intrinsics.gen
создается в каталоге сборки и содержит код, описывающий встроенные функции, указанные в .td
файл.
Что касается stackprotector
в бэкэнде есть куча кода для его обработки. Смотри например lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
- в SelectionDAGBuilder::visitIntrinsicCall
он генерирует фактические узлы DAG, которые реализуют эту внутреннюю