#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
.