2012-02-06 63 views
11

我想讀取(解析)LLVM IR代碼(保存在文本文件中)並向其中添加一些自己的代碼。我需要做一些這方面的例子,也就是說,如何通過使用LLVM爲此提供的庫來完成這項工作。所以基本上我想要的是從文本文件中讀入IR代碼到內存中(也許LLVM庫以AST形式表示,我不知道),進行修改,如在AST中添加更多節點,然後寫入返回IR文本文件中的AST。解析和修改LLVM IR代碼

雖然我需要同時閱讀和修改IR代碼,但如果有人能夠提供或引薦我一些只讀(解析)它的示例,我將不勝感激。

回答

24

首先,解決一個明顯的誤解:LLVM是一個處理IR格式代碼的框架。目前沒有AST(*) - 您讀取IR,轉換/操作/分析它,然後將IR寫回。

閱讀IR是非常簡單的:

int main(int argc, char** argv) 
{ 
    if (argc < 2) { 
     errs() << "Expected an argument - IR file name\n"; 
     exit(1); 
    } 

    LLVMContext &Context = getGlobalContext(); 
    SMDiagnostic Err; 
    Module *Mod = ParseIRFile(argv[1], Err, Context); 

    if (!Mod) { 
     Err.print(argv[0], errs()); 
     return 1; 
    } 

    [...] 
    } 

此代碼接受一個文件名。這應該是LLVM IR文件(文本)。然後它將它解析爲一個Module,它表示LLVM內部內存中格式的IR模塊。這可以通過LLVM擁有的或您自己添加的各種通道來操縱。看看LLVM代碼庫中的一些示例(如lib/Transforms/Hello/Hello.cpp),並閱讀本文 - http://llvm.org/docs/WritingAnLLVMPass.html

將IR分散到文件中更加容易。 Module類只是將自己寫入流中:

some_stream << *Mod; 

就是這樣。現在

,如果您有關於具體修改任何具體問題,你想要做的IR代碼,你應該問的東西更有針對性。我希望這個答案告訴你如何解析IR並將其寫回。(*)IR在LLVM中沒有AST表示,因爲它是一種簡單的彙編語言。如果你向上或往上推進到C或C++,可以使用Clang將其解析爲AST,然後在AST級別進行操作。然後Clang知道如何從AST生成LLVM IR。但是,您必須從C/C++開始,而不是LLVM IR。如果LLVM IR是你關心的所有事情,那麼忘掉AST。

+0

謝謝Eli。你的回答非常有幫助。 – MetallicPriest 2012-02-07 09:14:43

+0

擡起頭,我認爲它應該是「parseIRFile」,小寫字母p。 http://llvm.org/docs/doxygen/html/IRReader_2IRReader_8h_source.html – user2027722 2016-03-30 01:54:12

+0

@ user2027722:是的,LLVM API的變化非常頻繁,所以保持樣本保持最新狀態非常困難。我有一個Github的回購:https://github.com/eliben/llvm-clang-samples,我儘可能保持同步,這是更多的真相來源比隨機SO回答 – 2016-03-30 14:41:07

1

最簡單的方法是查看現有工具之一併從中竊取代碼。在這種情況下,您可能需要查看llc的來源。它可以採用bitcode或.ll文件作爲輸入。您可以任意修改輸入文件,然後使用類似於llvm-dis中的代碼的方式寫出文件,如果您需要文本文件。

2

這通常通過實施LLVM傳遞/變換來完成。這樣你就不必解析IR了,因爲LLVM會爲你做,而且你將在面向OO的內存中表示IR。

This是編寫LLVM通行證的入口點。然後,您可以查看已與LLVM捆綁在一起的任何已實施的標準傳遞(查看lib/Transforms)。

+0

這將是我最終會做的。但是現在,由於我處於學習階段,我希望能夠在文本文件中看到IR。 – MetallicPriest 2012-02-06 21:54:41

+3

我沒有看到問題。大多數LLVM工具都可以讀取/寫入IR的文本表示。特別是,要發出文本表示,請將-S開關添加到您的命令行中。 (另外,請始終記住二進制和文本表示是完全相同的)。 – CAFxX 2012-02-06 21:59:54

1

Opt工具採用llvm IR代碼,在其上運行一遍,然後在另一側吐出已轉換的llvm IR。

最容易開始黑客行爲是lib \ Transforms \ Hello \ Hello.cpp。對它進行破解,通過選擇源文件作爲輸入,檢查輸出。

除此之外,寫入通行證的文檔確實相當不錯。

1

如上所述,最好的方法來寫一個通行證。但是,如果您只是簡單地遍歷指令並使用LLVM提供的InstVisitor類進行操作。這是一個實現訪問者模式的類。這對用戶來說是非常直接的,所以如果你想避免學習如何實現通行證,你可以訴諸於此。