clang常用语法介绍

前言

clang提供了一些命令,让我们可以对编译的过程进行一些配置和查看,下面我们就对一些常用的指令进行一个基本的介绍.

常用指令

  • 查看编译的步骤
    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
  • 查看编译结果 : clang -rewrite-objc main.m

  • 查看操作内部命令,可以使用 -### 命令

clang -### main.m -o main

  • 想看清clang的全部过程,可以先通过-E查看clang在预编译处理这步做了什么。

clang -E main.m

clang基本语法介绍

针对下面会用到的语法进行分析

  • -fmodules
    允许modules的语言特性

  • -fsyntax-only
    防止编译器生成代码,只是语法级别的说明和修改

  • -Xclang <arg>
    clang编译器传递参数

  • -dump-tokens
    运行预处理器,拆分内部代码段为各种token

  • -ast-dump
    构建抽象语法树AST,然后对其进行拆解和调试

  • -S
    只运行预处理和编译步骤

  • -fobjc-arc
    为OC对象生成retainrelease的调用

  • -emit-llvm
    使用LLVM描述汇编和对象文件

  • -o <file>
    输出到目标文件

  • -c
    只运行预处理,编译和汇编步骤

其余的就不多赘述了, 查看更多的clang使用方法可以在终端输入clang --hep查看,也可以点击如下链接: clang options

代码编译的执行步骤拆解

下面我们对iOS代码编译的步骤进行一个简单的拆解,看看内部是如何实现的.

预处理完成后就会进行词法分析,这里会把代码切成一个个 Token,比如大小括号,等于号还有字符串等。
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m

然后是语法分析,验证语法是否正确,然后将所有节点组成抽象语法树 AST 。
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

完成这些步骤后就可以开始IR(intermediate representation)中间代码的生成了,CodeGen 会负责将语法树自顶向下遍历逐步翻译成 LLVM IR,IR 是编译过程的前端的输出后端的输入。
clang -S -fobjc-arc -emit-llvm main.m -o main.ll

这里 LLVM 会去做些优化工作,在 Xcode 的编译设置里也可以设置优化级别-01,-03,-0s,还可以写些自己的 Pass,官方有比较完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation
clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll

Pass 是 LLVM 优化工作的一个节点,一个节点做些事,一起加起来就构成了 LLVM 完整的优化和转化。
如果开启了 bitcode 苹果会做进一步的优化,有新的后端架构还是可以用这份优化过的 bitcode 去生成。
clang -emit-llvm -c main.m -o main.bc

生成汇编
clang -S -fobjc-arc main.m -o main.s

生成目标文件
clang -fmodules -c main.m -o main.o

生成可执行文件,这样就能够执行看到输出结果

clang main.o -o main
执行./main
输出starming rank 14
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 2000年,伊利诺伊大学厄巴纳-香槟分校(University of Illinois at Urbana-...
    星光社的戴铭阅读 16,105评论 8 180
  • 编译器做些什么? 本文主要探讨一下编译器主要做些什么,以及如何有效的利用编译器。 简单的说,编译器有两个职责:把 ...
    评评分分阅读 1,180评论 1 5
  • LLVM 简介 LLVM 全称是 Low Level Virtual Machine,它是源自 the Unive...
    juniway阅读 38,579评论 0 21
  • LLVM是Low Level Virtual Machine的简称。这个库提供了与编译器相关的支持,能够进行程序语...
    小猫仔阅读 16,716评论 0 9
  • 我没有很想你 只是常常看错背影 即使离得很近 江南的夜太短雨太急 除了做梦就是天明 没时间回忆 没时间后悔莫及 昨...
    安静的复苏918阅读 127评论 2 5