我是LLVM的新手并尝试在Linux上生成一个人类可读的.ll文件。我安装了llvm-gcc但是我看到它只能生成汇编代码(-S选项)。有什么方法可以获得llvm online compiler生成的内容吗?
这就是我在Linux上使用-S -emit-llvm
所得到的:
.file "hello.c"
.ident "GCC: (Ubuntu/Linaro 4.5.1-7ubuntu2) 4.5.1 LLVM: "
.text
.globl main
.align 16, 0x90
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $.L.str, 4(%esp)
movl $1, (%esp)
call __printf_chk
xorl %eax, %eax
addl $8, %esp
popl %ebp
ret
.Ltmp0:
.size main, .Ltmp0-main
.type .L.str,@object
.section .rodata.str1.1,"aMS",@progbits,1
.L.str:
.asciz "hello world\n"
.size .L.str, 13
.section .note.GNU-stack,"",@progbits
这就是我想要的:
; ModuleID = '/tmp/webcompile/_7829_0.bc'
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"
@.str = private constant [12 x i8] c"hello world\00", align 1 ; <[12 x i8]*> [#uses=1]
define i32 @main() nounwind {
entry:
%0 = tail call i32 @puts(i8* getelementptr inbounds ([12 x i8]* @.str, i64 0, i64 0)) nounwind ; <i32> [#uses=0]
ret i32 0
}
declare i32 @puts(i8* nocapture) nounwind
在Windows上,我使用相同的命令成功获取此文件:llvm-gcc -S -emit-llvm hello.c
。
答案 0 :(得分:7)
在llvm-gcc的ubuntu包装中出现了可怕的问题。 llvm-gcc的版本是4.2.1,但在这里我们看到4.5。请报告Ubuntu错误。
答案 1 :(得分:3)
尝试:
llvm-gcc -c -emit-llvm source.cpp
使用-c
代替-S
。
如果不起作用,请使用:
clang -c -emit-llvm source.cpp
您可以从Ubuntu软件中心构建llvm,也可以下载llvm-3.0-src和clang-src来自行编译。
答案 2 :(得分:2)
$ llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc
将源hello.c
编译为字节码文件hello.bc
。
然后使用llvm-dis实用程序查看LLVM汇编代码:
$ llvm-dis < hello.bc | less
答案 3 :(得分:0)
执行http://clang.llvm.org/get_started.html上的步骤 这将从svn安装llvm和clang。所以你将从源代码构建
但差别很小: ../llvm/configure --prefix = / usr / local --enable-optimized make -j4 make install(在/ usr / local下安装工具)
(安装release + asserts而不是debug + asserts或者使用../llvm/configure进行调试+断言 我有一个i5,所以我根据你的意愿使用了make -j4)
使用clang而不是llvm-gcc。然后,您可以直接生成.ll: clang -S -emit-llvm file.cpp -o file.ll
和 clang -c -emit-llvm file.cpp -o file.bc
如果您愿意和.s执行以下操作: llc file.bc
这是ubuntu上最新版llvm的最简洁方法
同样的事情发生在llvm-gcc-4.6上,这也是我认为的dragonEgg版本。
我正在使用llvm-gcc潜在的不兼容插件版本
在这一点之后,我得到与llvm-dis:
完全相同的错误“llvm-dis:无效的bitcode签名”。
答案 4 :(得分:0)
如果您想使用LLVM,请从源代码构建它:http://clang.llvm.org/get_started.html
否则,要快速启动,请尝试在Ubuntu上安装clang。这是构建在LLVM之上的C / C ++编译器。您将能够直接从clang生成LLVM IR。
llvm-gcc似乎是基于龙蛋,LLVM AFAIK不再支持它。