gpt4 book ai didi

c++ - 防止 clang 扩展聚合类型的参数?

转载 作者:太空宇宙 更新时间:2023-11-04 02:00:53 24 4
gpt4 key购买 nike

我正在使用 clang 为某些 C 代码输出优化的 LLVM IR,但遇到了障碍。我曾假设,如果我一次只将函数传递给 clang(声明了必要的依赖项),则生成的 LLVM 例程的函数签名将与我传入的函数一致(即相同数量的具有相同类型的参数)。这在大多数情况下都有效,但聚合类型除外。例如:

下面的C代码

struct A {
double x;
int y;
};

int f(struct A a) {
return a.y;
}

在以下 LLVM 中的结果

; Function Attrs: nounwind readnone uwtable
define i32 @f(double %a.coerce0, i32 %a.coerce1) #0 {
entry:
ret i32 %a.coerce1
}

该结构已扩展为连续参数,因此该函数现在似乎接受两个参数而不是一个。有什么办法可以防止这种类型的扩展?即使它是一种前向声明结构的方式,这样 clang 就不会知道它的组成字段来扩展它?

感谢您的帮助!

最佳答案

此行为由 AMD64 ABI 指定(x86 64 位架构的应用程序二进制接口(interface))。它在 ABI 中指定,以便不同编译器编译的函数可以互操作。出于同样的原因,它不能在不违反 ABI 的情况下更改,这意味着该函数的所有客户端都需要知道它是如何被调用的。

ABI 要求在以下情况下以这种方式拆分聚合对象:

  • 聚合对象的大小不超过16字节,并且

  • 对于 C++,聚合对象是“POD”(普通旧数据)。

否则,参数通过地址传递(尽管仍然需要复制)。

因此,您可以通过增大类型来阻止聚合类型的解聚,但这必须对使用该类型的每个翻译单元可见。

关于c++ - 防止 clang 扩展聚合类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27386912/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com