前言
本系列文章将通过拆解clang源码逐步介绍clang内部的各种逻辑。
我们对 clang 的误解
我们经常说给clang添加一个***参数,这些说法都非常模糊编译clang源码,往往会导致欺骗。
在不同的场景下,clang可能有不同的含义:
clangdriver:编译器驱动,负责根据简单的参数生成越来越复杂的参数编译器后端(在clang库中实现):指编译器生成中间代码(预处理器和编译器)的过程实际编译器(在clang-cc1中实现): clang-cc1通过LLVM库等工具实现编译后端、后端、汇编等工作
以下面的原命令为例:
xcrun --sdk iphoneos clang -arch arm64 main.m -v
复制
clang会先以clangdriver模式运行,然后组装clang-cc1和ld两个命令行,进行下一步
图像
注意:clangdriver本身不负责编译源码
为了方便前面源码的分析,下面介绍一些其他必要的基础知识
确诊
不同的后端阶段有不同类型的诊断信息。
例如clang/include/clang/Basic/DiagnosticDriverKinds.td维护了Driver相关的诊断信息
图像
然而,Clang 根据问题的严重程度对诊断进行分类
clang/lib/Basic/DiagnosticIDs.h 文件维护了五种类型:NOTE、REMARK、WARNING、EXTENSION、ERROR
图像
llvm:三重
llvm:Triple是llvm工具套件中非常基本的概念,而且非常容易理解。
以aarch64-apple-ios11.1为例,通过这个字符串我们可以得到以下信息
图像
不同参数对三元组的影响
许多命令行参数可能会影响 Triple 的生成。 例如-archarm64、-target-targetarm64-apple-ios11.1等。在拼写clang命令时编译clang源码,需要注意不同参数的优先级。 例如,-arch 的架构优先级低于 -target 下面的示例显示最终输出文件不包含 -target 的 x86_64 架构
图像
图像
工具链
ToolChain可以理解为编译工具链; GNU的MinGW和Google的MSVC都属于该工具链。
例如,当我们需要在mac系统上生成一个运行在iPhone中的APP时,我们会依赖/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld来进行链接任务
图像
本文摘要
本文主要介绍以下知识: