Clang 编译器阶段

Posted

技术标签:

【中文标题】Clang 编译器阶段【英文标题】:Clang compiler stages 【发布时间】:2016-07-19 09:52:13 【问题描述】:

Clang Compiler 是基于 LLVM 基础架构构建的,Clang 前端获取 C/C++ 源代码并生成 LLVM-IR,使用 Optimizer 和代码生成的工作由谁来完成?

既然要策略性地放置和调用优化器传递库以生成优化代码,那么指定的顺序在哪里,还有谁生成目标代码?这是 Clang 前端程序的一部分,还是有其他程序可以进行这种优化和生成?

【问题讨论】:

【参考方案1】:

实际上有两个clangs,可以这么说。

一个是前端:它只是进行解析、构建抽象语法树 (AST) 并应用各种语义检查。它还可以做一些静态分析和其他有用的事情。可以使用-cc1 选项访问前端,例如:clang -cc1 -ast-dump

第二个是驱动程序:它从前端获取 AST 并发出 LLVM IR,同时应用一些优化,然后制作所有其他魔法,例如构建目标文件和将各种组件链接在一起。这是调用clang main.c 或类似命令时通常会发生的情况。

请考虑查看两个 clang 提供的帮助:

clang -help
clang -help-hidden
clang -cc1 -help
clang -cc1 -help-hidden

【讨论】:

预处理器是前端阶段的一部分吗? @osgx 是的,与 AST 相关的一切都是前端阶段的一部分。 驱动程序从前端获取 AST。它也不发射红外线。所有这些都是在 clang -cc1 中完成的。驱动程序只是“规范化”各种选项、路径并处理调用工具作为链接器。 AFAIS main 可以转到 cc1_main 或运行 Drivercc1_main 所做的一切只是处理一个动作,即FrontendAction,而驱动程序创建多个动作,例如PrecompileJobActionCompileJobActionBackendJobActionAssembleJobActionLinkJobAction 等。我明白我的回答并不准确,但目的是提供更高级的概述,而不是深入了解具体的实施细节。 @AntonKorobeynikov 如果您能提供更详细的回复,我将不胜感激。

以上是关于Clang 编译器阶段的主要内容,如果未能解决你的问题,请参考以下文章

如何调试 dsymutil 错误:“Clang 模块预计只有 1 个编译单元。”

iOS学习使用 Xcode 开发 Clang 插件

在Windows使用clang编译器

iOS面试:编译原理

了解-clang编译过程

clang编译器不能找到stdio.h