【问题标题】:Clang Launch Sequence?Clang 启动顺序?
【发布时间】:2014-12-04 22:40:55
【问题描述】:

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

【问题讨论】:

  • 如果这是平台和/或 IDE 相关的,那么我在 OS X 10.10 Yosemite 和 Xcode 6.1.1 的上下文中提出这个问题。

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


【解决方案1】:

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


编译阶段:

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

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 运行时作为参数传递给它:

差不多就是这样;只需设置一个断点(在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

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2016-09-03
    • 2016-03-20
    相关资源
    最近更新 更多