Как преобразовать переход модуля вставки функции во встроенный в встроенный - PullRequest
0 голосов
/ 30 октября 2019

ПРОБЛЕМА: В настоящее время у меня есть традиционный инструментарий модуля, который вставляет новые вызовы функций в заданный IR в соответствии с некоторой логикой (вставленные функции являются внешними по отношению к небольшой библиотеке, которая позднее связана с данной программой). При проведении экспериментов мои накладные расходы связаны с затратами на выполнение вызова функции библиотечной функции.

Что я пытаюсь сделать: Я хотел бы встроить эти тела функций в IRданная программа избавит от этого узкого места. Я предполагаю, что встроенная функция была бы чистым способом сделать это, поскольку встроенная функция была бы расширена до ее тела функции при понижении до ASM (пожалуйста, исправьте меня, если мое понимание здесь неверно, я впервые работаю с встроенными / LTO).

Текущий статус:

Мое исходное определение библиотечного вызова:

void register_my_mem(void *user_vaddr){
  ... C code ...
}

Пока:

  • Я создал определение в: llvm-project / llvm / include / llvm / IR / IntrinsicsX86.td

    let TargetPrefix = "x86" в {def int_x86_register_mem: GCCBuiltin <"__buildin_register_my_mein",><[], [llvm_anyint_ty], []>;}

  • Добавлен еще один def в: otwm / llvm-project / clang / include / clang / Basic / BuiltinsX86.def

    TARGET_BUILTIN (__buildin_register_my_mem, «vv *»,"", "")

  • Добавлен мой источник библиотеки (* .c, * .h) в compiler-rt / lib / test_lib и добавлен в CMakeLists.txt

  • Заменена функция вставки вместо попытки вставить встроенную функцию в: llvm / lib / Transforms / Instrumentation / myModulePass.cpp

WAS:

FunctionCallee sm_func =
curr_inst->getModule()->getOrInsertFunction("register_my_mem",
func_type);
ArrayRef<Value*> args = {
      builder.CreatePointerCast(sm_arg_val, currType->getPointerTo())
};
builder.CreateCall(sm_func, args);

NEW:

Intrinsic::ID aREGISTER(Intrinsic::x86_register_my_mem);
Function *sm_func = Intrinsic::getDeclaration(currFunc->getParent(),
aREGISTER, func_type);
ArrayRef<Value*> args = {
      builder.CreatePointerCast(sm_arg_val, currType->getPointerTo())
};
builder.CreateCall(sm_func, args);

Вопросы:

  1. Если моя логика для вставки встроенных функций не должна быть проходом модуля, куда мне его поместить?
  2. Не путаю ли я LTO со встроенными функциями?
  3. Я помещаю определения моей библиотечной функции в следующие файлы, как указано в http://lists.llvm.org/pipermail/llvm-dev/2017-June/114322.html, как, например, EmitRegisterMyMem ()?
    • clang / lib / CodeGen / CodeGenFunction.cpp - определить llvm :: Instrinsic :: ID
    • clang / lib / CodeGen / CodeGenFunction.h - объявить llvm :: Intrinsic :: ID

Мой LLVM компилируется, поэтому он семантически корректен, но в настоящее время при попытке вставить этот вызов функции LLVM segfaults говорит «Недопустимый тип для аргумента функции!»

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Я вижу здесь несколько проблем.

Действительно, вы путаете LTO с собственными. Встроенные функции - это специальные «функции», которые либо расширяются в специальные инструкции бэкэндом, либо понижаются до вызовов библиотечных функций. Это, конечно, не то, что вы собираетесь достичь. Вам вообще не нужно встроенное свойство, вам просто нужно встроить соответствующий вызов функции: либо руками (из прохода вашего модуля), либо через LTO, действительно.

Особая ошибка возникает из-за того, что выВы объявляете свою внутреннюю сущность как получающую целочисленный аргумент (и так будет выглядеть объявление), но:

  • запрашивает объявление внутренней переменной с недопустимым типом (я предполагаю, что ваш func_type - нецелочисленный тип)
  • передача аргумента указателя

Надеюсь, что это прояснит проблему.


См. также: https://llvm.org/docs/LinkTimeOptimization.html

0 голосов
/ 31 октября 2019

Спасибо, что решили этот вопрос @ Антон Коробейников.

После прочтения вашего объяснения я также считаю, что мне нужно использовать LTO, чтобы выполнить то, что я пытаюсь сделать. Я особенно нашел эту ссылку очень полезной: https://llvm.org/docs/LinkTimeOptimization.html. Кажется, я сейчас на правильном пути.

...