LINUX.ORG.RU

vim-syntastic, assembler and different architectures (riscv64 for example)

 , , , ,


0

1

Захотел я вернуться к истокам и научиться писать на ассемблере risc-v (больше 20 лет назад знал ассемблер Z80).

Работаю в VIM, использую vim-syntastic для автоматической подсветки ошибок/предупреждений в Python/Shell.

Использую Xubuntu 20.04 amd64, можно и Gentoo если надо посвежее. Установил пакеты gcc-riscv64-unknown-elf binutils-riscv64-unknown-elf

Взял Hello world отсюда: https://git.sr.ht/~matthias_t/hello-riscv/tree/master/item/src/hello.s (вообще из этой статьи, если кому интересно: Hello, RISC-V and QEMU).

Проблема 1: Error: no such instruction … [asm/gcc]

Открываю hello.s в VIM, вижу:

hello.s|4 error| Error: no such instruction: `li s1,0x10000000' [asm/gcc]
hello.s|5 error| Error: no such instruction: `la s2,message' [asm/gcc]
hello.s|6 error| Error: no such instruction: `addi s3,s2,14' [asm/gcc]
hello.s|8 error| Error: no such instruction: `lb s4,0(s2)' [asm/gcc]
hello.s|9 error| Error: no such instruction: `sb s4,0(s1)' [asm/gcc]

Ну понятно, что системные gcc/as не умеют riscv64. Нашёл решение, прописал в ~/.vimrc:

let g:syntastic_asm_compiler = 'riscv64-unknown-elf-gcc'

Больше не ругается.

Проблема 2: vim-syntastic теперь не подсказывает ошибки

По какой-то причине теперь в VIM осталась подсветка синтаксиса, но больше нет ругани на ошибки, даже если я их специально допускаю.

Вывод :SyntasticInfo в обоих случаях (с заданным syntastic_asm_compiler и без него) одинаковый:

Syntastic version: 3.10.0 (Vim 801, Linux)
Info for filetype: asm
Global mode: active
Filetype asm is active
The current file will be checked automatically
Available checker: gcc
Currently enabled checker: gcc

Как бы сделать так, чтобы vim-syntastic подсказывал ошибки и предупреждения для riscv64?

★★

Если сделать

:SyntasticCheck asm

то в :messages видно:

syntastic: warning: checker asm is not available

Попробовал задать let g:syntastic_asm_checkers = ['riscv64-unknown-elf-gcc'] или let g:syntastic_asm_checkers = ['riscv64-unknown-elf-as', 'as'], не помогает.

LeNiN ★★
() автор топика

Проверь, что твой riscv64-unknown-elf-gcc вываливает на файл с ошибками - будет ли его errorformat разобран.

LamerOk ★★★★★
()
Последнее исправление: LamerOk (всего исправлений: 1)
Ответ на: комментарий от LamerOk

Не знаю, как это проверить. Но нашёл какие-то опции в /usr/share/vim/addons/syntax_checkers/asm/gcc.vim и запустил с ними:

 % gcc -x assembler -fsyntax-only hello.s 
hello.s: Assembler messages:
hello.s:4: Error: no such instruction: `li s1,0x10000000'
hello.s:5: Error: no such instruction: `la s2,message'
hello.s:6: Error: no such instruction: `addi s3,s2,14'
hello.s:8: Error: no such instruction: `lb s4,0(s2)'
hello.s:9: Error: no such instruction: `sb s4,0(s1)'
hello.s:10: Error: no such instruction: `addi s2,s2,1'
hello.s:11: Error: no such instruction: `blt s2,s3,1b'
 % riscv64-unknown-elf-gcc -x assembler -fsyntax-only hello.s

Потом специально испортил код, иначе riscv64-unknown-elf-gcc -x assembler -fsyntax-only hello.s не выдаёт никаких ошибок, и запустил его:

 % riscv64-unknown-elf-gcc -x assembler -fsyntax-only hello.s
hello.s: Assembler messages:
hello.s:4: Error: unrecognized opcode `lixx s1,0x10000000'
hello.s:15: Error: unknown pseudo-op: `.string1'

На первый взгляд, формат такой же. И он описан в errorformat как

        \     '%f:%l:%c: %trror: %m,' .
LeNiN ★★
() автор топика
Ответ на: комментарий от LamerOk

riscv64-unknown-elf-gcc есть в $PATH, но кто знает что там внутри VIM, поэтому прописал:

let g:syntastic_asm_compiler = '/usr/bin/riscv64-unknown-elf-gcc'
let g:syntastic_asm_checkers = ['/usr/bin/riscv64-unknown-elf-gcc']

Теперь при открытии файла hello.s:

