2013-07-10 23 views
5

dosyayıLLVM/clang MIPS için çıkış olanağı fakat SPIM çalışmıyor ....

#include <stdio.h> 

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

ben neye benzediğini güzel bir bit üretmek için komutlar

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

kullanabilirsiniz MIPS kodu, (metnin ayrılmasını önlemek için aşağıda yer almaktadır) maalesef, MIPS için benim güvenilir SPIM simülatörümde çalıştırdığımda, SPIM'in neredeyse her satırındaki nesnelerini buluyorum. Sadece '.Section .mdebug.abi32' satırları değil, aynı zamanda formunun herhangi bir satırı '.cfi *' - ve daha da karmaşık bir şekilde (çünkü bana MIPS gibi görünüyor) çizgi 'lui $ 2,% hi (__gnu_local_gp)" itiraz edilir.

Ben SPIM ve LLVM ile baş o MIPS farklı tatlar bazı bilgiler arıyorum, veya birinin bu MIPS kabul ı çalıştırabilirsiniz MIPS simülatörünün bir örnek vermek LLVM ürettiğinde kodu.

.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 

cevap

0

LLVM içinde Mips montaj yazıcı GAZ formatında montaj (GNU assembler ve uyumlu araçlar tarafından tüketime uygun) yayar. çok iyi bir şans SPI var M bunu okuyamaz. Ancak, SPIM Mips ikili dosyalarını okuyabiliyorsa, LLVM'den bir nesne dosyası yayınlamaya ve SPIM'in bunu işlemesine izin verebilirsiniz.

İkililerin hepsi "evrensel" dir, çünkü bunlar CPU tarafından anlaşılmalıdır. Ne yazık ki, her bir assembler'ın sadece kendi anlayacağı bir sözdizimi vardır, bu nedenle montajcılar birbirleriyle uyumlu olma eğiliminde değildir ve operatör siparişi, noktalama semantiği, direktifler vb. Gibi temel şeylere katılmazlar.

1

Spim gnu assembler'ı desteklemeyen basit bir öğretim aracıdır. Çeşitli gerçek MIPS işlemcilerin eksiksiz modellerine sahip olan OVPsim kullanmayı deneyebilirsiniz. Linux'u OVPsim üzerinde çalıştırabilir ve simüle edilmiş Linux üzerinde clang tarafından üretilen bir MIPS Linux çalıştırıcısını çalıştırabilmeniz gerekir.

+0

Linux'u çalıştırıyorsanız, başka bir yol da, Mips için QEMU Linux kullanıcı modu emülatörünü kullanmak olacaktır. Clang tabanlı ELLCC takım zincirim için kullanıyorum. (Http://ellcc.org) –