LLVM/clang выводит в MIPS, но не работает в SPIM

Учитывая файл

#include <stdio.h>

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

Я могу использовать команды

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

чтобы создать хороший фрагмент того, что выглядит как код MIPS (помещен ниже, чтобы не разбивать текст), к сожалению, когда я пытаюсь запустить его в своем надежном симуляторе SPIM для MIPS, я обнаруживаю, что SPIM возражает почти на каждую его строку. Не только строки '.Section .mdebug.abi32', но и любые строки в форме '.cfi*' - и еще более запутанная (потому что мне это кажется MIPS...) строка 'lui $2, %hi( __gnu_local_gp)" возражают.

Я ищу некоторую информацию о различных вариантах MIPS, с которыми справляются SPIM и LLVM, или кого-нибудь, кто может привести пример симулятора MIPS, который я могу запустить и который принимает код MIPS, создаваемый 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

person Joe    schedule 10.07.2013    source источник


Ответы (2)


Spim — это простой обучающий инструмент, который не поддерживает ассемблер gnu. Вы можете попробовать использовать OVPsim, в котором есть полные модели различных реальных процессоров MIPS. Вы можете запустить Linux на OVPsim, и вы сможете запустить исполняемый файл MIPS Linux, созданный clang, на этом смоделированном Linux.

person markgz    schedule 11.07.2013
comment
Другой способ, если вы используете Linux, — использовать эмулятор пользовательского режима QEMU Linux для Mips. Это то, что я использую для своей цепочки инструментов ELLCC на основе clang. (ellcc.org) - person Richard Pennington; 11.07.2013

Принтер сборки Mips в LLVM выдает сборку в формате GAS (подходит для использования ассемблером GNU и совместимыми инструментами). Есть очень большая вероятность, что SPIM не сможет это прочитать. Однако, если SPIM может читать двоичные файлы Mips, вы можете попытаться создать объектный файл из LLVM и позволить SPIM справиться с этим.

Двоичные файлы более «универсальны», поскольку их должен понимать сам ЦП. Увы, каждый ассемблер обычно имеет свой собственный специфический синтаксис, понятный только ему, а ассемблеры, как правило, несовместимы друг с другом и расходятся в основных вещах, таких как порядок операторов, семантика пунктуации, директивы и т.д.

person Eli Bendersky    schedule 10.07.2013