Я пытаюсь создать способ использовать внешние функции 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$