-在Linux中发出llvm

-在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,

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