2012-01-03 114 views
6

我試圖運行以下example以使用LLVM工具鏈編譯,彙編和反彙編小程序。使用LLVM工具鏈編譯,組裝和反彙編

我的目的是瞭解它是如何工作的,所以在進一步的嘗試中,我可以通過改變和/或重新排序組裝指令來做一些性能測試。

首先,我先得到一個虛擬程序的咬代碼:

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

一旦我有一口代碼,我嘗試使用LLVM-DIS工具來看看LLVM的彙編代碼和LLC編譯程序返回到本地組裝使用LLC代碼生成器(只是爲了試圖搖動):

% llvm-dis < hello.bc | less 
    % llc hello.bc -o hello.s 

但在這兩種情況下,我得到以下錯誤:

llvm-dis: Invalid MODULE_CODE_GLOBALVAR record 

有關如何解決此問題的任何想法?

我已經使用Google搜索,但我還沒有找到解決方案。我也嘗試過使用

otool -tV hello 

但是輸出與llvm不兼容。相反,得到下面的彙編格式:

.section __TEXT,__text,regular,pure_instructions 
.globl _main 
.align 4, 0x90 
    _main: 
    Leh_func_begin1: 
pushq %rbp 
    Ltmp0: 
movq %rsp, %rbp 
    Ltmp1: 
subq $16, %rsp 
    Ltmp2: 
leaq L_.str(%rip), %rax 

我得到:

__TEXT,__text) section 
start: 
0000000100000eb0 pushq $0x00 
0000000100000eb2 movq %rsp,%rbp 
0000000100000eb5 andq $0xf0,%rsp 
0000000100000eb9 movq 0x08(%rbp),%rdi 
0000000100000ebd leaq 0x10(%rbp),%rsi 
0000000100000ec1 movl %edi,%edx 
0000000100000ec3 addl $0x01,%edx 

這不適用於我,我貓編譯後者組件,例如:

% gcc hello.s -o hello.native 

謝謝提前。

+4

LLVM-GCC已被棄用。你可以嘗試叮鐺聲嗎? – arrowd 2012-01-04 08:23:55

+1

我有類似的問題。你有沒有解決它? – Cartesius00 2012-08-11 12:05:55

回答

5

請確保您的llvm-gcc版本與您安裝的LLVM版本相匹配 - 二進制IR格式更改速度相當快,並且在多個版本中不會向後兼容。

或者,你可以嘗試發射文本LLVM IR的表示了LLVM-GCC,並通過LLVM,作爲組裝。

事情是這樣的:

llvm-gcc -emit-llvm -S foo.c -o foo.ll 
llvm-as foo.ll -o foo.bc 
llc foo.ll -o foo.S