深入研究Clang(八) Clang代码阅读之打log读流程1

这个过程简单的分为几步。

第一步:写一个简单的小程序,hello.c。内容如下:

#include<stdio.h>

int main() {
  printf("Hello world!\n");
}

第二步:找出如何在LLVM里面输出信息,最后选择采用llvm::errs(),等于采用了LLVM的错误机制。包括llvm::errs()所需的头文件。具体内容如下:

//shining add begin
#include "llvm/Support/raw_ostream.h"
//shining add end

  //shining add begin
  llvm::errs() << "clang/tools/driver/driver.cpp/main()/shining_add" << '\n';

  //shining add end

注:为了标明代码是我自己添加的,所以在添加的log信息前后都加了注释。

第三步:采用clang3.9.0代码,在我知道的几个点随意添加了几个log信息,信息内容如上一步所示,主要是标明插入log的函数的相关信息,都放在了函数的第一条语句处。编译该clang之后,使用命令clang hello.c -o hello编译hello.c,可以得到如下输出信息:

clang/tools/driver/driver.cpp/main()/shining_add

clang/tools/driver/driver.cpp/main()/shining_add
clang/tools/driver/cc1_main.cpp/cc1_main()/shining_add
clang/lib/CodeGen/CodeGenAction.cpp/CodeGenAction::ExecuteAction()/shining_add
clang/lib/Sema/Sema.cpp/Sema::Sema()/shining_add
clang/lib/Parse/ParseAST.cpp/ParseAST(Sema)/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
基本上我所插入的log信息都打印出来了,这里可以看到clang编译一个简单的程序,所经历的大的点。后续会在此基础之上,再分块进行分析代码和流程。开这么个头,方便自己,也为想读clang源码的朋友们提供一个思路。这个思路简单易行,根据我提供的几个点,也可以继续深入去分析自己感兴趣的地方。

代码和修改后的代码,我也建了一个代码库,地址:https://github.com/shining1984/clang_code_comment

时间: 2025-01-01 15:32:43

深入研究Clang(八) Clang代码阅读之打log读流程1的相关文章

深入研究Clang(九) Clang代码阅读之打log读流程2

继续上一篇,同样的hello.c,同样的执行过程,只不过继续添加了一些log信息,而且对代码进行了更近一步的挖掘.先看输入和输出的log信息(前半部分): shining@shining-VirtualBox:~/llvm-3.9.0/build/bin$ ./clang hello.c -o hello clang/tools/driver/driver.cpp/main()_begin/shining_add clang/lib/Driver/Driver.cpp/BuildCompilat

深入研究Clang(五) Clang Lexer代码阅读笔记之Lexer

作者:史宁宁(snsn1984) Clang的Lexer(词法分析器)的源码的主要位置如下: clang/lib/Lex    这里是主要的Lexer的代码: clang/include/clang/Lex   这里是Lexer的头文件代码的位置: 同时,Lexer还使用了clangBasic库,所以要分析Lexer的代码,clangBasic(clang/lib/Basic)的一些代码也会用到. 首先从Lexer入手. clang/include/clang/Lex/Lexer.hclang:

深入研究Clang(六) Clang Lexer代码阅读笔记之Preprocesser

作者:史宁宁(snsn1984) 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 { 00084 MU_Other = 0, // other

x265探索与研究(八):x265中的并行处理机制函数关系分析

x265探索与研究(八):x265中的并行处理机制函数关系分析           HEVC的高计算复杂度如果仅仅依赖于单核处理器计算能力的提高,其代价是非常昂贵的,为此,HEVC的设计充分考虑到了并行计算的需求.x265不同于HM(HEVC test Model),x265将并行计算发挥地更加淋淋尽致.在main()函数中,为了完成多线程计算,读完24帧输入帧后才开始编码的原因也基于此.           为了理清x265中的并行处理机制,首先给出了如下图的并行处理函数关系图:      

Kryo简介及代码阅读笔记

更新:2012-08-01 版本 2.16长时间运行可能会导致OOM,版本2.18有bug,不能正确序列化map和collection. 真是悲剧,所用的每一个版本都有bug.不过从代码来看,作者有时的确比较随便..测试用例也少..(比起msgpack少多了) ======================================== Kryo官方网站:https://code.google.com/p/kryo/ 优点:     速度快!见https://github.com/eisha

摘自《代码阅读方法与实践》

第一章:导论要养成一个习惯,经常花时间阅读别人编写的高品质代码.要有选择地阅读代码,同时,还要有自己的目标.您是想学习新的模式.编码风格.还是满足某些需求的方法?要注意并重视代码中特殊的非功能性需求,这些需求也许会导致特定的实现风格.在现有的代码上工作时,请与作者或维护人员进行必须的协调,以避免重复劳动或因此而产生厌恶情绪.请将从开放源码软件中得到的益处看作是一项贷款,尽可能地寻找各种方式来回报开放源码社团.多数情况下,如果您想要了解"别人会如何完成这个功能呢?",除了阅读代码以外,没

代码阅读总结之ASP.NET StartKit Commerce

ASP.NET StartKit Commerce简单,容易理解. 我认为是初次学习.NET代码的首选,不怕各位笑话,我曾经完整阅读该项目代码3次. 那么,通过阅读我们能学习到什么知识呢?请看我下面的总结: 1.多层结构的实现 依我见是2层结构:PL层和BLL层(没有明显的DAL层,DAL和BLL共同组成BLL层).但是我们可以学习到Db过程的调用方法. 2.Web服务的简单使用 3.Web用户控件的使用 4.数据绑定的相关知识 让我们先看该项目中的一段代码: <asp:HyperLink cs

一步步教你配置SQL SERVER合并复制(八)代码部分

一步步教你配置SQL SERVER合并复制(八)代码部分(使用.NET CompactFramework) 这个系列的翻译也拖了一段时间,现在决定一次性将它理清了.关于合并复制服务器的配置在前面的翻译文章中都已经详细地论述完了,现在终于到了订阅者是如何使用我们配制好的合并复制了.下面的代码是针对.NET CompactFramework的,其实整个合并复制的过程中,安装和配置占了95%的时间,而创建订阅仅仅需要5%的时间,合并复制的这个特征减小了我们敲代码时出现错误的几率,将更多地工作移植到了服

FFMpeg框架代码阅读

FFMpeg框架代码阅读 内容摘要:FFmpeg是一个集录制.转换.音/视频编码解码功能为一体的完整的开源解决方案.FFmpeg的开发是基于Linux操作系统,但是可以在大多数操作系统中编译和使用.FFmpeg支持MPEG. DivX.MPEG4.AC3.DV.FLV等40多种编码,AVI.MPEG.OGG.Matroska.ASF等90多种解码. TCPMP, VLC, MPlayer等开源播放器都用到了FFmpeg. FFmpeg主目录下主要有libavcodec.libavformat和l