clang 01. clang driver流程分析

news2024/10/6 13:36:13

文章目录

  • 前言
    • 在这里简要概述一下clang的流程
  • 1.clang driver代码分析
    • 1.1创建诊断(`DIagnosticsEngine`)实例
    • 1.2创建Driver(`clang::driver::Driver`)的实例
    • 1.3通过`Driver`的`BuildCompilation`方法生成需要执行的命令
    • 1.4`Jobs`构建完成,通过`Driver`的`ExecuteCompilation`方法执行命令
  • 2.剖析`构建`,对`BuildCompilation`作进一步分析(进入1.3函数)
    • 2.1调用`ParseArgStrings`函数处理程序接收的参数、对配置文件解析
    • 2.2通过`computeTargetTriple`函数`获取`triple`,并通过`getToolChain`函数获取对应的`ToolChain`
      • 2.2.1`getToolChain`函数就根据传递的`triple`的系统信息返回对应的实例
    • 2.3创建`Commpilation`持有参数
    • 2.4获取输入文件(main.c),通过`BuildInputs`函数
      • 2.4.1`BuildInputs`剖析
        • 2.4.1.1 `types::ID types::lookupTypeForExtension(llvm::StringRef Ext)` 函数会根据输入文件 `main.c` 的扩展名 `c` 获取该文件的类型 `TY_C`
    • 2.5 输入的文件处理完成,通过`BuildUniversalActions`函数构建`Action`
    • 2.6随后再通过 `BuildJobs` 函数构建 `Jobs`
  • 总结


前言

上一节中我们说了clang main.c -o main会调用clang driver,而clang driver会对要执行的编译器命令和ld命令进行拼接。clang driver的处理过程主要分为:

  • ParseOption Parsing:解析传入的参数

  • PipelineCompilation Action Construction:根据每个输入的文件和类型,组建action(如PreprocessJobAction),它具体处理的Action可以通过clang -ccc-print-phases来查看。

    $clang -ccc-print-phases -c min.c min2.c
             +- 0: input, "min.c", c
          +- 1: preprocessor, {0}, cpp-output
       +- 2: compiler, {1}, ir
    +- 3: backend, {2}, assembler
    4: assembler, {3}, object
             +- 5: input, "min2.c", c
          +- 6: preprocessor, {5}, cpp-output
       +- 7: compiler, {6}, ir
    +- 8: backend, {7}, assembler
    9: assembler, {8}, object
    
  • Bind Tool & FileName Selection:根据action 选择对应的工具和文件名信息,具体使用的工具文件名可以通过clang -ccc-print-bindings查看

    在这里插入代码片
    
  • TranslateTool Specific Arguments Translation:根据输入的参数转为不同的tool的参数

  • Execute:调用不同的tool执行任务
    该步骤会以创建子进程的方式调用toolclang driver会创建两个子线程clang -cc1ld执行最终的编译任务和链接任务。

    • clang -cc1将源文件.c转换为目标文件.o
      在这里插入图片描述

在这里简要概述一下clang的流程

clang min.c -###会打印clang driver所驱动的内容

  1. 第一步:clangclang driver模式被调用
  2. 第二步,clang driver会根据传入的min.c构建两个Job
    • 第一个任务是编译任务clang接收-cc1参数后会以编译器的身份执行编译任务,输入文件是min.c,输出文件是min.o对象文件。
    • 第二个任务是链接任务ld会将main.o链接为min可执行文件
  3. 最后会根据上面的两个Job创建的新进程执行上面两个Job,来完成编译任务。

1.clang driver代码分析

1.1创建诊断(DIagnosticsEngine)实例

诊断会在编译过程中同步运行,编译器通过诊断提供Error、Warning 和 Info等
在这里插入图片描述

1.2创建Driver(clang::driver::Driver)的实例

TheDriver将会负责后续的clang driver任务
在这里插入图片描述

1.3通过DriverBuildCompilation方法生成需要执行的命令

在这里插入图片描述

1.4Jobs构建完成,通过DriverExecuteCompilation方法执行命令

在这里插入图片描述

2.剖析构建,对BuildCompilation作进一步分析(进入1.3函数)

2.1调用ParseArgStrings函数处理程序接收的参数、对配置文件解析

在这里插入图片描述

2.2通过computeTargetTriple函数获取triple,并通过getToolChain函数获取对应的ToolChain`

