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

這個過程簡單的分爲幾步。git

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

#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 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編譯

相關文章
相關標籤/搜索