-在Linux中发出llvm
我是LLVM的新手,尝试在Linux上生成一个可读的.ll文件。我安装了llvm gcc,但在我看来它只能生成汇编代码(-S选项)。有没有什么方法可以获得类似llvm在线生成的内容 这就是我在Linux上通过-在Linux中发出llvm,llvm,Llvm,我是LLVM的新手,尝试在Linux上生成一个可读的.ll文件。我安装了llvm gcc,但在我看来它只能生成汇编代码(-S选项)。有没有什么方法可以获得类似llvm在线生成的内容 这就是我在Linux上通过-s-emit llvm得到的: .file "hello.c" .ident "GCC: (Ubuntu/Linaro 4.5.1-7ubuntu2) 4.5.1 LLVM: " .text .globl main .align 16,
-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
;ModuleID='/tmp/webcompile/_7829_0.bc'
target datalayout=“e-p:64:64-i1:8:8-i8:8-i16:16-i32:32-i64:64-f32:32:32-f64:64-v64:64-v128:128:128-a0:0:64-s0:64-f80:128:128-n8:32:64”
target triple=“x86_64-linux-gnu”
@.str=private常量[12 x i8]c“hello world\00”,对齐1;[#使用=1]
定义i32@main()风{
条目:
%0=尾部调用i32@put(i8*getelementptr inbounds([12 x i8]*@.str,i64 0,i64 0))nounwind;[#uses=0]
ret i32 0
}
声明i32@puts(i8*nocapture)风
在windows上,我使用相同的命令成功地获取了此文件:llvm gcc-S-emit llvm hello.c
来自:
将源代码编译成字节码文件hello.bc
然后使用llvm dis实用程序查看llvm程序集代码:
$ llvm-dis < hello.bc | less
$llvm dis
在llvm gcc的ubuntu包中,有一些东西坏得很可怕。llvm gcc的版本是4.2.1,但这里我们看到的是4.5。请报告Ubuntu错误。试试:
llvm-gcc -c -emit-llvm source.cpp
使用-c
代替-S
如果不起作用,请使用:
clang -c -emit-llvm source.cpp
您可以从Ubuntu软件中心构建llvm,也可以下载llvm-3.0-src和clang src,自己编译它们。执行上的步骤
这将从svn安装llvm和clang。所以您将从源代码构建
但有一点不同:
../llvm/configure--prefix=/usr/local--enable优化
make-j4
进行安装(在/usr/local下安装工具)
(安装release+断言而不是debug+断言,或者使用../llvm/configure for debug+断言。)
我有一个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上,我想它也是龙蛋版本 我正在获取llvm gcc可能不兼容的插件版本 在这一点之后,我得到了与llvm dis完全相同的错误:
“llvm dis:无效位码签名”。如果要使用llvm,请从源代码生成它: 否则,要快速启动,请尝试在Ubuntu上安装clang。这是构建在LLVM之上的C/C++编译器。您将能够直接从clang生成LLVM IR
llvm gcc似乎基于dragon egg,llvm AFAIK中不再支持它。我尝试过,但得到了“llvm dis:无效位码签名”。我从教程中获取了hello.c,llvm gcc编译代码时没有任何问题。如果是bug,请与-fplugin arg dragonegg emit-irWell一起使用,llvm gcc不是dragonegg。如果ubuntu试图“作弊”,那又是ubuntu的错误:)你知道几个月前从LLVM中删除了
configure
(autoconf)脚本吗?我们现在依赖CMake。是的,我的回答是3年前的。当时就是这样,错过了这个,对不起。出于某种原因,我在这里结束时看到了最新的东西(或者至少我是这么想的…)
clang -c -emit-llvm source.cpp