如何调用导出的函数(在LLVM IR中动态调用)?

时间:2018-03-08 13:42:19

标签: c++ assembly shared-libraries interpreter llvm-ir

我想调用导出的函数(来自共享库的函数 - .dll,.so,等等)。 从我到目前为止所看到的情况来看,似乎是因为我不能,因为IR没有堆栈(关于堆栈是真的吗?)。

使用C ++,我可以写这样的东西(对于x86):

// args - an array of a tagged unions.
// out  - points to the place where we want to place the returned value of the func (if the func has one).
void callIt(void* func, Argument* args, size_t argc, void* out) {
  // This macro extracts values from the args array, and put them to the stack.
  // It's also change the ESP register according to the size of the extracted values.
  #define PUT_ARGS_INTO_STACK __asm { ... }

  // This macto calls the func,
  // and writing func's returned value to the out.
  #define CALL_WITH_RET __asm { ... }

  // This macro calls the func.
  #define CALL_WITHOUT_RET __asm { ... }

  if (size > 0)
    PUT_ARGS_INTO_STACK;

  if (out != nullptr)
    CALL_WITH_RET;
  else
    CALL_WITHOUT_RET;
}

然后我们可以像这样使用它:

void main() {
  // double pow(double, double);
  void* pow = importFunc("math.dll", "pow"); // Load DLL.

  Argument* args = makeArguments(2.0, 2.0); // makeArgument is a variadic tamplate.
  double* four;
  callIt(pow, args, 2, (void*)four); // Call the pow function.

  // This will be print 4.0.
  std::cout << *four << std::endl;
}

如何在没有其他asm的情况下在纯IR中编写此代码(callIt)?

P.S。我试着查看Julia语言的源代码(因为我工作的语言是动态语言和Julia),但是我很难理解Julia的来源。

我使用的语言是动态的,因此用户可以在终端中编写如下内容:

> lang-interpreter
> pow :: double -> double -> double
> pow = importFunc("math.dll", "pow")
> pow(2.0, 2.0)
4.0

0 个答案:

没有答案