我刚刚发现了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代码的第一步?如果是,我该怎么办?有人对我有任何指示吗?
答案 0 :(得分:7)
LLVM IR语言的一个非常重要的特性(和设计目标)是它的三向表示:
所有3个确实完全可以互换。任何可以在一个中表达的东西也不能在另外两个中表达出来。
因此,只要您符合语法,您就可以自己编写IR。然而,这是毫无意义的,除非用于锻炼自己的格式,是否更好地阅读(和诊断)IR或生成自己的编译器:)
答案 1 :(得分:6)
是的,你当然可以。首先,您可以手动编写LLVM IR。所有工具如llc(将为您生成本机代码)和opt(LLVM IR =&gt; LLVM IR优化器)接受LLVM IR的文本表示作为输入。