
一直耳闻LLVM相比于GCC:
- well documented
- 架构灵活,前后端解耦符合龙书的讲解
昨天读到了一篇虽然概括却很周到的llvm入门导引
陈钦霖:LLVM Pass入门导引zhuanlan.zhihu.com就沿着其中的提示探索了下LLVM源码,倒也没有想要成为专业的compiler开发,不过希望能给C++的学习提供一些更直观的认识,所以本文是一篇LLVM源码的学习笔记
环境准备,包括源码,官方文档都在导引中说清楚了,不赘述
接收命令行参数到不同Action
代码规模比较庞大,下面这篇
LLVM代码研读(2) --- LLVM前端: Clang剖析blog.csdn.net
说的还是很清楚的,大概用了两三个小时对照着源码搞了个大概。这部分主要作用如本节标题所说,是接收命令行参数如 clang -cc1 helloworld.cpp
后从参数提取,到Action的执行的过程。如果时间比较紧迫,下面的回答
也把这个流程涉及的函数调用快速过了一遍,然后就到了preprocessor
其实这块还是有点困惑的地方,上面的回答指出默认的Action是SyntaxOnlyAction(),但是从这个函数的调用没有找到直接是如何进行预处理的,倒是在其他的Action的Execute()中有些涉及了PP->Lex(),所以打了个马虎眼,直接跳到了预处理==,如果有时间,或者好心的大佬可以指点下就好啦
关于前端的概览
这块看到了一个不错的讨论,问题、回答以及提供的资料资源都很棒
GCC/Clang lexer and parserstackoverflow.comC/C++的lexer和parser是如何协同工作,parser会lookahead至少一个token,所以可有如下两种方案:lexer运行整个文件,再让parser生成AST;或是生成了一小部分用于parser来完成相应工作,这意味着两者交替运行。前者考虑是源于C++是任意lookahead的,因为语法并非上下文无关,但这也许会消耗相当多的内存。
实际情况比较接近后者,但也并不完全这样,因为典型情况下lexer和parser都用相对简单的状态机实现的,lexing过程由如下两个条件驱动外部索取一个新token
或一个新的字符到来
,而parser状态机由如下两个条件驱动 :索取一个parse
或来了一个新的token
这两个方向分别对应top-down, bottom-up的实现,传统方案来说后者居多,以构造AST为中心
preprocessor与lexer
源码目录结构、类设计的手册如下,其中较全面介绍了clang前端主要类的功能
“Clang” CFE Internals Manualclang.llvm.org[今日学习内容较琐碎,待整理下再续..]