LLVM Вставить вызов функции, определенный из другого файла

#llvm #llvm-ir

#llvm #llvm-ir

Вопрос:

Я хочу вставить функцию полностью перед определенной инструкцией, но вызов функции определен в другом файле. Я попытался

 IRBuilder<> Builder(pi);
CallInst *callOne = Builder.CreateCall(func_ins, "foo");
  

где func_ins Function* (или Value* , если быть более общим), и foo присвоен префикс имени переменной вызывающей функции.
Поскольку эта функция определена в другом файле, я понятия не имею, на что func_ins должен указывать указатель, поэтому я просто установил для него значение NULL, но это не сработало.

Может кто-нибудь дать мне несколько советов о том, как решить эту проблему?

Еще одна проблема: могу ли я использовать WriteBitcodeToFile для сброса инструментального кода, который имеет вызов внешней функции в file, потому что мне интересно, может ли он сообщать Referencing function in another module или Broken Module при выполнении проверки модуля?

Ответ №1:

Вы можете вызывать только функцию из того же Module файла и не можете использовать NULL ее в качестве вызываемого.

Если функция определена в другом модуле, вам нужно сначала объявить ее в модуле, в котором вы хотите выполнить вызов, а затем выполнить вызов, используя объявление.

Чтобы объявить его, создайте идентичную функцию в новом модуле (через Function::Create ) и просто не присваивайте ему тело.

Комментарии:

1. Спасибо, и вот часть примера кода, который я использую, я предполагаю, что Int1 представляет для bool . FunctionType *FT = FunctionType::get(Type::getInt1Ty(getGlobalContext()), false); Value* func_ins = Function::Create(FT, Function::ExternalLinkage, "ExternalFunc", Mod); оставшаяся часть конструктора такая же, как в вопросе

2. Не могли бы вы дать мне несколько советов о том, как также передавать параметры функции? FunctionType::get Методом вызывается один аргумент ArrayRef<Type *> , и я предполагаю, что он используется для передачи аргументов. Что мне делать, если я хочу передать в него три параметра (скажем, int , float * и определяемую пользователем структуру * )?

3. @MinGao просто ознакомьтесь с конструкторами ArrayRef, существует множество способов их создания, в том числе из массива и из std::vector .