clang 01. clang driver流程分析

news/2024/10/28 0:16:57/

文章目录

  • 前言
    • 在这里简要概述一下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.ppmy.cn/news/162283.html

相关文章

Python3中对时间的处理(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 本文介绍Python3中各种处理时间的库和使用方案 最近更新时间:2023.6.2 最早更新时间:2023.6.2 文章目录 1. datetime库2. time库3. JioNLP库:(中文)从文本中提取时间信息4. datefinde…

深入了解JavaScript中的Promise

在JavaScript中,异步编程是必不可少的。过去,我们通常使用回调函数来处理异步操作,但回调地狱(callback hell)和复杂的错误处理使得代码难以维护。为了解决这些问题,ES6引入了Promise,它是一种更…

Java --- springboot3之日志管理

目录 一、日志整合原理 1.1、简介 1.2、日志格式 1.3、记录日志 1.4、日志级别 1.5、日志分组 1.6、日志文件输出 1.7、文件归档与滚动切割 1.8、自定义日志系统 一、日志整合原理 规范:项目开发不要编写System.out.println(),应该用日志记录信息…

如何进行网站建设定制开发

如今,由于互联网的迅速发展,市场竞争越来越激烈,企业想要在市场中保持竞争力,就必须要有自己的品牌形象。而网站建设则是品牌建设的重要组成部分,一个好的网站能够有效提升企业品牌形象,提高客户满意度和忠…

【Java】int转hexString时高位不足补0,避免出现长度为3或2的hexString

String.format方法 在 Java 中,可以使用 String.format 方法来实现将 int 转成高位补 0 的 hexString: int num 255; String hexString String.format("%08X", num); System.out.println(hexString);长度为4位 int num 255; String hexS…

游戏十五大基本游戏类型介绍

系列文章目录 文章目录 系列文章目录前言一、游戏类型是什么二、游戏分类方法1.按游戏方式2.按游戏内容3.按游戏载体4.按游戏平台5.按玩家人数6.按游戏地区 三、游戏分类1.动作游戏2.冒险游戏3.模拟游戏4.角色扮演游戏5.策略游戏6.其余大类1.音乐游戏2.休闲游戏3.体育游戏4.竞速…

《游戏设计信条》【笔记】

书籍的作者是Marc Albinet,曾负责《刺客信条》的设计创意。其设计作品包括迪士尼公司荣获BAFYA大奖的《跳跳虎的蜂蜜猎人》,以及《蓝精灵》系列和《舞力全开》等。 正文: 第一部分:设计工具 一、行业现状 1 3C元素&#xff1a…

亚博 BST-M51 单片机 电子 拔河 游戏机 仿真实物

电子拔河游戏机 一个数码管一个蜂鸣器两个按键7个灯。 玩家一和玩家二各有一个按键,刚开始小灯处于中间位置,玩家一按一下按键,小灯会像玩家一这边移动一格,完全拉过去的时候则玩家一加1分。 每局游戏结束,自动开始下一…