如何实现隐式外部c - LLVM

时间:2018-05-18 01:05:22

标签: llvm extern llvm-ir

我正在尝试构建一种在我的LLVM代码中使用extern C ++函数的方法 - 例如:

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

我希望能够在我的LLVM IR代码中调用printd

我知道我必须实现一个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 :(得分:2)

声明为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)

然后,您需要的是在创建最终可执行文件时链接到您的库。

  

我知道我必须实施一个JIT才能实现这个目标

调用外部函数在AOT编译的代码中运行良好。您不需要进行JIT编译以调用外部函数。