У меня есть следующий код IR LLVM:
//Code snippet #1
; <label>:30: ; preds = %30, %18
tail call void (i32, ...) bitcast (void (...)* @delay to void (i32, ...)*)(i32 5) #3
%31 = tail call zeroext i1 (...) @testFunc() #3
br i1 %31, label %30, label %32
Первый - это вызов функции Задержка. Это пустая функция, но я добавил FnAttributes к ней. Я сделал то же самое с testFunc, но этот возвращает 1-битное целое число (логическое значение).
При обходе кода вот так:
//Code snippet #2
for (llvm::Instruction& inst : BB)
{
llvm::CallInst * callInst = llvm::dyn_cast<llvm::CallInst>(&inst);
if (callInst == nullptr)
continue;
if (llvm::Function *calledFunction = callInst->getCalledFunction()) {
if (calledFunction->hasFnAttribute("MyAttr")) {
llvm::outs() << calledFunction.getFnAttribute("MyAttr").getValueAsString().str() << "\n";
}
}
Получение атрибута (и печать его на консоли) в приведенном выше коде работает для testFunc, но не для функции void. Мне нужно иметь возможность привести функцию void к функции llvm :: Function, чтобы получить FnAttribute.
Используя что-то вроде
callInst->getCalledValue()
Дает мне значение, но я не могу привести его к llvm :: Function.
Если я выполняю все функции, используя следующий код:
//Code snippet #3
for (llvm::Function& F : M)
{
if (F.hasFnAttribute("MyAttr"))
{
llvm::outs() << F.getFnAttribute("MyAttr").getValueAsString().str() << "\n";
}
}
Я получаю FnAttribute функции задержки очень хорошо.
Мой вопрос: как я могу получить функцию «задержки» в этом коде, приведенную к llvm :: Function, чтобы я мог получить атрибут FnAttribute во фрагменте кода # 2?
Заранее большое спасибо!