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