返回寄存器中的结构 - GCC中的ARM ABI

4 c gcc struct arm

在ARM ABI文档中,我遇到了以下定义的函数:

__value_in_regs struct bar foo(int a, int b) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但GCC(4.3.3)不允许它,我所能找到的只是对一些RealView编译器的引用.从GCC有没有办法做到这一点?

我已经尝试过-freg-struct-return但它并没有什么区别.因为它是一个ABI我无法改变原始程序,并返回一个常规结构破坏堆栈.

如果可以避免的话,我宁愿不使用汇编,因为它不是必需的.

谢谢!

Car*_*rum 5

根据要求发布答案:

如果你必须生成一个可以与编译器不支持的ABI一起使用的二进制文件,那么你就会遇到麻烦.在C中没有什么可以做的.在这种情况下,你需要依靠汇编语言编程并打乱必要的调用.有两种可能性:

  1. 从二进制文件调用另一个二进制文件的ABI.
  2. 从另一个二进制文件调用二进制文件的ABI.

这两个问题都是类似的.要从代码中调用,您需要在汇编中调用shim函数,调用约束来调用外部ABI,然后从那里调用外部函数.与C代码的不同之处在于,现在要进行外部调用,调用内部汇编例程,并执行外部调用所需的任何操作,然后将返回值放回C代码将理解的格式中,并返回.

要支持从外部二进制文件代码的调用,您可以执行相同的操作,但反之亦然.二进制文件的入口点是小程序集例程,它们将外部ABI转换为C代码可以理解的格式,调用内部函数,然后将返回值恢复为外部代码理解的格式,然后返回.

我害怕,有时候没有好的解决方案.