带有 LLVM 的 C ABI

2024-01-07

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

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

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

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

这看起来很简单(嗯,相对来说),但是 LLVM 文档sext明确指出“这向代码生成器表明参数或返回值应该由调用者(对于参数)或被调用者(对于返回值)”。 Microsoft 的 x86 调用约定页面没有提及将任何内容扩展到任何宽度。

我观察到 Clang 生成的 LLVM IR 生成了byvalWindows 上的属性。我从上面收集到的理解从来不需要byval的用法。

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


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

看一眼lib/Basic/Targets.cpp在 Clang 源代码树中获取定义。血淋淋的细节进一步在lib/CodeGen/TargetInfo.cpp

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 LLVM 的 C ABI 的相关文章

随机推荐

  • 在 MVC Razor 视图中使用 @RenderBody 有什么意义?

    在我使用的 MVC4 剃刀布局中 RenderSection我不介意 和 RenderBody 然后在视图中我只是将所有内容分成几部分 这让我想知道有什么意义 RenderBody除了 让那些不想把东西分成几部分的人更容易 有什么不同之处吗
  • 无法调用 Firebase Hosting 背后的 Google Cloud Function - 状态 503,但状态页面上没有指示 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在访问 Google Cloud HTTP 函数时遇到问题exposed https firebase google
  • 如何删除php中除字母和空格之外的所有字符

    我想删除 php 字符串中除字母和空格之外的所有内容 status 1 Delivered to customer status preg replace PL u status output echo status 输出是 Deliver
  • 用户定义的语言不适用于 Notepad++ 中的指定文件类型

    我在 Notepad 中创建了一种相当简单的用户定义语言 并为其赋予了关联的扩展名 但是 当我打开以该扩展名命名的文件时 什么也没有发生 没有语法突出显示或注释突出显示 知道我做错了什么吗 扩展程序的设置没有前导 如 Notepad 文档中
  • 使用密钥连接到 R 中的 Rest API

    这是一个简单的问题 但我仍然无法弄清楚 我想使用我的 API 密钥连接到 REST API 我查看了有关的文档httr jsonlite和其他人仍然不知道如何设置 API 密钥 这是端点 https api tiingo com tiing
  • 使用 JAXB 和 XMLStreamWriter 写入空标记

    我正在使用标准 JAXB 实现 这是我带注释的课程 是一组课程的一部分 XmlType XmlAccessorType FIELD class MyClass XmlValue protected final String value nu
  • 使用两种方式绑定从角度视图到控制器动态添加/创建对象到数组

    我有一个控制器 控制器的模板 视图如下 我的控制器 angular module myApp controller myController scope function scope scope myObject myView div cl
  • SQL Server - 如何确定索引是否未被使用?

    我有一个高需求的事务数据库 我认为该数据库索引过度 最初 它根本没有任何索引 因此为常见流程添加一些索引会产生巨大的差异 然而 随着时间的推移 我们创建了索引来加速单个查询 一些最流行的表上有 10 15 个不同的索引 在某些情况下 索引彼
  • 背包0-1路径重建(拿哪些物品)[重复]

    这个问题在这里已经有答案了 我知道如何用动态规划方法解决背包 0 1 问题 但我很难弄清楚要拿哪些物品而不影响 O N C N 个物品 C 容量 的复杂性 有什么想法 我更喜欢自下而上的方法 假设现在您将结果存储在数组中bool a whe
  • MySQL因存储过程生成UID而死锁

    我有一个从 ticket 表生成 UID 的存储过程 但在负载下我遇到了很多死锁 每当我的任务需要新的 UID 时 我都会从多个并发连接多次调用此过程 BEGIN DECLARE a uid BIGINT 20 UNSIGNED START
  • 使用android gradle + dagger运行instrumentTests

    我最近开始使用 Android Studio 和 gradle 进行 android 开发 发现它总体上比 eclipse ant 或 maven 好得多 不过 我最近开始尝试使用我的应用程序实施某种单元和 或集成测试 我能够使用谷歌最近发
  • 如何在centOS 7中启动apache

    我使用以下命令启动 Apache service httpd start in centOS6 今天我下载了centOS7 64bit minimal并想在安装后启动 Apache 当我使用service httpd start 操作系统会
  • 我应该如何在后台运行我的 Golang 进程?

    这个问题与编程无关 但对于程序员来说肯定很重要 我编写了一个简单的 smtp 服务器 当我从控制台运行它时 一切都很好 除了它阻止了命令行 我知道我可以通过以下方式运行它 nohup 或通过 screen tmux 等 但问题是 我应该如何
  • 带魔杖的谷歌云功能停止工作

    我设置了 3 个 Google Cloud Storge 存储桶和 3 个函数 每个存储桶一个 当 PDF 文件上传到存储桶时将触发这些函数 函数将 PDF 转换为 png 图像并进行进一步处理 当我尝试创建第四个存储桶和类似的功能时 奇怪
  • Keras:“运行时错误:无法导入 pydot。”安装 graphviz 和 pydot 后

    我在 Windows 10 上使用 Anaconda Python 2 7 我计划进行 Keras 可视化 因此 当间谍程序打开时 我打开了 Anaconda 命令提示符并 pip 安装了 graphviz 和 pydot 现在 当我尝试运
  • 区分扫描仪和键盘

    大家好 我有一台条形码扫描仪连接到一台使用 c 程序的 PC 现在我想区分扫描仪和键盘 哪一个正在向我的程序发送数据 每个人都可以帮助我编写 c 代码或提供建议吗 有人在另一个主题中对我说了这句话 但我还不能这样做 基本上 您可以配置扫描仪
  • Glassfish 服务器不支持 JDK 8

    我在 NetBeans 的 Web 项目中使用带有 lambda 的 jdk 8 但是当将其部署到 glassfish 时 它向我显示以下错误 java lang RuntimeException Uncompilable source c
  • 当字符串文字改变时会发生什么? [复制]

    这个问题在这里已经有答案了 我想将字符串文字更改为全大写 这是我的代码 a and b are the same literal String a Test String b Test now I want to change all b
  • 创建自定义 UIView 并在 Swift 中显示为弹出窗口

    我正在尝试创建一个自定义UIView并使用 Swift 在我的主视图中将其显示为弹出窗口 我的定制UIView代码是 class DatePopUpView UIView var uiView UIView override init su
  • 带有 LLVM 的 C ABI

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