2012-01-03 28 views
6

Tôi đang cố gắng chạy example sau để Biên dịch, Lắp ráp và Tháo rời một chương trình nhỏ bằng chuỗi công cụ LLVM.Biên dịch, Lắp ráp và Tháo rời Sử dụng Chuỗi Công cụ LLVM

Mục đích của tôi là tìm hiểu cách hoạt động của nó để cố gắng hơn nữa tôi có thể thực hiện một số kiểm tra hiệu suất bằng cách thay đổi và/hoặc sắp xếp lại các hướng dẫn của trình điều khiển.

Để bắt đầu, đầu tiên tôi nhận được mã cắn của một chương trình giả:

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

Khi tôi có mã cắn, tôi cố gắng để sử dụng llvm-dis tiện ích để có một cái nhìn tại đại hội LLVM mã và llc để biên dịch chương trình trở lại lắp ráp tự nhiên bằng cách sử dụng bộ tạo mã LLC (chỉ dành cho rung cố gắng):

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

Nhưng trong cả hai trường hợp tôi nhận được lỗi sau:

llvm-dis: Invalid MODULE_CODE_GLOBALVAR record 

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?

Tôi đã googled và tôi chưa tìm thấy giải pháp. Tôi cũng đã cố gắng sử dụng

otool -tV hello 

Nhưng đầu ra không tương thích với llvm. Thay vì nhận được định dạng lắp ráp sau:

.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 

tôi nhận được:

__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 

nào không có giá trị đối với tôi như tôi mèo biên dịch assembly sau với ví dụ:

% gcc hello.s -o hello.native 

Cảm ơn trước.

+4

llvm-gcc bị phản đối. Bạn có thể thử clang? – arrowd

+1

Tôi có vấn đề tương tự. Bạn đã giải quyết nó bằng cách nào đó ??? – Cartesius00

Trả lời

5

Đảm bảo phiên bản llvm-gcc của bạn khớp với phiên bản LLVM bạn đã cài đặt - định dạng IR nhị phân thay đổi khá nhanh và không tương thích ngược trên nhiều phiên bản.

Hoặc, bạn có thể thử phát ra văn bản đại diện LLVM IR ra khỏi llvm-gcc và lắp ráp thông qua llvm-as.

Something như thế này:

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

, vv

Các vấn đề liên quan