0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是 LLVM C/C++ 编译器?

Codasip 科达希普 来源:Codasip 科达希普 2023-09-28 09:16 次阅读

RISC-V 是一种模块化指令集架构 (ISA),具有强大的定制能力,在实现创新和差异化的同时而不会出现碎片化现象。在已批准/标准的 ISA 扩展(如整数指令或浮点指令)的基础模块之上,设计人员可以通过添加自定义指令而实现纯粹的设计自由!

通过添加自定义指令而实现更好的性能,更小的内存占用或者更低的功率,意味着软件(最终应用程序)要针对特定的 RISC-V ISA 进行编译。软件开发工具包(SDK)必须清楚地了解 RISC-V 处理器实现了哪些 ISA 模块,这样才能自动利用这些模块。这些指令包括标准指令和定制指令。

但是如何为特定的 RISC-V ISA 获取最佳的 SDK 呢?这里不得不提到 SDK 的重要组成部分--C/C++ 编译器。编译器必须尽可能能够自动、明智地使用这些自定义指令。

什么是 LLVM C/C++ 编译器?

LLVM(低级虚拟机)是一套编译器和工具,如汇编器、链接器或调试器。我们可以把重点放在编译器上。

与其他编译器一样,LLVM 编译器可分为三个部分:前端、优化器(也称中端)和后端,如下图所示。每一层都有不同的用途。

610a8666-5d46-11ee-939d-92fbcf53809c.png

LLVM 编译器前端

前端将 C 或 C++ 源代码作为文本文件输入。前端会对其进行解析,并创建一个中间表达(IR)。IR 以机器格式表示输入内容。

LLVM 编译器优化器

优化器接收 IR,主要针对独立的优化(如循环展开或常量/变量传播),并生成经过优化的 IR。

LLVM 编译器后端

后端接收优化后的 IR,并执行与目标相关的优化、寄存器分配、堆栈操作等。最后生成处理器的汇编代码。

对于可重定位目标性而言,后端是最重要的部分,因为它必须了解目标架构、指令等信息。而 Codasip 的解决方案生成的正是编译器后端。

重定向 LLVM C/C++ 编译器

对于这个问题,Codasip 的做法如下:

以CodAL作为处理器描述的单一来源

RISC-V ISA(包括自定义指令)是通过 CodAL 语言(一种基于 C 语言的处理器高级描述语言)捕获的。该语言捕获了所有重要信息,包括指令的文本形式、二进制编码以及更重要的指令行为。CodAL 描述还包含以下信息:不同类型的危险是如何递交的(它会影响指令调度)、指令是如何执行的(单周期、多周期)、处理器的应用二进制接口(例如,哪些寄存器用于堆栈)或其他微体系结构描述等。此外它还包含其它 C/C++ 编译器功能(例如窥孔优化-peephole optimizations)的说明。

下面的示例显示了一条表示两个数字平均值的简单指令。

611474b4-5d46-11ee-939d-92fbcf53809c.png

根据这一描述可以生成一系列工具。从下图中可以看到,生成的输出之一是 LLVM C/C++ 编译器。

612a4f96-5d46-11ee-939d-92fbcf53809c.png

C/C++ 编译器生成器会解析所有已描述的指令和微架构描述。然后提取指令语义、ABI 或时序,为前端和优化器生成新的后端和配置文件。换句话说,前端和优化器经过预编译和配置,可以快速探索设计空间。而后端则需要编译。生成的后端可以接收到 RISC-V 处理器的每一条指令,且上述指令可以由生成的 C/C++ 编译器自动使用,也可以通过自动生成的内建函数或内联汇编使用。

最独特的是,生成的后端向设计人员开放。如果设计人员想要添加新的 LLVM optimization pass,假设已经用 C++ 编写了一个optimization pass,那么就可以随时添加新的pass。

Codasip同时还改进了 vanilla LLVM。通过添加针对性能提升(例如改进的跳转线程、超级块调度或循环折叠/扁平化)、代码缩减(例如改进的-msave-restore、改进的多输出指令支持或机器大纲器)或 DSP 功能(例如零开销循环、双堆栈架构支持或带后增量/前增量的加载/存储)的高级optimization pass。

此时我们了解一下生成的 C/C++ 编译器在基准测试中的表现如何,并重点关注编译器的两个方面:性能和代码量。

Coremark 和 Dhrystone 用于测量性能,Embench-iot 用于测量代码大小。我们比较了三种编译器: GCC、Vanilla LLVM 和 Codasip LLVM。比较是相对于其他编译器进行的,Vanilla LLVM 是参考编译器(即在图表中得分 1)。RISC-V ISA 配置为 RV32IMCB。

测试性能结果

性能比较显示了 Codasip LLVM 的改进,以及它如何优于其他编译器。请注意,所有编译器都使用了类似的优化标志。自定义指令可以明显改善结果。

614dd128-5d46-11ee-939d-92fbcf53809c.png

代码大小结果

代码大小比较也显示了 Codasip LLVM 的优势,尽管差距并不大。在此,自定义指令也能明显改善结果。对于如何缩减RISC-V的代码大小,大家可通过IP&SoC杂志7/8月版的电子书查阅Codasip的迷你技术白皮书,链接如下:https://ipsoc.yunzhan365.com/books/stka/mobile/index.html

616d23de-5d46-11ee-939d-92fbcf53809c.png

