LLVM系列(二)Clang编译过程详解

clang 与 GCC 的区别 一、clang 介绍 1.1 概述 Clang 是一个 C 语言、C++、Objective-C 语言的轻量级编译器。源代码发布于 BSD 协议下。Clang 将支持其普通 lambda 表达式、返回类型的简化处理以及更好的处理 constexpr 关键字。 Clang 是一个由 Apple 主导编写,基于 LLVM 的 C/C++/Objective-C 编译器 2013 年 4 月,Clang 已经全面支持 C++11 标准,并开始实现 C++... 阅读详情

我们通过终端中输入clang -ccc-print-phases main.m,得到如下打印:

                +- 0: input, "main.m", objective-c  //输入
            +- 1: preprocessor, {0}, objective-c-cpp-output //预处理
         +- 2: compiler, {1}, ir //编译
      +- 3: backend, {2}, assembler //后端
   +- 4: assembler, {3}, object //汇编
+- 5: linker, {4}, image //链接
6: bind-arch, "x86_64", {5}, image //绑定

得到了7步操作的简要说明,分别是:

  • 0:导入文件:是为了找到源文件。
  • 1:预处理阶段:这个过程处理包括宏的替换,头文件的导入,会生成 main.i 文件,其中 objective-c-cpp-output 中的 cpp 不是指 C++ 语言,而是 c preprocessor 的缩写。
  • 2:编译阶段:进行词法分析、语法分析、检测语法是否正确,最终生成IR。
  • 3:后端:这里LLVM会通过一个一个的Pass去优化,每个Pass做一些事情,最终生成汇编代码,生成一个 main.s 文件。
  • 4:汇编:生成目标文件,即为 main.o。
  • 5:链接:链接需要的动态库和静态库,生成可执行文件,最终生成 image。
  • 6:绑定:通过不同的架构,生成对应的可执行文件,默认生成x86_64平台。
  • 下面我们一步一步拆解:

1、预处理阶段

        是通过预处理器执行一系列的文本转换与文本处理。预处理器是在真正的编译开始之前由编译器调用的独立程序。

        在终端中输入:clang -E main.m 会生成预编译结果。

        下面我们来把预编译结果生成到文件中,输入命令:clang -E main.m -o main.mi ,会把预编译结果生成一个main.mi文件,里面的内容如下:

# 1 "main.m"
# 1 "<built-in>" 1
# 1 "<built-in>" 3
# 380 "<built-in>" 3
# 1 "<command line>" 1
# 1 "<built-in>" 2
# 1 "main.m" 2


