我之前已经能够使用 C 中的函数指针调用 Swift 方法,并提供适当的参数,因为调用约定是相同的。
不幸的是,这不再有效。这是因为 Swift 添加了一个“调用上下文”参数,该参数在与普通参数不同的寄存器 (r13) 中传递。对于常规方法调用,此上下文是指向 self 的指针。有关更多信息,请参见此处:https : //github.com/apple/swift/blob/master/docs/ABIStabilityManifesto.md#calling-convention
因此,为了调用这些方法,我需要能够可靠地将 r13 设置为来自 C 的适当值。
我怎样才能在 clang/llvm 中做到这一点?
我没有找到向特定寄存器声明寄存器变量的方法(gcc 语法对此不起作用)。所以我有这样的代码:
void (*my_fp)(void *) = find_pointer();
void *instance = find_instance();
void *arg1 = whatever();
asm {
mov r13, [instance]
}
my_fp(arg1);
它可能会或可能不会工作 - 有时编译器会立即将 r13 用于函数指针。此外,我想在未经编译器同意的情况下仅写入该寄存器并不是特别安全。
有没有可靠的方法来做到这一点?
(顺便说一句,我无法在我的代码中包含 Swift 运行时,所以我必须能够从 C 调用。)