前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >clang 源码导读(1): clang 入门

clang 源码导读(1): clang 入门

作者头像
酷酷的哀殿
发布2021-03-18 09:49:05
4.6K0
发布2021-03-18 09:49:05
举报
文章被收录于专栏:酷酷的哀殿酷酷的哀殿

前言

本系列文章会通过对 clang 源码进行拆解的方式,逐步对 clang 内部的各种逻辑进行介绍。

我们对 clang 的误解

我们经常会说给 clang 加个 *** 参数,但是这种说法非常模糊,经常会产生误导。

在不同的场景下,clang 可能具有不同的含义:

  1. clang driver:编译器驱动程序,负责根据简单的参数生成更加负杂的参数
  2. 编译器前端(在 clang 库实现):专指编译器生成中间代码的过程(preprocessorcompiler
  3. 实际的编译器(在 clang -cc1 中实现):clang -cc1 通过 LLVM 库和其它工具实现了编译前端、后端、汇编等工作

以下面的原始命令为例:

代码语言:javascript
复制
xcrun --sdk iphoneos clang -arch arm64  main.m -v

clang 先会以 clang driver 模式运行,随后组装 clang -cc1ld 两个命令行,并进行下一步处理

image

注意:clang driver 自身不负责对源码进行编译


为了方便对后面的源码进行分析,我们下面再介绍一些其它必要的基础知识

诊断

不同的前端阶段具有不同种类的诊断信息。

比如,clang/include/clang/Basic/DiagnosticDriverKinds.td 维护了 Driver 相关的诊断信息

image

并且,Clang 根据问题的严重性对诊断进行了分类

clang/lib/Basic/DiagnosticIDs.h 文件维护了五种类型:NOTE、REMARK、WARNING、EXTENSION、ERROR

image

llvm:Triple

llvm:Triplellvm 整套工具一个非常基础的概念,并且非常容易理解。

aarch64-apple-ios11.1 为例,我们可以通过该字符串得到以下信息

  • cpu 架构是 arm64
  • cpu 子架构是 armv8
  • 厂家是 Apple
  • 编译任务产出的目标系统是 iOS
  • 产出的对象文件格式是MachO (通过 OS 推导得到)

image

不同参数对 triple 的影响

很多命令行参数都可能影响 Triple 的生成,比如 -arch arm64-target -target arm64-apple-ios11.1 等 拼写 clang 命令时,需要注意不同参数的优先级,比如,-arch 对架构的优先级高于 -target下面的示例显示最后产出的文件不包含 -targetx86_64 架构

image

image

ToolChain

ToolChain 可以理解为 编译工具链;GNU 的 MinGW,微软的 MSVC 都属于工具链。

举个例子,当我们需要在 mac 系统上生成一个运行在 iPhone 上面的 APP 时,就会依赖 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld 进行链接任务

image

本文总结

本文主要对以下知识进行了介绍:

  • 不同场景下,clang 的含义
  • 三个基础知识点:诊断、llvm:TripleToolChain
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-03-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 酷酷的哀殿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 我们对 clang 的误解
  • 诊断
  • llvm:Triple
    • 不同参数对 triple 的影响
    • ToolChain
    • 本文总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档