2011-03-22 82 views
7

我是LLVM的新手,並試圖在Linux上生成一個人類可讀的.ll文件。我安裝了llvm-gcc,但正如我所看到的,它只能生成彙編代碼(-S選項)。有沒有什麼辦法可以得到像llvm在線compiler生成的東西?Linux中的-emit-llvm

這就是我與-S -emit-llvm獲得在Linux上:

.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

回答

7

東西是可怕的斷裂。 llvm-gcc的版本是4.2.1,但在這裏我們看到4.5。請報告Ubuntu bug。

+0

適用於-fplugin- arg-dragonegg-emit-ir – Nutel 2011-03-22 21:00:58

+0

那麼,llvm-gcc不是dragonegg。如果ubuntu試圖「作弊」,那麼它又是Ubuntu的bug :) – 2011-03-23 06:13:59

2

LLVM tutorial

$ llvm-gcc -O3 -emit-llvm hello.c -c -o hello.bc 

將編譯源hello.c成字節碼文件hello.bc

然後使用LLVM-DIS實用程序來看一看的LLVM彙編代碼:在LLVM-的gcc ubuntu的包裝

$ llvm-dis < hello.bc | less 
+1

我試過但得到「llvm-dis:無效的位碼簽名」。我從教程中獲取了hello.c,llvm-gcc編譯代碼時沒有任何問題 – Nutel 2011-03-22 00:27:47

+1

似乎是個bug https://bugs.launchpad.net/ubuntu/+source/dragonegg/+bug/712199 – Nutel 2011-03-22 01:26:52

3

嘗試:

llvm-gcc -c -emit-llvm source.cpp 

使用-c代替-S

,如果它不能正常工作,使用:

clang -c -emit-llvm source.cpp 

你可以建立LLVM無論是從Ubuntu軟件中心或下載LLVM-3.0-src和鐺-SRC自己編譯它們。

0

執行http://clang.llvm.org/get_started.html 上的步驟這將安裝svn的llvm和clang。所以你從源代碼編譯

但微小的差別: ../llvm/configure前綴=在/ usr /本地--enable-優化 使-j4 使安裝(安裝在/ usr工具/本地)

(安裝版本+斷言,而不是調試+斷言或../llvm/configure去調試+斷言 我有一個I5,所以我用化妝-J4改變,如你所願)

使用clang而不是llvm-gcc。通過您可以然後直接產生.ll: 鐺-S -emit,LLVM file.cpp -o file.ll

和 鐺-c -emit,LLVM file.cpp -o file.bc

如果你喜歡和.s做以下事情: llc文件。BC

這是LLVM的最新版本在Ubuntu上最乾淨的方式


同樣的事情發生與LLVM-GCC-4.6,這也是dragonEgg版本我想。

我得到LLVM-GCC潛在的不兼容的插件版本

這一點上我得到完全相同的錯誤與LLVM-DIS後:

「LLVM-DIS:無效位碼簽名」。

+0

你知道'configure'(autoconf)腳本已經在幾個月前從LLVM中刪除了嗎?我們現在依靠CMake。 – Joky 2016-10-15 23:29:00

+0

是的,我的回覆是3年前。當時就是這樣。 – 2016-10-16 17:28:27

+0

錯過了這個,對不起。出於某種原因,我最終在這裏看着最近的東西(或者這就是我認爲至少......) – Joky 2016-10-17 03:54:27

0

如果你想與LLVM玩,從源碼編譯:http://clang.llvm.org/get_started.html

否則,要快速啓動,嘗試安裝在Ubuntu譁。這是在LLVM之上構建的C/C++編譯器。您將能夠直接從clang生成LLVM IR。

llvm-gcc似乎是基於龍蛋,這在LLVM AFAIK中不再支持。