【发布时间】:2020-02-16 14:00:36
【问题描述】:
我想知道是否可以(在合理的时间内)修改现有的或为 gcc 定义新的构建目标。目标是进行细微的修改,例如更改返回函数结果的寄存器或使用与 x86-64 的标准 SystemV ABI 不同的寄存器传递参数。
例如,如果我想将函数返回值的寄存器从 RAX 更改为 R8,或者使用 YMM0 和 YMM1 返回一个 64 字节的结构,而无需使用 x86 asm 代码自己编写。
(背景)我正在开发一个小型的自写操作系统,所以我想知道是否可以不坚持使用 System-V ABI 或微软在 Windows 上使用的那个。由于每一行操作系统代码都是我自己编写的,因此不需要与现有的库和东西兼容。我只使用 gcc、ld 和 objdump。没有gdb等...
如果可能的话,我必须在 gcc 源文件或配置文件中的哪里进行此类修改?我已经克隆了 gcc git repo,但找不到进行此类修改的起点。
【问题讨论】:
-
gcc 具有使 regs 易失/非易失的命令行选项(如
-fcall-used-reg),但不适用于对调用约定的其他更改。 IDK 调整的难易程度。我猜想将一个返回值寄存器更改为另一个会很容易。使用一对向量 reg 也可能不会太糟糕; x86-64 SysV 为一对 xmm regs 执行此操作(但由于某种原因没有更宽。)
标签: gcc compiler-construction x86-64 calling-convention abi