【问题标题】:GCC modified/custom target with a custom calling convention on x86-64GCC 修改/自定义目标,在 x86-64 上具有自定义调用约定
【发布时间】: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


【解决方案1】:

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

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

调用约定在"machine description" 中配置,它是back end 的一部分。对于您正在查看的更改类型,最重要的部分是stack layout and calling conventions 的描述。例如,您可以使用TARGET_FUNCTION_VALUE hook 更改函数返回标量值的方式,但您可能还需要修改机器描述的其他部分以正确处理寄存器分配。

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

【讨论】:

    猜你喜欢
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2018-05-28
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多