在这里插入图片描述

2.2.1getToolChain函数就根据传递的triple的系统信息返回对应的实例

在这里插入图片描述

2.3创建Commpilation持有参数

在这里插入图片描述

2.4获取输入文件(main.c),通过BuildInputs函数

在这里插入图片描述

2.4.1BuildInputs剖析

  • clang driver支持一次性编译多个源文件
  • BuildInputs方法会遍历所有的参数,并筛选Option::InputClass类型的参数,最后调用函数types::ID types::lookupTypeForExtension(llvm::StringRef Ext)获取对应的types::ID

在这里插入图片描述

2.4.1.1 types::ID types::lookupTypeForExtension(llvm::StringRef Ext) 函数会根据输入文件 main.c 的扩展名 c 获取该文件的类型 TY_C

在这里插入图片描述

2.5 输入的文件处理完成,通过BuildUniversalActions函数构建Action

在这里插入图片描述

2.6随后再通过 BuildJobs 函数构建 Jobs

在这里插入图片描述


总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600910.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OS-文件管理1-文件-文件的逻辑结构与物理结构。

一,文件管理 关键词:如何组织及提供的功能。 二,文件-文件基本概念。 1.文件,记录,数据项 2.文件属性 三,文件-文件控制块FCB与索引结点。 文件控制块FCB:用来存放控制文件需要的各种信息…

在软件定义汽车的时代,低代码究竟给车企数字化转型带来了什么?

前言: 软件定义汽车(Software Defined Vehicles, SDV),是由百度自动驾驶事业部总经理王劲提出的概念。其核心思想是,决定未来汽车的是以人工智能为核心的软件技术,而不再是汽车的马力大小,是否…

Java并发体系-第三阶段-JUC并发包-[1]

