针对高通平台的LLVM 21改进
发表于 2025-09-25 16:57:04

在高通技术公司,我们维护多个编译器工具链,以确保本公司团队和客户均能针对我们的平台实现其代码产品化。我们的所有工具链均基于LLVM,并致力于将尽可能多的修改和改进贡献给LLVM开源项目。

我们将我们的改进反馈给LLVM社区,确保我们的改进能够被基于LLVM的其他项目(如:Android工具链等)所采用。

LLVM的最新主要版本21.1已于2025年8月26日发布。我们的工具链团队在多个领域内为该版本做出了重要的开源贡献。这些团队贡献是与上游社区协作完成的,我们期待未来继续深化合作。

关键词指令集体系结构 (RISC-V)

我们的RISC-V工程师在两个主要领域为LLVM 21做出了贡献:

  • 增加对于高通技术公司定制RISC-V扩展项(XqciXqccmp)的支持;及
  • making improvements to how RISC-V is handled in Clang’s Driver.
  • 对在Clang驱动程序中处理RISC-V的方法做出改进。

高通自定义RISC-V扩展项

2024年8月,高通技术公司发布了其自定义RISC-V微控制器扩展Xqci的公开技术规范,该项扩展包含了很多针对各种用途的全新指令,从简单的位操作指令到具有较宽偏移量的内存访问,以及各种新增分支和跳转。

从那时起,我们的团队就一直在与Xqci架构师协作,不断完善指令定义并在LLVM中实现支持。我们在LLVM 20中为Xqci的10个子扩展项实现了基本的汇编支持,并在LLVM 21中完成了对Xqci的汇编支持。

作为这组汇编器改进的一部分,我们增加了对于RISC-V非标准(供应商)重定位方案的支持。该方案利用一个额外的‘R_RISCV_VENDOR’重定位对每个非标准重定位代码进行注释,使链接器能够识别在链接时应采用哪家厂商的行为规范。我们是首家在LLVM汇编器中采纳并实现该方案的厂商,并欣慰地看到自我们贡献该实现后,另一家拥有自有扩展的RISC-V厂商Andes也采用了此方案。

除汇编工作外,我们在LLVM 21版本中的另一重点是为这些扩展实现代码生成支持。对于许多子扩展项而言,实现此项支持意味着添加指令选择模式和代码,以确保可以使用这些模式。该项工作涵盖了内存访问、位操作指令和算术运算,以及实现更大立即值的新方法。

2025年1月,继发布Xqci之后,高通技术公司又发布了Xqccmp,这是RISC-V Zcmp扩展项的自定义变体,修改后与帧指针约定兼容。我们还在Clang/LLVM中实现了对于该扩展项的汇编和代码生成支持,从而确保可以获得扩展项时能够使用这些指令。

我们还在LLVM 21中实现了对于新型中断处理程序的支持。该功能允许用户使用C/C++编写中断处理程序,而无需依赖汇编语言,因为这些处理程序所保存的寄存器集必须比常规函数更大。除了现有机器和管理程序中断类型之外,我们还为Xqciint扩展项(部分Xqci)添加了两种全新的中断处理程序类型,它们具有特定的中断进入和退出指令,可以将寄存器保存在堆栈上。我们还为LLVM添加了对SiFive核心本地中断控制器 (CLIC) 方案的支持,我们希望该项支持能够帮助RISC-V国际快速中断任务组完成相关规范的制定工作。

在与社区合作实现最近批准的ZilsdZclsd标准扩展项方面,我们的进展非常顺利;利用该扩展项,可以将64位数值直接加载和存储在32位RISC-V系统上,而不是一次加载和存储32位数值。

Clang驱动程序改进

Clang驱动器中存在的一个重大技术债是:RISC-V架构拥有独立于其他所有裸机架构的专用工具链定义。该工具链定义负责在构建过程中使用正确的参数正确调用相关工具(编译器、链接器、归档器等),而此处的差异导致RISC-V难以直接采用通用裸机工具链的改进成果。

高通印度私人有限公司的工程师加维特·古普塔在一个大型补丁系列中调整了通用裸机工具链定义的工作方式,从而可以将该定义用于RISC-V,同时不会改变该定义针对其他目标的工作方式。因此,我们能够删除针对RISC-V的工具链定义,以支持通用版本。

AArch64架构

