Clang发射序列?

时间:2014-12-04 22:40:55

标签: compiler-construction osx-yosemite xcode6.1 llvm-clang

在将源代码传递给Clang进行编译时,以什么顺序执行哪些LLVM / Clang代码?

1 个答案:

答案 0 :(得分:2)

你到底是什么意思?您是否对编译阶段感兴趣,或者您是否希望查看特定方法或类的堆栈跟踪?


编译阶段:

假设您通过在终端中键入clang将一些源文件传递给clang main.c

clang命令本身只是一个使用参数并调用实际编译器的驱动程序(您可以通过传递clang -cc1参数直接调用它。

然后,编译器本身执行以下任务:

  • 调用预处理器来处理所有宏定义(#define#ifdef等)。
  • 将所有源代码分解为令牌(if关键字,while关键字,your_var标识符等。)
  • 将标记传递给解析器,解析器构造Abstract Syntax Tree并应用语义分析,但到位(例如:检查赋值表达式是否具有正确的左值和右值类型)
  • 当生成AST时,'CodeGen'阶段开始发挥作用:它将解析器传递给它的AST转换为LLVM Intermediate Representation
  • 此处,前端阶段结束,最终出现LLVM:它采用LLVM IR,应用优化并为最终用户平台生成汇编代码或目标文件(例如:x86_64,arm64)

<强>堆栈跟踪:

如果你想看看堆栈跟踪或调试报告,那么自己构建Clang是有意义的。

以下是在通过Git将LLVM存储库克隆到硬盘驱动器后使用Xcode在OS X上编译LLVM / Clang的说明:

首先,下载LLVM的源文件:

mkdir ~/Projects/clang-dev
cd ~/Projects/clang-dev
git clone http://llvm.org/git/llvm.git
git clone http://llvm.org/git/clang.git llvm/tools/clang
git clone http://llvm.org/git/clang-tools-extra.git llvm/tools/clang/tools/extra
git clone http://llvm.org/git/compiler-rt.git llvm/projects/compiler-rt

您还可以通过将分支名称传递给每个克隆命令来指定确切的版本,例如: git clone http://llvm.org/git/llvm.git -b release_34

接下来,创建并打开一个Xcode项目:

cd ~/Projects/clang-dev
mkdir build
cd build
cmake -G Xcode CMAKE_BUILD_TYPE="Debug" ../llvm
open LLVM.xcodeproj

clang设置为项目的当前目标/方案,单击“编辑方案”,并在运行时添加要作为参数传递给Clang的源文件:

Edit scheme

这就是它;只需设置断点(使用main方法或随时),然后点击Run按钮(或按Cmd + R)。

<强> UPD

以下是更详细的指南:Getting started with LLVM/Clang on OS X


有用的链接:

Architecture of Open-Source Applications: LLVM by Chris Lattner

objc.io: The Compiler by Chris Eidhof