Как реализовать неявный extern c - LLVM - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь создать способ использовать внешние функции C ++ в моем коде LLVM - например:

extern "C" DLLEXPORT double printd(double X) {
  fprintf(stderr, "%f\n", X);
  return 0;
}

Я хотел бы иметь возможность вызывать printd в моем коде IR LLVM.

Я знаю, что мне нужно реализовать JIT, чтобы это работало, но я не совсем уверен, какие элементы JIT позволяют вызывать функции из кода C ++ или как связать этот код с моим кодом IR.


Редактировать

Код IR (out.ll)
declare double @printd(double)

define double @__anon_expr() {
entry:
  %calltmp = call double @printd(double 1.000000e+01)
  ret double %calltmp
}
define i32 @main() {
call double @__anon_expr()
ret i32 0
}

Я генерирую приведенный выше код, используя C ++:

IR->print(llvm::errs());

Наконец, я запускаю его, используя:

$ lli out.ll

И я получаю эту ошибку:

LLVM ERROR: Program used external function '_printd' which could not be resolved!

Редактировать 2

Когда я запускаю clang out.ll -lmylib -o a.out

warning: overriding the module target triple with x86_64-apple-macosx10.12.0 [-Woverride-module]
1 warning generated.
ld: library not found for -lmylib
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)

Редактировать3

$ clang out

Undefined symbols for architecture x86_64:
  "_printd", referenced from:
      ___anon_expr in out
ld: symbol(s) not found for architecture x86_64
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)

$ lli out

lli: out:1:1: error: expected top-level entity
���� �� �__text__TEXT ��__literal8__TEXT@__compact_unwind__LD(@H�__eh_frame__TEXThX�
                                                                                    h$

1 Ответ

0 голосов
/ 18 мая 2018

Функции C ++, объявленные как extern "C", можно вызывать так же, как обычные функции C (это то, что делает extern "C"), поэтому все, что вам нужно, - это объявление, а затем инструкция обычного вызова.Так что это будет:

; At the top-level:
declare double @printd(double)

; Somewhere inside the definition of a function that calls printd:
%42 = call double @printd(double %23)

Тогда все, что вам нужно, это создать ссылку на вашу библиотеку при создании окончательного исполняемого файла.

Я знаю, что мне нужно реализовать JIT дляполучить это работает

Вызов внешних функций прекрасно работает в AOT-скомпилированном коде.Вам не нужно JIT-компилировать для вызова внешних функций.

...