2011-02-27 85 views
22

我正在研究利用Clang的AST來編寫我的C代碼,並對AST做一些分析。一些關於從哪裏開始,如何獲得Clang的AST,教程或任何這方面的指示將有很大的幫助!如何使用Clang的AST?

我一直在試圖找到一些,我得到了這兩年前創建的這個link。但由於某種原因,它不適合我。示例代碼在教程中給了我太多的錯誤。所以我不確定,如果我正確地構建代碼或者本教程有一些錯誤。但我很樂意從其他頁面開始。

回答

14

開始與沙爾斯鏈接的教程。然後通過Clang的Doxygen。從SemaConsumer開始。

閱讀了很多源代碼。鏗鏘是一個移動的目標。如果你正在編寫基於鏗鏘的工具,那麼你需要認識到,鏗鏘是每天添加和修復功能,所以你應該準備閱讀很多代碼!

9

你可能想在libclang庫提供的穩定的C API,而不是不穩定的C++,其他人已經提到的內部API。

當前最好的文檔是談話視頻/幻燈片,「libclang:思考超越編譯器」,可在LLVM Developers Meeting website上找到。

但是請注意,API的穩定性是以全面性爲代價的。您將無法使用此API執行所有內容,但使用起來要容易得多。

0

爲了獲得AST以及瞭解前端的各個階段,在「LLVM核心庫」一書中有一個前端章節。基本上,它具有這樣的流量(在LLVM-4.0.1的情況和應更高版本類似):

  • cc1_main.cpp:cc1_main (ExecuteCompilerInvocation)
  • CompilerInstance.cpp:CompilerInstance::ExecuteAction
  • ParseAST.cpp:clang::ParseAST (Consumer>HandleTranslationUnit(S.getASTContext())
  • CodeGenAction.cpp:HandleTranslationUnit

的最後一個函數處理整個翻譯單元(此時已經處理了最高級別的翻譯),並且調用EmitBackendOutput來做後端材料。所以這個函數是一個很好的地方,你可以用完整的AST做一些事情,然後發佈後端輸出。

在如何操縱AST方面,鏗鏘有一些基本的教程:http://clang.llvm.org/docs/RAVFrontendAction.html

也看看ASTDumper.cpp。這是訪問AST的最好例子。

另一個很好的教程:https://jonasdevlieghere.com/understanding-the-clang-ast/教你如何通過三種不同的方法在AST中找到一個特定的呼叫expr。