2013-07-10 25 views
5

Dato il fileLLVM/clang outputing per MIPS, ma non funziona in SPIM ....

#include <stdio.h> 

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

posso usare i comandi

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

per produrre un bel po 'di quello che sembra Sfortunatamente, quando si tenta di eseguirlo nel mio fidato simulatore SPIM per MIPS, scopro che SPIM si trova in quasi tutte le linee. Non solo le righe '.Section .mdebug.abi32' ma anche qualsiasi riga del modulo '.cfi *' - e ancora più confusamente (perché sembra MIPS per me ...) la riga 'lui $ 2,% hi (__gnu_local_gp)" viene contestato.

sto cercando alcune informazioni sui diversi sapori di MIPS che SPIM e LLVM affrontare, o qualcuno per dare un esempio di un simulatore di MIPS posso fare funzionare che accetta la MIPS codice che LLVM sta producendo.

.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 

risposta

0

la stampante assembly MIPS in LLVM emette assemblaggio in formato GAS (adatto per il consumo dall'assembler GNU e strumenti compatibili). C'è una buona possibilità SPI M non può leggerlo. Tuttavia, se SPIM fosse in grado di leggere i binari di Mips, si potrebbe provare a emettere un file oggetto da LLVM e lasciare che sia gestito da SPIM.

I binari sono più "universali" poiché devono essere compresi dalla CPU stessa. Purtroppo, ogni assemblatore di solito ha una propria sintassi specifica che solo lui comprende, e gli assemblatori non tendono ad essere compatibili tra loro e non sono d'accordo su cose basilari come l'ordine degli operatori, la semantica della punteggiatura, le direttive e così via.

1

Spim è un semplice strumento didattico che non supporta l'assemblatore di gnu. Potresti provare a utilizzare OVPsim, che ha modelli completi di vari processori MIPS reali. Puoi eseguire Linux su OVPsim e dovresti essere in grado di eseguire un eseguibile Linux MIPS prodotto da clang su quel Linux simulato.

+0

Un altro percorso, se si sta eseguendo Linux, sarebbe utilizzare l'emulatore della modalità utente Linux QEMU per Mips. Questo è quello che uso per la mia catena di strumenti ELLCC basata su clang. (Http://ellcc.org) –