创新自动化助理 RISC-V的飞速发展

RISC-V ISA 仍在不断发展,行业急需一些方法来轻松探索不同指令及其对软件的影响(包括性能、代码大小或功耗等方面)。自动化是非常可取的,因为自动化流程可以快速高效地探索设计空间。或者说,如果设计人员想要创新或与众不同,那么他们就需要能够实现创新或与众不同的工具和语言,协助其达到目的。

而Codasip Studio 正是实现这一目标的有效方法。Codasip的处理器设计自动化工具集能从单一的真实源自动生成所有需要的部件。生成的 LLVM C/C++ 编译器可以自动使用新指令(也就是说,除非您愿意,否则无需更改 C/C++ 代码)。此外它在性能和代码大小方面的表现也非常出色。Codasip Studio 可以自动生成可执行模型、RTL 或验证工具,以完善 IP 工具包,并在最终产品中部署创新的 RISC-V 架构。

审核编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    21

    文章

    2066

    浏览量

    72900
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48625
  • 调试器
    +关注

    关注

    1

    文章

    288

    浏览量

    23410
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44714
  • RISC-V
    +关注

    关注

    41

    文章

    1904

    浏览量

    45052

原文标题:编译器重度爱好者有话说 - 针对 RISC-V 的可重定向 LLVM C/C++ 编译器

文章出处:【微信号:Codasip 科达希普,微信公众号:Codasip 科达希普】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问对RX23T似乎不能对c++进行编译,是编译器版本问题吗?

    对于RX23T似乎不能对c++进行编译,请问是编译器版本问题吗?
    发表于 07-23 06:47

    C++笔记010:C++C的扩展——register关键字增强

    的地址在C语言里面是会出错的。同样的代码我们放到C++编译环境下,发现编译是通过的!在C++中依然支持register关键字,
    发表于 08-11 12:34

    LLVM编译器编译过程

    LLVM 编译器 原理解析, 插件编写
    发表于 04-28 08:15

    GPIO_PIN_RESET与C++编译器不兼容是什么原因导致的

    您可以将返回值解释为布尔值(并将值作为布尔值传递给 gpio 读取和写入,只要您在 C编译您的项目,但一旦尝试在 C++编译,它们与布尔值不兼容但返回 GPIO_PIN_SET
    发表于 12-19 07:46

    S32DS C编译器/标准S32DS C++编译器-优化,,(-O3) 和 (-Os) 的MCU功能和性能是否完全相同?

    对于S32DS C编译器/标准S32DS C++编译器-优化,当我们将设置从最优化(-O3)更改为优化大小(-Os)时,使用相同的源代码,MCU功能和性能是否保持完全相同?如果不是,会
    发表于 04-06 07:48

    MCUXPRESSO编译器C++有问题怎么处理?

    我的 MCUXPRESSO 编译器 C++ 有问题
    发表于 04-20 06:11

    LLVM clang 公开 -std=c++23

    合入 LLVM 17 仓库的代码对 Clang 编译器使用 -std=c++23 代替了 -std=c++2b。 随着 ISO C++ 委员
    发表于 05-27 11:29

    如何为Arm编译Cc++代码

    编写CC++应用程序时,需要使用编译器工具链将其编译为机器代码。然后,您可以在基于Arm的处理上运行此
    发表于 08-02 17:28

    ARM编译器ARM CC++库和浮点支持用户指南

    本文介绍了对Arm®编译器6各种功能的支持级别。 ArmCompiler6基于Clang和LLVM技术构建。因此,它具有比文档中描述的一组产品功能更多的功能。以下定义阐明了对这些功能的支持和保证级别。 Arm欢迎有关使用Arm编译器
    发表于 08-10 06:39

    Arm C/C++编译器开发人员和参考指南

    提供帮助您使用Arm®编译器Linux版的Arm®C/C++编译器组件的信息。Arm®C/C++
    发表于 08-10 06:17

    Arm C/C++编译器22.1版开发人员和参考指南

    提供帮助您使用ARM®编译器Linux版的ARM®C/C++编译器组件的信息。 ARM®C/C++
    发表于 08-11 07:46

    主流的C语言编译器详细介绍

    对于当前主流桌面操作系统而言,可使用Visual C++、GCC以及LLVM Clang这三大编译器。其中,Visual C++(简称MSVC)只能用于Windows操作系统;其余两个
    发表于 09-05 17:27 2次下载
    主流的C语言<b class='flag-5'>编译器</b>详细介绍

    基于C++编译器的节点融合优化方法

    LLVM是以C十十编写的架构编译器的框架系统,支持多后端和交叉编译,用于优化程序的编译时间、链接时间、运行时间和空闲时间。节点融合是一种简单有效的优化方法,其基本思想为将多个节点优化为
    发表于 06-15 14:29 19次下载

    阿里云基础软件C/C++编译器的工作现状及挑战

    本文主要详细介绍了阿里云C、C++编译器(GCC、LLVM)工作现状、主流编译器(GCC、LLVM)开源社区参与现状以及多架构(RISC-V
    的头像 发表于 06-23 15:26 2633次阅读
    阿里云基础软件C/<b class='flag-5'>C++</b><b class='flag-5'>编译器</b>的工作现状及挑战

    C/C++编译器的缺省字节对齐方式

    C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。
    的头像 发表于 04-15 11:24 714次阅读