深入研究Clang
文章平均质量分 72
Clang不管是作为一个编译器,还是作为一个编译器前端来说,都取得了很大的成就。目前Clang也在不断的扩大它在编译器中所占的份额,越来越多的公司和产品不断的选择Clang。作为一个开源的编译器,我们想到的不应该只是如何使用它,应该更多的去深入了解它,甚至为它的成长作贡献。
snsn1984
专注技术,专注管理。
展开
-
深入研究Clang(十九) Clang的RISCV支持2
前文Clang的RISCV支持1介绍了Clang中有关RISCV的代码主要集中在三个地方:Driver部分、Basic部分和CodeGen部分,并且对Basic部分和CodeGen部分的内容和关系进行了介绍,只有Driver部分因为涉及到了ToolChain、Tool和Command(job)等概念体系而未进行深入介绍。在介绍完ToolChain、Tool和Command(job)等概念和调用关系之后,我们在本文再对Clang的RISCV支持的Driver部分进行深入分析。一、Driver部分涉及到原创 2020-05-21 10:48:03 · 938 阅读 · 0 评论 -
深入研究Clang(十八) Clang Driver库的job
Clang的Tool最终会调用ConstructJob来为Compilation添加job。根据源码中的注释,Tool中保存的是一个特定编译工具的信息(Tool - Information on a specific compilation tool.,clang/include/clang/Driver/Tool.h)。而job则是通过Command类去进行具体实现,同时还有一个相关类JobList。本文将分析Command和JobList的实现,以及其相关的调用关系。一、Command和JobLis原创 2020-05-21 10:46:32 · 610 阅读 · 0 评论 -
深入研究Clang(十七) Clang Driver库的Tool
Tool也是Clang的Driver库里的一个类,它是具体编译工具的信息,代码注释中的原文是:Tool - Information on a specific compilation tool.(clang/include/clang/Driver/Tool.h)本文将对Tool的实现以及其相关调用关系做一个简单的分析。一、Tool的实现和继承关系1、Tool的定义和实现都位于clang/include/clang/Driver/Tool.h和clang/lib/Driver/Tool.cpp之中。原创 2020-05-21 10:44:28 · 728 阅读 · 0 评论 -
深入研究Clang(十六) Clang Driver库的ToolChain
ToolChain是Clang的Driver库里的一个类,它是用来获取具体某个平台的工具集合,代码注释中的原文是:ToolChain - Access to tools for a single platform.(clang/include/clang/Driver/ToolChain.h)这里涉及到的Tool也是Clang的Driver库里的一个类,它是具体编译工具的信息,代码注释中的原文是:Tool - Information on a specific compilation tool.(clang原创 2020-05-21 10:42:40 · 1155 阅读 · 0 评论 -
深入研究Clang(十五) Clang的RISCV支持1
一、Clang/LLVM对RISCV的支持概况目前已经有一系列的C类编译器和库开始支持RISCV,这其中包括了GCC和Clang/LLVM。从RISCV的官方网站,可以获取目前的支持状态。具体内容如下:网址:https://riscv.org/software-status/#c-compilers-and-libraries该列表中还包含了所支持的License和Maintainers。其中,Clang/LLVM的Maintainers是Alex Bradbury,这位大神是LLVMWEE原创 2020-05-21 10:39:01 · 1704 阅读 · 2 评论 -
深入研究Clang(十四) clang-tidy的使用
前文对clang-tidy进行了简单的介绍,本文对clang-tidy使用中的一些点进行一下总结。1、clang-tidy及其批量运行脚本run-clang-tidy.py在Clang/LLVM的预编译发布包中都有,但是位于不同的目录。其中,clang-tidy位于:发布包主目录/bin目录之下;run-clang-tidy.py位于:发布包主目录/shared/clang/目录之下。例如...原创 2020-02-08 11:49:15 · 7765 阅读 · 1 评论 -
深入研究Clang(十三) clang-tidy简介
最近几天在关注clang-tidy,有一些体会,简单做一些笔记。分享给感兴趣的朋友们,也是给将来的自己看。1、clang-tidy是基于AST的静态检查工具。因为它基于AST,所以要比基于正则表达式的静态检查工具更为精准,但是带来的缺点就是要比基于正则表达式的静态检查工具慢一点。也是因为它基于AST,所以clang-tidy运行的时候需要知道编译命令。2、clang-tidy不仅仅可以做静...原创 2020-01-11 12:03:21 · 4796 阅读 · 0 评论 -
深入研究Clang(十二) 可以观察Clang前端分析阶段性产物的几个命令
Clang作为整个LLVM框架下关于C、C++和Object-C的前端。其大致环节分为词法分析、预处理、语法分析、语义分析、中间代码生成几个环节。我们在阅读和修改Clang的代码的过程中,需要经常的调试代码,观察改动所带来的各个阶段所发生的改变,这就需要时刻了解各个阶段的输出。要了解各个阶段的输出,目前常用有两种方法:1、最朴实最实用但是效率不一定是最高的办法,那就是打log。这是毋庸置疑的。2、...原创 2018-07-12 13:56:13 · 2714 阅读 · 0 评论 -
深入研究Clang(十一) 使用libclang遍历AST
之前在本系列的第三篇(深入研究Clang(三) libclang)介绍过libclang,内容相对简单,也没有实际的代码举例。其实,在看libclang的时候,我自己动手写了一个小工具:screader,想取名source code reader的意思。 screader放在了github上很长一段时间了,我一直以为这个资源已经在写第三篇(深入研究Clang(三) libclang)...原创 2018-05-13 10:55:34 · 9383 阅读 · 2 评论 -
深入研究Clang(十) Clang Static Analyzer简介
Clang Static Analyzer 官网地址:http://clang-analyzer.llvm.org/Clang Static Analyer是一个源码分析工具,它可以发现C、C++和Objective-C程序中的bug。现在Clang Static Analyer既可以作为一个单独的工具使用,也可以集成在Xcode中使用。作为单独的工具使用的时候,可以通过命令行调用,作为一个代码库原创 2017-03-29 16:27:49 · 8549 阅读 · 1 评论 -
深入研究Clang(九) Clang代码阅读之打log读流程2
继续上一篇,同样的hello.c,同样的执行过程,只不过继续添加了一些log信息,而且对代码进行了更近一步的挖掘。先看输入和输出的log信息(前半部分):shining@shining-VirtualBox:~/llvm-3.9.0/build/bin$ ./clang hello.c -o helloclang/tools/driver/driver.cpp/main()_begin/shin原创 2017-01-05 11:42:00 · 3334 阅读 · 0 评论 -
深入研究Clang(八) Clang代码阅读之打log读流程1
#includeint main() { printf("Hello world!\n");}#include "llvm/Support/raw_ostream.h" llvm::errs() //shining add begin#include "llvm/Support/raw_ostream.h"//shining add end //shining add begin ll原创 2016-12-16 16:30:48 · 2902 阅读 · 0 评论 -
深入研究Clang(七) Clang Lexer代码阅读笔记之Lexer
作者:史宁宁(snsn1984)源码位置:clang/lib/Lexer.cpp源码网络地址:http://clang.llvm.org/doxygen/Lexer_8cpp_source.htmlLexer.cpp这个文件,是Clang这个前端的词法分析器的主要文件,它的内容是对Lexer这个类的具体实现,原文件的注释中:“This file implements the Lexer and T原创 2016-08-10 17:10:50 · 5404 阅读 · 9 评论 -
深入研究Clang(六) Clang Lexer代码阅读笔记之Preprocesser
clang/include/clang/Lex/Preprocesser.h这个文件是包含clang::Preprocesser类的定义的头文件。它是类C语言(C、C++、Object C)的预处理的头文件。也就是说,类C语言的预处理都会用到此处的代码。00082 /// \brief Context in which macro name is used.00083 enum MacroUse原创 2014-12-01 17:12:57 · 5021 阅读 · 0 评论 -
深入研究Clang(五) Clang Lexer代码阅读笔记之Lexer
作者:史宁宁(snsn1984)Clang的Lexer(词法分析器)的源码的主要位置如下:clang/lib/Lex 这里是主要的Lexer的代码;clang/include/clang/Lex 这里是Lexer的头文件代码的位置;同时,Lexer还使用了clangBasic库,所以要分析Lexer的代码,clangBasic(clang/lib/Basic)的一些代码也会用到。首先从L原创 2014-11-20 14:53:55 · 7011 阅读 · 4 评论 -
深入研究Clang(四) Clang编译器的简单分析
首先我们确定下Clang编译器的具体内容和涵盖范围。之前在《LLVM每日谈之二十 Everything && Clang driver 》中曾经提到过,Clang driver(命令行表示是clang)和Clang前端(按照具体实现来说就是Clang的那些库所实现的前端)是不同的,同时还存在一个Clang编译器(命令行表示是clang -cc1)。Clang编译器不仅仅包含了Clan原创 2014-11-13 14:53:59 · 24070 阅读 · 14 评论 -
深入研究Clang(三) libclang
libclang是一个提供了C接口的一个库,它让你可以轻松的把clang作为一个库去使用,这样的做法带来了很多的有点,且看本文的一点小论。原创 2014-05-15 14:22:27 · 16590 阅读 · 3 评论 -
深入研究Clang(二)Abstract Syntax Tree
AST,抽象语法树,这是编译理论中的基础知识,是深入学习任何编译器所无法逾越的一个坎,所以必须要对它熟悉。本文列出了需要学习的两个文档,并且对AST进行了简单的介绍和总结。原创 2014-01-07 16:01:11 · 10578 阅读 · 2 评论 -
深入研究Clang(一)Clang和LLVM的关系及整体架构
Clang是LLVM框架中的重要前端,深入理解Clang,首先要搞清楚的是它和LLVM的关系,之后要搞清楚的是它的架构。只有这两个问题搞清楚了,才可以真正的深入下去。原创 2013-12-31 15:53:19 · 41823 阅读 · 4 评论