Clang Driver的内部实现

举报
keyboard artist 发表于 2021/12/25 17:02:14 2021/12/25
【摘要】 本文介绍Clang driver的内部实现,主要的参考资料是https://clang.llvm.org/docs/DriverInternals.html,同时结合一些具体代码的介绍。 编译器Driver简介一个程序的“编译”实际上包含了复杂的流程,从源代码到可执行文件,中间经历了编译、汇编、链接等过程。以上过程可以通过clang -v看到。其中每个过程一般会有一个单独的进程负责执行,也会...

本文介绍Clang driver的内部实现,主要的参考资料是https://clang.llvm.org/docs/DriverInternals.html,同时结合一些具体代码的介绍。

编译器Driver简介

一个程序的“编译”实际上包含了复杂的流程,从源代码到可执行文件,中间经历了编译、汇编、链接等过程。以上过程可以通过clang -v看到。其中每个过程一般会有一个单独的进程负责执行,也会有单独的输入输出和运行参数。但以上过程一般不会暴露给用户,对用户来说编译器工具链只有一个统一的入口,即为driver。Driver根据用户的编译选项决定了要选取什么工具链、如何组合各种子任务。

Clang Driver的主要概念

下图是Clang driver的概念设计图。其中橙色部分是Driver内部维护的数据结构,绿色部分是driver不同阶段编译任务的逻辑描述,蓝色部分是一些辅助类。
image.png

根据上图的绿色部分,Driver的功能主要分为5个阶段:

  1. 选项解析
    这一步的输入是用户的编译命令,编译选项字符串经过解析后将不同的选项存为Arg和ArgList对象。
  2. 流水线构造
    流水线是driver需要具体执行的命令的集合。例如一个普通的C程序,一般需要预处理、编译、汇编、链接阶段,以上每一个阶段被抽象为一个Action.
  3. Action与Tool绑定
    这一步将上一步产生的Action变成具体的命令,其中先要经历工具的选择,例如编译Action通过clang还是gcc编译,汇编命令通过LLVM自带的汇编器还是GNU的as,链接命令通过ld还是LLVM自带的lld。同时每个工具都需要一个具体的命令行输入,一个工具和他的命令行参数就是一个Job。每个工具通常要调用ConstructJob()函数来构造命令行字符串。
  4. 命令分发和执行
    这里将前面构造好的运行命令分发为具体的进程执行。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。