【发布时间】:2016-07-19 09:52:13
【问题描述】:
Clang Compiler 是基于 LLVM 基础架构构建的,Clang 前端获取 C/C++ 源代码并生成 LLVM-IR,使用 Optimizer 和代码生成的工作由谁来完成?
既然要策略性地放置和调用优化器传递库以生成优化代码,那么指定的顺序在哪里,还有谁生成目标代码?这是 Clang 前端程序的一部分,还是有其他程序可以进行这种优化和生成?
【问题讨论】:
Clang Compiler 是基于 LLVM 基础架构构建的,Clang 前端获取 C/C++ 源代码并生成 LLVM-IR,使用 Optimizer 和代码生成的工作由谁来完成?
既然要策略性地放置和调用优化器传递库以生成优化代码,那么指定的顺序在哪里,还有谁生成目标代码?这是 Clang 前端程序的一部分,还是有其他程序可以进行这种优化和生成?
【问题讨论】:
实际上有两个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
【讨论】:
main 可以转到 cc1_main 或运行 Driver。 cc1_main 所做的一切只是处理一个动作,即FrontendAction,而驱动程序创建多个动作,例如PrecompileJobAction、CompileJobAction、BackendJobAction、AssembleJobAction、LinkJobAction 等。我明白我的回答并不准确,但目的是提供更高级的概述,而不是深入了解具体的实施细节。 @AntonKorobeynikov 如果您能提供更详细的回复,我将不胜感激。