如何实现隐式外部 c - LLVM
How to implement implicit extern c - LLVM
我正在尝试构建一种在我的 LLVM 代码中使用外部 C++ 函数的方法 - 例如:
extern "C" DLLEXPORT double printd(double X) {
fprintf(stderr, "%f\n", X);
return 0;
}
我希望能够在我的 LLVM IR 代码中调用 printd
。
我知道我必须实施 JIT 才能使其正常工作,但我不确定 JIT 的哪些元素允许从 C++ 代码调用函数或如何 link 该代码到我的 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$
声明为 extern "C"
的 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)
那么您所需要的只是在创建最终可执行文件时针对您的库link。
I know that I have to implement a JIT to get this working
调用外部函数在 AOT 编译代码中工作得很好。您不需要 JIT 编译来调用外部函数。
我正在尝试构建一种在我的 LLVM 代码中使用外部 C++ 函数的方法 - 例如:
extern "C" DLLEXPORT double printd(double X) {
fprintf(stderr, "%f\n", X);
return 0;
}
我希望能够在我的 LLVM IR 代码中调用 printd
。
我知道我必须实施 JIT 才能使其正常工作,但我不确定 JIT 的哪些元素允许从 C++ 代码调用函数或如何 link 该代码到我的 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$
声明为 extern "C"
的 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)
那么您所需要的只是在创建最终可执行文件时针对您的库link。
I know that I have to implement a JIT to get this working
调用外部函数在 AOT 编译代码中工作得很好。您不需要 JIT 编译来调用外部函数。