這個過程簡單的分爲幾步。git
第一步:寫一個簡單的小程序,hello.c。內容以下:github
#include<stdio.h>
int main() {
printf("Hello world!\n");
}
小程序
第二步:找出如何在LLVM裏面輸出信息,最後選擇採用llvm::errs(),等於採用了LLVM的錯誤機制。包括llvm::errs()所需的頭文件。具體內容以下:函數
//shining add endcode
注:爲了標明代碼是我本身添加的,因此在添加的log信息先後都加了註釋。get
第三步:採用clang3.9.0代碼,在我知道的幾個點隨意添加了幾個log信息,信息內容如上一步所示,主要是標明插入log的函數的相關信息,都放在了函數的第一條語句處。編譯該clang以後,使用命令clang hello.c -o hello編譯hello.c,能夠獲得以下輸出信息:源碼
clang/tools/driver/driver.cpp/main()/shining_addit
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源碼的朋友們提供一個思路。這個思路簡單易行,根據我提供的幾個點,也能夠繼續深刻去分析本身感興趣的地方。
io
代碼和修改後的代碼,我也建了一個代碼庫,地址:https://github.com/shining1984/clang_code_comment編譯