在x86-64上使用自定义调用约定的GCC修改/自定义目标

在x86-64上使用自定义调用约定的GCC修改/自定义目标,gcc,compiler-construction,x86-64,calling-convention,abi,Gcc,Compiler Construction,X86 64,Calling Convention,Abi,我想知道是否有可能(在合理的时间内)修改现有的或为gcc定义新的构建目标。我们的目标是做一些小的修改,比如更改返回函数结果的寄存器,或者使用与标准SystemV ABI for x86-64不同的寄存器传递参数 例如,如果我想将函数返回值的寄存器从RAX更改为R8,或者使用YMM0和YMM1返回64字节的结构,而不用x86 asm代码自己编写。 (背景)我正在开发一个小型的自编操作系统,所以我想知道是否有可能不使用System-V ABI或Microsoft Windows使用的ABI。与现有l

我想知道是否有可能(在合理的时间内)修改现有的或为gcc定义新的构建目标。我们的目标是做一些小的修改,比如更改返回函数结果的寄存器,或者使用与标准SystemV ABI for x86-64不同的寄存器传递参数

例如,如果我想将函数返回值的寄存器从RAX更改为R8,或者使用YMM0和YMM1返回64字节的结构,而不用x86 asm代码自己编写。

(背景)我正在开发一个小型的自编操作系统,所以我想知道是否有可能不使用System-V ABI或Microsoft Windows使用的ABI。与现有libs和其他东西的兼容性不是必需的,因为每一行操作系统代码都是我自己编写的。我只使用gcc、ld和objdump。没有gdb,等等


如果这是可能的,我必须在哪里对gcc源文件或配置文件进行这样的修改?我已经克隆了gcc git repo,但找不到这样一个修改的起点。

这都有点理论性,因为我从未真正尝试过完全的定制。但我认为这将是一个合理的项目

GCC内部文件记录在。您可能不需要详细阅读所有内容,但至少应该尝试对基本结构进行概述。这一切都是高度可配置的

调用约定是在中配置的,它是的一部分。对于您正在查看的更改类型,最重要的部分是对更改的描述。例如,您可以使用更改函数返回标量值的方式,尽管您可能还需要修改机器描述的其他部分以正确处理寄存器分配


我建议从一个非常小的修改开始,并对其进行彻底的测试(至少通过验证汇编程序的输出是否符合预期)。然后,您可以根据需要实施其他修改。在开发变更时,保留测试用例的集合;这些将非常有用,有助于确保更改之间不会发生意外的交互。

gcc有命令行选项,用于使regs易失性/非易失性(like),但不用于调用约定的其他更改。IDK这有多容易/难调整。我想把一个返回值寄存器换成另一个是很容易的。使用一对向量regs可能也不太糟糕;x86-64 SysV为一对xmm reg实现了这一点(但由于某些原因,它并不更宽)