2017-10-11 64 views
2

鏗鏘聲源代碼轉換中的藝術狀態如何?叮噹聲源代碼轉換(現代技術)

我跟蹤了網上幾乎所有的資源,我可以通過clang插件實現源代碼重寫(Rewriter),但最終的二進制文件沒有更新(CodeGen是主要的活動,並且它被編譯而不管什麼我在我的插件中進行了修改,即使在getActionType中使用AddBeforeMainAction)。

我所看到的關於libTooling以及如何創建使用鐺作爲庫中的一個獨立的程序的一些文件,但我的目的是創建一個插件(FrontendPluginRegistry::Add<>,一些「易」堵塞到非定製鐺二進制)並實現源到源的修改(對用戶透明,避免覆蓋源文件)。

編輯:如果不清楚: 我需要類似「插件」的東西來以簡單的方式擴展clang。我需要在編譯過程中「集成」的東西。爲什麼?因爲我需要在編譯階段修改源代碼,注入新代碼,一步修改用戶的源代碼(我不想創建一個工具來解析用戶源代碼,然後編譯輸出文件) 。另外,我想分發我的代碼(插件)以允許用戶自己使用它。

它是強制性的,它在鐺的編譯階段(clang $FLAGS $PLUGIN $ETC -o program source_files...)。

+0

最後二進制是什麼?鐺?該程序正在修改?爲什麼這是一個問題? –

+0

我編輯問題。我希望你現在明白我需要什麼。 – user3819881

+0

我明白了。你需要一個運行時插件來Clang在編譯時實現源到源的轉換。好的我明白了。我期望這很難做到,因爲Clang轉換機制主要是在Clang類中調用編譯方法,並且肯定「你」會想要編寫某種源代碼來實現在運行時解釋的轉換。誰將介於您編寫的源文本和編譯後的Clang代碼之間? 「編譯時強制」似乎是一個XY問題......你爲什麼堅持這樣做? –

回答

0

的CodeGen將是主要的活動,也不管我在我的插件

是的,這是因爲Clang的AST被設計爲不可變的已經修改了它編譯。解析後無法更改。

所以在Clang的藝術S2S改造的狀態看起來像這樣:

  • 解析C++源代碼,AST
  • 應用文本替換原來的源代碼,生成新的源代碼
  • 解析新源代碼來創建新的AST

您可以執行「內存」中的所有步驟,因此最終用戶不會注意到。

更新: 我從來沒有寫過clang插件。但這裏是我注意到: 如果運行Clang的門前實際生成的目標代碼:

clang -cc1 -emit-obj main.c 

它將運行EmitObjAction。 EmitObjAction是一個FrontEnd Action,所以它將解析輸入源並運行codegen。因此,如果您並行運行其他FrontEnd操作,它們將不會影響EmitObjAction。因爲每個FrontEnd操作都會分析原始輸入源代碼。

你能做什麼,就是用你自己的fork來代替EmitObjAction,它將盡可能多地重新解析你想要的東西。

如果將PluginASTAction :: ActionType設置爲ReplaceAction,它應該替換由您自己的插件提供的內置Codegen操作。

+0

好的,你能告訴我一個這樣做的例子(回購,代碼)嗎?當我使用重寫器時,我正在修改內存中的源代碼,但未修改Clang AST。 你可以用一個「真實的例子」來闡述,可以像你想的那樣基本,但它必須是一個插件,並且一步完成(當用戶編譯它的源代碼時)。 – user3819881

+0

另外,您可以指導我如何在插件完成後「觸發」重新分析。 @隨機 – user3819881