
Clang
Clang是LLVM(Low Level Virtual Machine)项目提供的工具链中的编译器的前端部分
LLVM项目是模块化和可重用的编译器和工具链技术的集合,LLVM的一大特色就是,有着独立的、完善的、严格约束的中间代码表示。这种中间代码,就是LLVM的字节码,是LLVM抽象的精髓,前端生成这种中间代码,后端自动进行各类优化分析,让用LLVM开发的编译器,都能用上最先进的后端优化技术。
编译器编译流程如下

来自《编译原理》
编译器分成前端与后端两部分
前端负责处理源代码,后端负责生成目标代码

来自参考链接3
环境
macOS Hign Sierra 10.13.6
Xcode10.1
编译
获取llvm源代码
1 | % git clone https://git.llvm.org/git/llvm.git/ |
获取Clang源代码
1 | % cd llvm/tools |
获取compiler-rt源代码
1 | ## 定位到llvm工程目录下 |
获取libomp源代码
1 | % cd llvm |
获取libcxx和libcxxabi源代码
1 | % cd llvm |
获取测试用例
1 | % cd llvm |
Clang 使用CMake(一个用于构建,测试和打包软件的开源跨平台工具系列)进行构建
1 | # LLVM 禁止源码内编译(in-tree build is not supported),创建一个与llvm工程同级的build目录 |
替换Clang
1 | ## 查看系统的Clang的位置 |
根据参考链接7
新建Xcode工程

创建用户自定义配置CC,并设置DEBUG时的值为编译完成后Clang二进制的位置。

⌘ B 编译,查看编译输出的日志,证明已经使用了编译的Clang

错误原因:
1 | Unknown argument: '-index-store-path' |
根据参考链接10,在Build Setting 中搜索index并将Enable Index-While-Building Functionality选项设置为NO

⌘ B
错误原因:
1 | fatal error: error in backend: No available targets are compatible with triple "arm64-apple-ios9.0.0" |
分析: 因为该手机架构是arm64而cmake编译时指定的是 -DLLVM_TARGETS_TO_BUILD="host;AMDGPU",并没有对应的架构
cmake $LLVM_SRC_DIR -DCMAKE_BUILD_TYPE=Release
-DLLVM_TARGETS_TO_BUILD=”ARM;X86;AArch64”
操作
1 | ## 重新编译 |
⌘ B 成功

代码
参考
- llvm.org
- 结构化编译器前端 Clang 介绍
- 编译器架构的王者LLVM
- cmake.org
- wiki-XcodeVersionInfo
- 下载标准库libcxx出现svn: E000104: Error running context: Connection reset by peer的解决方案
- 安装 LLVM + Clang
- 如何让Xcode使用clang的替代版本
- Why can’t I create a directory under /opt without sudo
- compilation-error-when-using-xcode-9-0-with-clang-cannot-specify-o-when-genera