2013-07-10 34 views
5

Với fileLLVM/kêu vang outputing để MIPS, nhưng không làm việc trong SPIM ....

#include <stdio.h> 

int main() { 
     printf("hello world\n"); 
     return 0; 
} 

tôi có thể sử dụng các lệnh

clang -emit-llvm hello.c -c -o hello.bc 
llc hello.bc -march=mipsel -relocation-model=static -o hello.s 

để sản xuất một chút tốt đẹp của những gì trông giống như MIPS code, (đặt bên dưới, để tránh phá vỡ các văn bản) không may, khi tôi cố gắng và chạy nó trong mô phỏng SPIM đáng tin cậy của tôi cho MIPS tôi thấy rằng các đối tượng SPIM đến hầu như mọi dòng của nó. Không chỉ các dòng '.Section .mdebug.abi32' mà còn là bất kỳ dòng nào của biểu mẫu '.cfi *' - và thậm chí còn gây nhầm lẫn hơn (vì nó trông giống như MIPS với tôi ...) dòng 'lui $ 2,% hi (__gnu_local_gp)" được phản đối.

tôi đang tìm kiếm một số thông tin về những hương vị khác nhau của MIPS rằng SPIM và LLVM đối phó với, hoặc một người nào đó để đưa ra một ví dụ về một mô phỏng MIPS tôi có thể chạy mà chấp nhận MIPS mã mà LLVM đang sản xuất

.Section .mdebug.abi32 
    .previous 
    .file "hello.bc" 
    .text 
    .globl main 
    .align 2 
    .type main,@function 
    .set nomips16    # @main 
    .ent main 
main: 
    .cfi_startproc 
    .frame $sp,32,$ra 
    .mask 0x80000000,-4 
    .fmask 0x00000000,0 
    .set noreorder 
    .set nomacro 
# BB#0:         # %entry 
    addiu $sp, $sp, -32 
$tmp2: 
    .cfi_def_cfa_offset 32 
    sw $ra, 28($sp)   # 4-byte Folded Spill 
$tmp3: 
    .cfi_offset 31, -4 
    lui $2, %hi(__gnu_local_gp) 
    addiu $2, $2, %lo(__gnu_local_gp) 
    sw $2, 16($sp) 
    sw $zero, 24($sp) 
    lui $2, %hi($.str) 
    addiu $4, $2, %lo($.str) 
    jal printf 
    nop 
    addiu $2, $zero, 0 
    lw $ra, 28($sp)   # 4-byte Folded Reload 
    addiu $sp, $sp, 32 
    jr $ra 
    nop 
    .set macro 
    .set reorder 
    .end main 
$tmp4: 
    .size main, ($tmp4)-main 
    .cfi_endproc 

    .type $.str,@object   # @.str 
    .section .rodata.str1.1,"aMS",@progbits,1 
$.str: 
    .asciz "hello world\n" 
    .size $.str, 13 

Trả lời

0

Máy in lắp ráp Mips trong LLVM phát ra lắp ráp theo định dạng GAS (phù hợp với tiêu thụ bởi bộ ghép GNU và các công cụ tương thích). M không đọc được. Tuy nhiên, nếu SPIM có thể đọc các tệp nhị phân Mips, bạn có thể thử phát ra một tệp đối tượng từ LLVM và cho phép SPIM xử lý tệp đó.

Các tệp nhị phân có nhiều "phổ quát hơn" vì chúng phải được chính CPU hiểu. Tuy nhiên, mỗi trình biên dịch thường có cú pháp cụ thể của riêng nó mà nó hiểu và các trình lắp ráp không có xu hướng tương thích với nhau và không đồng ý với những thứ cơ bản như thứ tự toán tử, ngữ nghĩa chấm câu, chỉ thị, v.v.

1

Spim là một công cụ giảng dạy đơn giản không hỗ trợ trình tạo gnu. Bạn có thể thử sử dụng OVPsim, trong đó có các mô hình hoàn chỉnh của nhiều bộ xử lý MIPS thực. Bạn có thể chạy Linux trên OVPsim, và bạn sẽ có thể chạy một tập tin thực thi MIPS Linux được tạo ra bởi clang trên Linux mô phỏng đó.

+0

Một tuyến đường khác, nếu bạn đang chạy Linux, sẽ sử dụng trình giả lập chế độ người dùng QEMU Linux cho Mips. Đó là những gì tôi sử dụng cho chuỗi công cụ ELLCC dựa trên clang của tôi. (http://ellcc.org) –

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