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
К сожалению, когда я пытаюсь запустить его в моем надежном симуляторе 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
2 ответа
Spim - это простой обучающий инструмент, который не поддерживает ассемблер gnu. Вы можете попробовать использовать OVPsim, который имеет полные модели различных реальных процессоров MIPS. Вы можете запустить Linux на OVPsim, и у вас должна быть возможность запустить исполняемый файл MIPS Linux, созданный clang, на этом симулированном Linux.
Сборочный принтер Mips в LLVM осуществляет сборку в формате GAS (подходит для использования ассемблером GNU и совместимыми инструментами). Есть очень хороший шанс, что SPIM не сможет это прочитать. Однако, если SPIM может читать двоичные файлы Mips, вы можете попытаться создать объектный файл из LLVM и позволить SPIM обработать это.
Двоичные файлы являются более "универсальными", поскольку они должны быть поняты самим процессором. Увы, у каждого ассемблера обычно есть свой собственный специфический синтаксис, который он понимает, и ассемблеры не склонны быть совместимыми друг с другом и не соглашаются в базовых вещах, таких как упорядочение операторов, семантика пунктуации, директивы и так далее.