Error detected while processing function <SNR>22_VimEnterHook[7]..<SNR>22_UpdateErrors[15]..<SNR>22_CacheErrors[20]..81[33]..90[1]..89:
line    9:
E716: Key not present in Dictionary: asm
Error detected while processing function <SNR>22_VimEnterHook[7]..<SNR>22_UpdateErrors[15]..<SNR>22_CacheErrors[20]..81[33]..90[1]..89:
line    9:
E116: Invalid arguments for function get(self._checkerMap[ft], name, {})

Если не задавать g:syntastic_asm_checkers, то этих ошибок нет, но и в коде ошибки не подсказывает (как и до этого).

LeNiN ★★
() автор топика

Для эксперимента, убрал из .vimrc оба g:syntastic_asm_compiler и g:syntastic_asm_checkers и просто поменял симлинк:

 # ll /usr/bin/gcc
lrwxrwxrwx 1 root root 5 Mar 20  2020 /usr/bin/gcc -> gcc-9*
 # ln -f -v -s /usr/bin/riscv64-unknown-elf-gcc /usr/bin/gcc
'/usr/bin/gcc' -> '/usr/bin/riscv64-unknown-elf-gcc'
 # ll /usr/bin/gcc
lrwxrwxrwx 1 root root 32 Aug 25 09:45 /usr/bin/gcc -> /usr/bin/riscv64-unknown-elf-gcc*

То же самое: подсветка синтаксиса есть, но явные ошибки не показывает.

Вернул /usr/bin/gcc как был раньше. Выставил:

let g:syntastic_asm_compiler = 'riscv64-unknown-elf-gcc'
let g:syntastic_asm_checkers = ['riscv64-unknown-elf-gcc']

То же самое: подсветка синтаксиса есть, явные ошибки не показывает.

Вывод :SyntasticInfo:

Syntastic version: 3.10.0 (Vim 801, Linux)
Info for filetype: asm
Global mode: active
Filetype asm is active
The current file will be checked automatically
Available checker: gcc
Currently enabled checkers: -

Странно что Currently enabled checkers теперь пустой.

LeNiN ★★
() автор топика
Ответ на: комментарий от LeNiN

Странно что Currently enabled checkers теперь пустой.

filetype точно asm?

LamerOk ★★★★★
()
8 ноября 2021 г.

binfmt-support + qemu-user-static + riscv chroot

Дабы не возиться со всеми костылями, описанными выше, сделал отдельный chroot для проверки кода, с архитектурой riscv, по этой документации: https://wiki.debian.org/RISC-V#Qemu

Ассемблерные файлы так и не подсвечивались, включил let g:syntastic_debug = 3, увидел в messages:

syntastic: 0.575801: checker output: [‘gcc: error: unrecognized command-line option ‘-masm=att’’, '']

Убрал из /usr/share/vim/addons/syntax_checkers/asm/gcc.vim код: . (g:syntastic_asm_generic ? '' : ' -masm=' . s:GetDialect(buf)), и наконец-то проверка заработала!

LeNiN ★★
() автор топика
Последнее исправление: LeNiN (всего исправлений: 1)
6 января 2022 г.
Ответ на: binfmt-support + qemu-user-static + riscv chroot от LeNiN

Можно и без отдельного chroot:

let g:syntastic_asm_gcc_exec = '~/.platformio/packages/toolchain-gd32v/bin/riscv-nuclei-elf-gcc'

Где toolchain-gd32v я установил с помощью PlatformIO:

pio settings set enable_telemetry No
pio project init --ide vim --board sipeed-longan-nano

toolchain-gd32v, как я понимаю, скачивается из https://github.com/riscv-mcu/riscv-gnu-toolchain.

Ну и готовый кусок кода для asm/gcc.vim с вырезанным -masm=…:

"============================================================================
"File:        gcc.vim
"Description: Syntax checking for at&t and intel assembly files with gcc
"Maintainer:  Josh Rahm <joshuarahm@gmail.com>
"License:     This program is free software. It comes without any warranty,
"             to the extent permitted by applicable law. You can redistribute
"             it and/or modify it under the terms of the Do What The Fuck You
"             Want To Public License, Version 2, as published by Sam Hocevar.
"             See http://sam.zoy.org/wtfpl/COPYING for more details.
"============================================================================

…

function! SyntaxCheckers_asm_gcc_GetLocList() dict " {{{1
    let buf = bufnr('')
    return syntastic#c#GetLocList('asm', 'gcc', {
        \ 'errorformat':
        \     '%-G%f:%s:,' .
        \     '%f:%l:%c: %trror: %m,' .
        \     '%f:%l:%c: %tarning: %m,' .
        \     '%f:%l: %m',
        \ 'main_flags': '-x assembler -fsyntax-only' })
endfunction " }}}1

Подробности выкладываю на wiki.gentoo.org: PlatformIO + VIM + ccls + Sipeed Longan nano RISC-V.

LeNiN ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.