/*
 *在 main 函数中输入
int main(int argc, char * argv[]) {
    int a = 1;
    int b = 2;
    re
C/C++常用编译工具链:GCC,Clang LLVM(Low Level Virtual Machine)是一个开源的编译器基础设施项目,和GNU一样,它也是一个跨平台的编译器和工具链。由苹果公司在2000年发起的,最初的目标是创建一个可以用于苹果公司内部开发的编译器基础设施。后来,LLVM逐渐发展成为一个独立的开源项目,目前已经成为一个非常流行的编译器基础设施。在性能和功能上,两者都有自己的优势和劣势。GCC在某些方面可能更成熟和稳定,而LLVM则可能在某些方面更快和更灵活。 阅读详情

相关推荐

静态库、动态库的制作

嵌入式开发工具——静态库的制作 库文件 1、定义:保存函数和变量,里面的函数和变量只可以是使用,看不到其实现。 2、分类:静态库:.a后缀(保存函数和变量,编译时加载到可执行文件中去) 动态库:.so后缀(保存函数和变量,执行时加载到可执行文件中去) 3、动态库和静态库的区别: (1)使用静态库编译出来的文件大小>使用动态库编译出来的文件大小 (2)使用静态库编译出来的执行文件执行速度>使用动态库编译出来的执行文件的执行速度 (3)使用静态库编译出来的文件升级<使用动态库编译出来的文件升级

m0_52251623的博客 697

LLVM学习之路(一) LLVM+Clang 编译与安装

================================================================================源码下载================================================================================1.通过svn下载(需要安装svn[可用命令:sudo apt-get ...

Wang_shiling的博客 1万+

了解LLVM、Clang编译过程

LLVM 是一个自由软件项目,它是一种编译器基础设施,以 C++ 写成,包含一系列模块化的编译器组件和工具链,用来开发编译器前端和后端。它是为了任意一种编程语言而写成的程序,利用虚拟技术创造出编译时期、链接时期、运行时期以及“闲置时期”的最优化。...

qq_33177268的博客 1592

MAC上安装LLVM+Clang

MAC上安装LLVM+Clang 折腾了一天的结果,感觉不把它写下来都对不住自己了,哭唧唧。 参考资料: - http://clang.llvm.org/get_started.html - http://blog.youkuaiyun.com/shuaiby/article/details/77621542 一、安装cmake (1)去cmake官网下载https://cmake.or

qq_31157999的博客 1万+

如何使用ninja快速编译LLVM和Clang(以llvm3.3为例子)

在使用Make工具编译LLVM是非常耗时的。往往需要三四个小时。但是使用goolge开源的ninja编译LLVM只需要10到20分钟。 本文以llvm3.3为例,演示在linux上编译和安装过程。 第一步 安装ninja和cmake 1 获取并编译安装 ninja $ git clone git://github.com/martine/ninja.git $ cd ninj

dreammeard的专栏 7485

LLVM/Clang安装总结

前言 1.序 平台:虚拟机VMware+CentOS7 拟安装:LLVM-9.0.0 / Cang-9.0.0 目的:最近在学习LINUX程序设计,为方便代码联系,打算在vim下安装YouCompleteMe自动补全插件,而安装clang是前期工作。 2.关于LLVM 关于LLVM,这些东西你必须知道 开始构建 1.升级gcc 参考博文 llvm-9.0.0要求gcc版本在5.0以上,系统自...

qq_39913088的博客 2355

HC32F460的GPIO重映射实战:如何用3步搞定SPI引脚冲突问题

本文详细介绍了HC32F460的GPIO重映射功能,通过三步操作解决SPI引脚冲突问题。文章解析了HC32F460的FuncGroup功能分组机制,提供了具体的寄存器配置步骤和验证技巧,并对比了与传统方案的性能优势,帮助工程师灵活配置引脚,优化硬件设计。

t4y5u6i7o的博客 918

避坑指南:PyCINRAD处理CINRAD雷达数据时遇到的5个典型报错及解决方案

本文针对使用PyCINRAD库处理CINRAD雷达基数据时常见的5个典型报错,提供了详细的解决方案。内容涵盖环境配置、数据读取、PPI可视化及性能优化等核心环节,重点解决了版本兼容性、数据异常处理和中文乱码等实际问题,帮助用户高效处理雷达基数据并生成准确的PPI图像。

cc789的博客 1068

通俗解析:霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器的实战选型指南

本文深入解析了霍尔编码器、光电编码器、电位计、磁编码器和旋转变压器五大主流编码器的工作原理与核心特性。通过对比精度、环境耐受性、成本及寿命等关键维度,并结合消费电子、工业自动化、汽车电子及极端环境等典型应用场景,提供了一份清晰的实战选型指南,旨在帮助工程师根据具体需求,在性能、可靠性与成本间做出最优决策。

weixin_29216353的博客 254

安卓新奇玩机工具全攻略___联发科MTK v6 限时免费 刷写固件工具操作

摘要:该文介绍一款限时免费的联发科V6刷机工具,支持小米、Vivo、Moto等多品牌设备,包括红米Note14Pro等机型(Klimt/Goya等代码)。工具需注册使用,提供EFS分区备份功能。作者提示工具可能触发杀毒警报,强调禁止非法用途,并说明部分联网工具可能失效。

小马哥的专栏 1322

QT如何使用CTK插件搭建应用程序框架?

CTK框架,QT框架,插件系统

cs821984831的博客 736

【DEIM创新改进】全网首发、独家特征融合创新改进篇 | CVPR2025 | 引入RLAB残差线性注意力特征融合块,有效融合并强调多尺度特征,有效减少信息丢失,助力DEIM目标检测有效涨点

本文提出了一种改进DEIM网络模型的新方法RLAB(残差线性注意力特征融合模块),用于医学图像生物标志物分割。RLAB模块通过多尺度残差精炼和注意力机制,有效整合编码器跳跃连接与解码器特征图,提升特征对齐和关键区域关注能力。实验表明,该方法在MoNuSeg、DSB等四个医学图像数据集上显著优于现有方法,最高提升4.03%的绝对性能。文章详细介绍了RLAB的网络结构、核心代码实现方式,并提供了将模块集成到DEIM模型的具体步骤。

Ai缝合怪、助力小伙伴高效发论文 349

深度学习论文: Towards Total Recall in Industrial Anomaly Detection

在大规模工业制造中,能够准确检测出有缺陷的零件至关重要。我们在这项工作中面临的一个特殊挑战是冷启动问题:仅使用正常的示例图像来训练模型。虽然可以针对每个类别手动设计解决方案,但我们的目标是构建能够自动适用于多个任务的系统。最佳的方法是将ImageNet模型的嵌入特征与异常检测模型结合起来。在本文中,我们在这一研究基础上进行了扩展,并提出了PatchCore,它利用了一个具有最大代表性的正常补丁特征内存库。通过这种方法,我们能够更好地解决冷启动问题,并提高系统在多任务上的性能。

mingo_敏 1880

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: LLVM系列(一)致敬
下一篇: LLVM系列(三)小插曲---Clang的常用命令
develop_csdn_LGQ
博客等级 码龄10年 21粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值