深入研究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_addclang/lib/CodeGen/CodeGenAction.cpp/CodeGenAction::ExecuteAction()/shining_addclang/lib/Sema/Sema.cpp/Sema::Sema()/shining_addclang/lib/Parse/ParseAST.cpp/ParseAST(Sema)/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_add
clang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/lib/Lex/Lexer.cpp/Lexer::InitLexer()/shining_addclang/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 |