在该发布周期内,我们对LLVM的AArch64架构贡献主要聚焦于为Windows平台启用SVE(可扩展向量扩展)支持。此项工作由以下几个部分组成:

  • 其中一部分是启用SVE内联函数,从而确保用户能够使用C语言编写矢量代码,而不必使用内联汇编,这不仅提升了代码的可维护性,还可能让编译器对代码进行小幅优化。微软公司的C++工具链MSVC尚不支持SVE内联函数,但GCC和Clang均可支持。SVE内联函数被广泛应用于编写高性能SVE程序。
  • 另一部分是启用SVE自动矢量化程序,从而确保编译器能够将现有的标量循环转换为使用SVE指令的循环。

在这两项工作的基础上,我们一直在与微软公司合作,共同记录并实现这些功能在MSVC ABI中的具体规范。其中包括确保LLVM正确实现Windows调用约定;Clang在使用C++时正确修改SVE类型名称;以及LLVM为使用SVE的函数发出正确的C++ 展开信息。

最后一个关键部分是在Windows上生成正确的调试信息,以便用户能够理解其代码。

Hexagon NPU架构

我们也一直在改进高通Hexagon NPU架构。

低级虚拟机Objdump中的反汇编器支持

之前,我们已经对下游进行了重大更改,以支持对Hexagon的VLIW数据包进行反汇编卸。

高通创新中心高级工程师阿达尔沙·雷格米最近向上游提交了这些更改,以确保LLVM可以支持指令术(针对VLIW数据包的低级虚拟机术语)。这项工作与LLVM中其他针对Hexagon架构的objdump改进保持了一致性。

阿达尔沙还实现了在LLVM objdump中正确反汇编和标注PLT条目及符号的功能,这将使理解和调试已链接的二进制文件变得更加便捷。

Clang编译器前端

除了上文提及的、对于Clang驱动程序和Windows上SVE支持进行的更改之外,我们还在Clang的其他一些关键领域做出了贡献。

埃利·弗里德曼被选为Clang维护人员小组(称为“Clang领域团队”)的一员。到目前为止,该团队的工作重点是审核社区RFC(征求意见稿),并为新特性提供实现指南。

该团队仍在建立中,但在确保通过大规模社区为clang贡献重大和/或有争议特性方面已经取得了良好进展。

我们继续对Arm64EC(用于在传统x86-64库和程序同一进程中运行的应用程序的Windows ABI)进行小的修复。该二进制接口至关重要,因为各个团队在采用时无需重建整个生态系统。

最后,我们也一直致力于开发C++ 23的前瞻性特性,包括改进常量求值支持,以便更多的函数可以在更广泛场景下采用constexpr关键字。

低级调试器

在LLDB方面,我们为支持所从事的LLVM 20工作包做出了两项贡献,从而可以在不修改LLVM的情况下轻松支持专有或自定义的RISC-V指令。

第一项更改是将LLDB的反汇编器与LLVM的objdump相匹配,以确保其可以显示指令的原始编码及其反汇编,并且将未知指令显示为“<未知>”。

第二项改进是实现对于自定义反汇编程序的支持,使LLDB既能使用内置反汇编器,也能调用外部程序(如crustfilt)来解析指令。这使得用户更容易理解包含专有指令的程序,而不必同时使用调试器和单独的反汇编器。

后续步骤?

高通技术公司非常感谢LLVM项目中的合作者,而我们的工具链工程师将继续为LLVM的下一个主要版本LLVM 22.1做出贡献和改进,该版本将于2026年初发布。

我们期待您为高通技术公司平台采用基于LLVM 21的工具链,充分利用这些新特性和改进内容。

请加入我们的开发者Discord社区,参与关于开源项目的实时讨论。

进一步阅读

针对LLVM 21Clang 21提供了详细的版本说明。针对 XqciXqccmp同样提供了有关本公司RISC-V自定义扩展项的规范。在github上也可以找到crustfilt工具

在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通技术公司或其子公司(以下简称为“高通技术公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通技术公司或任何其他方的赞同或表述。本网站同样可以提供非高通技术公司网站和资源的链接或参考。高通技术公司对于可能通过本网站引用、访问、或链接的任何非高通技术公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。

高通品牌产品均为高通技术公司和/或其子公司的产品。

关于作者

萨姆·埃利奥特,高通技术公司CPU编译器团队的高级工程师,并定期参与低级虚拟机项目。

阅读更多

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】