LLVM IR: как вызвать функцию в другом файле.ll
Я пишу код LLVM IR, могу ли я вызвать функцию в другом файле.ll?
Например: в файле.ll есть функция foo(); Могу ли я использовать эту функцию в b.ll, например, просто вызвать foo? Если да, то как я могу включить
Спасибо
1 ответ
Вам необходимо добавить объявление функции foo в файл ll, в котором вы ее вызываете, а затем, как обычно, преобразовать файлы link link для генерации исполняемого файла.
llvm-link a.ll b.ll -o a.out
пример a.ll
declare i32 @foo(i32)
define i32 @main() {
start:
%0 = call i32 @foo(i32 0)
ret i32 %0
}
b.ll
define i32 @foo(i32) {
start:
ret i32 %0
}
Я пробовал описанную выше процедуру, но a.out
созданный файл не является исполняемым. Первоначально это даетPermission denied
ошибка и после добавления соответствующих разрешений говорит:
-bash: ./a.out: cannot execute binary file
Взяв те же два файла llvm, т.е. a.ll
а также b.ll
что для меня работает:
llvm-link-8 -S a.ll b.ll > hello.ll
llc-8 -filetype=obj hello.ll
clang hello.o
Следующие 3 команды создают исполняемый файл, который отлично работает. Первая команда создает файл битового кода LLVM с именемhello.ll
какие ссылки a.ll
а также b.ll
. После этого это просто процесс создания исполняемого двоичного файла из файла с битовым кодом llvm. что и делают следующие 2 шага. (Обратите внимание, что я использую LLVM 8)