我想调用导出的函数(来自共享库的函数 - .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