强制Clang按值(无byval)实际传递结构

Force Clang to actually pass struct by value (no byval)

本文关键字:结构 byval Clang 按值 强制      更新时间:2023-10-16

考虑以下代码:

struct A {
int a;
double b;
int c;
};
extern "C" void fn(A a) {
// do something with a
}

Clang将其编译为以下LLVM代码(仅显示相关部分(:

%struct.A = type { i32, double, i32 }
define void @fn(%struct.A* byval align 8) #0 {
ret void
}

为了连接一个特殊的二进制接口,我需要@fn的签名像一样

void @fn(%struct.A)

有什么办法做到这一点吗?

clang在这里遵循平台ABI以及如何实现参数的实际降低。所以总的来说,不,你不能期望像你的例子那样武断。