AtomicXXXFieldUpdater 算是一个小补充 简介 public class AtomicIntegerFieldUpdaterTest {public static void main(String[] args) {AtomicIntegerFieldUpdater<Test> updater AtomicIntegerFieldUpdater.newUpdater(Test.class, "value");Test ts new T…

Maven处理依赖冲突

1.java常用的包依赖异常有&#xff1a; 1&#xff09;AbstractMethodError 2&#xff09;NoClassDefFoundError 3&#xff09;ClassNotFoundException 4&#xff09;LinkageError Maven会根据pom文件中的groupId、artifactId、version来判断jar是否冲突 如果出现了同名不…

开发软件必须写代码?来看smardaten如何零代码开发学生管理系统

一、前言 互联网产品在我们的生活中无处不在&#xff0c;但你知道开发一个这样的产品需要的成本有多大吗&#xff1f; 传统的产品研发模式是&#xff1a;功能需求&#xff0c;需要调研&#xff0c;画原型&#xff0c;开发&#xff0c;测试&#xff0c;上线&#xff0c;跟踪运…

基于Python+OpenCV的图像搜索引擎(CBIR+深度学习+机器视觉)含全部工程源码及图片数据库下载资源

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 数据预处理2. 定义图像描述符3. 索引化数据集4. 设计搜索引擎内核5. 执行搜索 系统测试1. 处理数据集2. 执行搜索 工程源代码下载其它资料下载 前言 本项目旨在开发一套完整高效的图像搜索引擎&#xff0c;为用…

python程序大全(7)——一元一次、一元二次方程解及函数解析

&#x1f3c6;一、前言 从1月到6月一直没更新&#xff0c;学习太忙辣。马上就要暑假了&#xff0c;今天是六一儿童节&#xff0c;所以抽出空来更新更新。 本文讲述的是1元1次方程&#xff0c;1元2次方程的python解法。只用给出一般形式的系数和常数&#xff0c;自动给出方程的…

企业为什么要进行思维与创新内训?有什么好处?

产品思维和创新在现代产品开发和管理中具有重要作用。 产品思维是指在设计和开发产品过程中&#xff0c;综合考虑用户需求、市场趋势、技术发展等多方面因素&#xff0c;以实现产品的有效性、可用性、价值和竞争力。 创新则是通过引入新的想法、方法或技术&#xff0c;创造出新…

table表格排序,@sort-change=“sortChange“ 取消排序

table表格排序&#xff0c;sort-change"sortChange" 取消排序 点击的单个进行排序时,要求isAsc对应当前字段的排序顺序;值ascending,descending,null三种情况;若指定了列对应的prop,没有指定order的话,默认ascending; desc降序&#xff0c;asc升序&#xff0c;当点升…

《水经注地图服务》下载与安装步骤

概述 《水经注地图服务》&#xff08;WeServer&#xff09;是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品&#xff0c;该产品完全遵循OGC相关协议标准&#xff0c;是一个基于若干项目成功经验总结的产品。它可以轻松发布100TB级海量卫星影像&#xff0c;从而使…

【漏洞复现】海康威视iVMS综合安防系统任意文件上传漏洞复现 (在野0day)

文章目录 前言声明一、产品简介二、漏洞概述三、影响范围四、漏洞验证五、漏洞利用六、修复建议 前言 海康威视iVMS综合安防系统存在任意文件上传漏洞 &#xff0c;攻击者可通过构造特定Payload实施对目标的攻击。 声明 本篇文章仅用于漏洞复现与技术研究&#xff0c;请勿利用…

chatgpt赋能python:Python中出现NaN的原因及相关处理方法

Python中出现NaN的原因及相关处理方法 介绍 Python是一种灵活、可扩展的编程语言&#xff0c;它已经成为科学计算、数据分析、人工智能等领域的重要工具。然而&#xff0c;在Python编程过程中&#xff0c;会出现一些比较特殊的问题&#xff0c;其中之一就是NaN。 NaN&#x…

基于html+css的图展示105

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

chatgpt赋能python:如何用Python编写抽奖程序

如何用Python编写抽奖程序 抽奖活动是很多企业和组织引发用户关注和参与的一种有效手段。而Python作为一种简单易学&#xff0c;功能强大&#xff0c;受欢迎的编程语言&#xff0c;它可以很好地帮助我们实现抽奖程序的编写。本篇文章将介绍如何用Python编写抽奖程序&#xff0…

本科毕业设计-软件工程-汽车销售客户关系管理系统

仅供学习参考&#xff0c;严禁盗用&#xff0c;商用&#xff01;&#xff01;&#xff01; 摘 要 随着国家的快速发展&#xff0c;人民对物质生活的需求也在逐渐增加&#xff0c;其中汽车需求是当前人民最主要的增长需求之一。随着汽车市场的不断扩大&#xff0c;汽车销售公司…

光栅尺磁栅尺编码器4倍频脉冲计数器Modbus RTU模块 支持PNP和NPN输入

1、 信号输入 1路光栅尺磁栅尺编码器信号输入&#xff0c;可接NPN和PNP信号&#xff0c;通过命令设置输入类型。 2、 通讯协议 通讯接口&#xff1a; 1路标准的RS-485通讯接口。 通讯协议&#xff1a;支持两种协议&#xff0c;命令集定义的字符协议和MODBUS RTU通讯协议。模块自…

Debian11之基于kubeadm安装K8S(v1.26.0) 集群

Debian10之基于kubeadm安装K8S(v1.26.0) 集群 参考文章 原文链接&#xff1a;https://blog.csdn.net/qq_30818545/article/details/128056996 版权声明&#xff1a;本文为CSDN博主「大能嘚吧嘚」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出…

游戏封包加密方案解析

当下游戏市场已全面回暖&#xff0c;暑期档临近更将迎来大量新游上线&#xff0c;如此关键节点&#xff0c;游戏厂商应当更加注重游戏安全。 FairGuard发现近期游戏黑灰产攻击角度愈发刁钻&#xff0c;除了常见的内存修改外挂、注入挂&#xff0c;针对游戏封包破解的「脱机挂」…

Springboot项目开发常遇到的问题

一、Springboot&#xff0c;修改默认端口&#xff0c;无效 Springboot是一个轻量级Web开发工具。里面内嵌了tomcat&#xff0c;所以我们不需要安装tomcat了。但是多个项目放在一起的时候&#xff0c;总不能都访问8080端口吧。所以我们需要修改默认端口。 默认是8080&#xff0…

jQuery 基础知识

1.jQuery的使用 要想使用 jQuery 的话&#xff0c;我们必须先要官网上下载&#xff08; http://jquery.com/ &#xff09;3.7 到 4.0的开发版本就可以&#xff0c;下载到文件夹以后桌面都可以 &#xff0c;然后拖动到代码编辑器根目录下即可 在需要使用 jQuery 的页面引入 j…