星期一, 8月 30, 2010

LLVM 筆記

如果想要使用 LLVM 來當作其中的 library 的話,其實沒有什麼相當統一的文件,最快的方式就是看別人的 code 及 mailing list,所以我想這會是非常困難的做戰方式 XD

這次有兩件事要筆記,第一件事,盡量不要嘗試自己編譯 llvm-gcc ,這實在是不好編,我編成功沒幾次 XD,建議直接使用 binary 檔,人生會快樂些。

第二件事,如果想要使用 LLVM 裡面的 header file 的話,請使用 llvm-config,以下面的 code 來說

#include "llvm/LLVMContext.h"
#include "llvm/LLVMContext.h"
#include "llvm/Module.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/raw_ostream.h"

#include <string>

using namespace llvm;

int main(int argc, const char *argv[]){
    std::string filename = (argc>2)? argv[1]:"test.bc";

    std::string error;
    LLVMContext Context;
    
    MemoryBuffer *buffer = MemoryBuffer::getFile(filename);
    Module *module = ParseBitcodeFile(buffer, Context);

    outs() << *module << "\n";
    return 0;
}

llvm-config 雖然這只是讀一個 bc 檔之後然後輸出,但是中間會用到 llvm-objects 檔時,我們可以使用 llvm-config 來處理,而 llvm-config 的功能就是幫你生成要連結的函式庫及生成餵給 g++ 東西,如果想要知道更多細節,記得 man llvm-cofig,以這個檔為例,我們可以下這樣子的 command 去 compile

g++ -c -g -O2 -Wall  main.cpp -o main.o `llvm-config --cxxflags --ldflags --libs nativecodegen bitreader bitwriter` 
g++ -g -O2 -Wall  main.o  -o llvm_test  `llvm-config --cxxflags --ldflags --libs nativecodegen bitreader bitwriter`

至於用到什麼 Function/ Class 就該 include 那個檔案,目前我是用暴力法在 llvm doxygen 裡面尋找了 XD。

至於 llvm-config 有多少 lib 可以寫,可以使用 llvm-config --components 來看,得到的結果會相當的壯觀 XDXD

$ llvm-config --components
all alpha ... 


---
是該會用 cmake 了 XD