2013-07-10 24 views
5

Biorąc plikLLVM/dzyń outputing do MIPS, ale nie działa w SPIM ....

#include <stdio.h> 

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

mogę użyć poleceń

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

produkować piękny kawałek co wygląda Kod MIPS (umieszczony poniżej, aby uniknąć rozbijania tekstu), niestety, kiedy próbuję uruchomić go w moim sprawdzonym symulatorze SPIM dla MIPS, stwierdzam, że obiekty SPIM są prawie w każdej linii. Nie tylko linie ".Section .mdebug.abi32", ale także dowolna linia formularza ".cfi *" - i jeszcze bardziej myląco (ponieważ dla mnie wygląda jak MIPS ...) wiersz "lui $ 2,% hi (__gnu_local_gp)”jest sprzeciwił.

szukam jakiejś informacji na temat różnych smakach MIPS że SPIM i LLVM niwelowanie, lub ktoś podać przykład symulatora MIPS mogę uruchomić że akceptuje MIPS kod, który produkuje LLVM.

.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 

Odpowiedz

0

drukarka montaż Mips w LLVM emituje montaż w formie gazowej (nadaje się do spożycia przez montera GNU i kompatybilnych narzędzi). jest bardzo duża szansa, SPI M nie może tego przeczytać. Jednakże, jeśli SPIM mógłby odczytać pliki binarne Mips, można spróbować wysłać plik obiektowy z LLVM i pozwolić, aby SPIM go obsłużył.

Pliki binarne są bardziej "uniwersalne", ponieważ muszą być rozumiane przez sam procesor. Niestety, każdy asembler ma zazwyczaj swoją specyficzną składnię, którą tylko rozumie, a asemblery nie są ze sobą kompatybilne i nie zgadzają się co do podstawowych rzeczy, takich jak porządkowanie operatorów, semantyka interpunkcji, dyrektywy i tak dalej.

1

Spim jest prostym narzędziem dydaktycznym, które nie obsługuje asemblera gnu. Możesz spróbować użyć opcji OVPsim, która zawiera pełne modele różnych rzeczywistych procesorów MIPS. Możesz uruchomić Linuksa na OVPsim, i powinieneś być w stanie uruchomić plik wykonywalny MIPS Linux wyprodukowany przez clang na tym symulowanym Linuksie.

+0

Inną drogą, jeśli używasz systemu Linux, byłoby użycie emulatora trybu QEMU Linux dla Mips. Właśnie tego używam w łańcuchu narzędzi ELLCC opartym na brzęku. (http://ellcc.org) –