gpt4 book ai didi

C ABI 与 LLVM

转载 作者:太空狗 更新时间:2023-10-29 16:41:21 26 4
gpt4 key购买 nike

我有一个用 LLVM 编写的编译器,我希望提高我的 ABI 合规性。例如,我发现很难在 Windows x86 或 Linux 上真正找到 C ABI 的规范文档。我发现的那些用 RAX/EAX/etc 来解释它,而不是我可以使用的 IR 术语。

到目前为止,我想我已经发现 LLVM 以不可见的方式对待聚合 - 也就是说,它将它们的成员分别视为一个不同的参数。因此,例如,在 Windows x64 上,如果我想像文档中所说的那样处理聚合,我将需要强制转换为该大小的单个整数,如果是 8、16、32 或 64 位。否则,通过指针传递。

对于 Windows x86,似乎 __cdecl 和 __stdcall 不需要我的任何操作,因为所有参数都在堆栈上传递。 __fastcall 表示前两个 32 位或更小的参数是寄存器传递的,因此我需要强制使用该大小或更小的集合。 __thiscall 将 this 传递到寄存器中,并将其余部分传递到堆栈中,因此我似乎不需要在这里执行任何调整。

对于 __vectorcall,通过整数强制传递不超过 sizeof(void*) 的集合。对于其他聚合,如果它们是 HVA,则按值传递;否则在 x86 上按值传递或在 x64 上按指针传递。

这看起来很简单(好吧,相对来说),但是 sext 的 LLVM 文档清楚地指出“这向代码生成器表明参数或返回值应该被符号扩展到调用者(对于参数)或被调用者(对于返回值)的目标 ABI(通常是 32 位)。”。 x86 调用约定的 Microsoft 页面没有提及将任何内容扩展到任何宽度。

而且我已经观察到 Clang 生成的 LLVM IR,它在 Windows 上生成 byval 属性。我从上面收集到的理解从未要求使用 byval

我如何将各种平台 C ABI 降低到 LLVM IR?

最佳答案

我不能说我 100% 理解您的问题,但值得注意的是,LLVM IR 根本无法代表平台 ABI 的所有微妙之处。因此,在 Clang 工具链中,前端负责执行 ABI 降低,例如将对象按值正确传递给函数等。

查看 Clang 源代码树中的 lib/Basic/Targets.cpp 以了解定义。详细信息在 lib/CodeGen/TargetInfo.cpp

关于C ABI 与 LLVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25127874/

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