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, которые реализуют эту внутреннюю

Другие вопросы по тегам