-emit-llvm在Linux中

时间:2011-03-22 00:07:04

标签: llvm

我是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

5 个答案:

答案 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 tutorial

$ 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不再支持它。