2011-03-24 60 views
6

我剛剛發現了LLVM,現在還不太瞭解。我一直在嘗試使用llvm in browser。我可以看到,我寫的任何C代碼都被轉換爲LLVM字節碼,然後轉換爲本地代碼。該頁面顯示字節碼的文本表示。例如,對於下面的C代碼:寫llvm字節碼

int array[] = { 1, 2, 3}; 

int foo(int X) { 
    return array[X]; 
} 

出現下面的字節碼:

target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64" 
target triple = "x86_64-linux-gnu" 

@array = global [3 x i32] [i32 1, i32 2, i32 3] ; <[3 x i32]*> [#uses=1] 

define i32 @foo(i32 %X) nounwind readonly { 
entry: 
    %0 = sext i32 %X to i64       ; <i64> [#uses=1] 
    %1 = getelementptr inbounds [3 x i32]* @array, i64 0, i64 %0 ; <i32*> [#uses=1] 
    %2 = load i32* %1, align 4      ; <i32> [#uses=1] 
    ret i32 %2 
} 

我的問題是:我寫的字節碼,並把它交給LLVM彙編轉換爲本地代碼跳過編寫C代碼的第一步?如果是的話,我該怎麼做?有沒有人對我有任何指點?

+1

http://llvm.org/docs /CommandGuide/index.html – 2011-03-24 09:45:33

回答

6

是的,你可以。首先,您可以手動編寫LLVM IR。所有工具如llc(將爲您生成本機代碼)和opt(LLVM IR => LLVM IR優化器)接受LLVM IR的文本表示作爲輸入。在LLVM IR的語言

7

一個非常重要的功能(和設計目標)是其3路表示:

  • 的文字表述,你可以在這裏看到
  • 字節碼錶示法(或二進制形式)
  • 內存中的表示法

所有3個確實完全可以互換。在其他兩個人中也不能表達任何可以表達的東西。

因此,只要您符合語法,您的確可以自己編寫IR。儘管如此,除非習慣於習慣使用格式,不管是更好地閱讀(並診斷)IR還是編寫自己的編譯器:)