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)

Другие вопросы по тегам