写llvm字节码

时间:2011-03-24 09:16:03

标签: llvm bytecode

我刚刚发现了LLVM,对此还不太了解。我一直在尝试使用llvm in browser。我可以看到我写的任何C代码都转换为LLVM字节代码,然后转换为本机代码。该页面显示了字节代码的文本表示。例如,对于以下C代码:

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代码的第一步?如果是,我该怎么办?有人对我有任何指示吗?

2 个答案:

答案 0 :(得分:7)

LLVM IR语言的一个非常重要的特性(和设计目标)是它的三向表示:

  • 您可以在此处看到的文字表示
  • 字节码表示(或二进制形式)
  • 内存中表示

所有3个确实完全可以互换。任何可以在一个中表达的东西也不能在另外两个中表达​​出来。

因此,只要您符合语法,您就可以自己编写IR。然而,这是毫无意义的,除非用于锻炼自己的格式,是否更好地阅读(和诊断)IR或生成自己的编译器:)

答案 1 :(得分:6)

是的,你当然可以。首先,您可以手动编写LLVM IR。所有工具如llc(将为您生成本机代码)和opt(LLVM IR =&gt; LLVM IR优化器)接受LLVM IR的文本表示作为输入。