深入研究Clang(八) Clang代碼閱讀之打log讀流程1

這個過程簡單的分為幾步。

第一步:寫一個簡單的小程序,hello.c。內容如下:

#include<stdio.h>

int main() {

printf("Hello world!
");

}

第二步:找出如何在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" <<
;

//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源碼的朋友們提供一個思路。這個思路簡單易行,根據我提供的幾個點,也可以繼續深入去分析自己感興趣的地方。

代碼和修改後的代碼,我也建了一個代碼庫,地址:shining1984/clang_code_comment

2016-12-16

推薦閱讀:

Clang Static Analyzer內存模型(一):MemRegion.iii
LLVM每日談之十六 LLVM的學習感悟
Android NDK Clang遷移
LLVM每日談之三 如何創建一個LLVM工程

TAG:LLVM | Clang | ChrisLattner |