2015-10-05 36 views
0

我有一個使用libtooling的現有和可用的源代碼修改工具。現在我想把這個工具集成到clang中,這樣用戶就可以編譯修改過的源代碼,而不用將它保存在某個地方。使用叮噹插件更改源代碼

修改的部分是沒有問題的,匹配器+重寫器的工作方式相同鏗鏘,我的問題是如何告訴編譯器我的變化後重新分析源代碼。

我迄今爲止的進展:

  • 我發現cve-dev交談,但沒有具體的信息,該怎麼辦呢
  • 我還發現clang::ASTUnit::Reparse,但我無法弄清楚如何調用它。在叮噹中沒有任何東西使用它,我的每一次嘗試都得到了崩潰的回報。
  • 有在StackOverflow上過類似的問題,但沒有一個很好的答案
  • 有一些插件工具,如traces,它做同樣的修改源,但它只是調用編譯兩次。

我希望基於前兩個最終我找到一個工作解決方案,但也許有人知道答案已經,並可以幫助我一個例子,或至少更具體的說明如何實現它?

回答

0

你可以用,通過使用WrapperFrontendAction生成目標文件的EmitObjAction。在包裝器操作中,您可以重寫BeginInvocation()函數。在這個函數中,您可以創建自己的ASTFrontendAction,它可以遍歷AST並使用Rewriter類執行文本更改。

當您的操作完成後,您可以訪問Rewriter類中的緩衝區。您可以製作這些緩衝區的副本,並使用addRemappedFile()將它們添加到PreprocessorOptions中。由於PreprocessorOptions附加到CompilerInstance,因此它們也被您封裝的以下EmitObjAction使用。

這意味着EmitObjAction實際上會讀取已更改的源文件。

你可以從FixItRecompile類是如何在鏘用了一些靈感。

+0

不幸的是,我不能以WrapperFrontendAction無需實際修改鐺的源極(FixItRecompile被硬連線到它太)包裹EmitObjAction。或者我錯過了什麼? – Dutow

+0

就我個人而言,我更改了clang源代碼來執行此操作,因此我編譯了一個特殊用途的clang可執行文件。據我所知,如果你想使用clang插件或libtooling,你必須確實添加一些代碼,以暴露可能性來包裝EmitObjAction。 您也可以隨時嘗試在[cfe-dev郵件列表](http://lists.llvm.org/mailman/listinfo/cfe-dev)處詢問。 – Ivan

+0

我想出了一個類似的解決方案(從我的叮噹聲工具中調用clang編譯器)。您的版本當然更易於使用,但它仍然需要我爲每個鏗鏘聲版本進行維護,並且用戶必須下載並指定一個不同的編譯器,而不僅僅是一個插件。我也在郵件列表中提出了這個問題,並在那裏得到了類似的答案。但看起來目前沒有辦法做到這一點,所以我會問他們是否會接受將這種可能性添加到插件的補丁。 – Dutow