2021-06-17

vak: (Default)
Еще одна познавательная статья, как народ пишет компиляторы на Русте.

https://thume.ca/2019/04/18/writing-a-compiler-in-rust/
vak: (Default)
Набрёл на забавную багу на платке RISC-V. Установил clang из пакетов стандартным образом: "sudo apt install clang", все дела. Вызываю clang без параметров, и внезапно:
$ clang
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace, preprocessed source, and associated run script.
Stack dump:
0. Program arguments: clang
1. Compilation construction
/usr/lib/riscv64-linux-gnu/libLLVM-11.so.1(_ZN4llvm3sys15PrintStackTraceERNS_11raw_ostreamE+0x28)[0x3ff17dec08]
Illegal instruction
Проверил несколько других компиляторов: gcc, rustc, golang. Всё пашет как положено, один clang валится как прокажённый. Написал в bugs.llvm.org - говорят, обращайтесь к своим Debian саппортерам, наворотили чего для RISC-V небось. Посоветовали попробовать собрать с исходников.

Ладно, мне нетрудно, запустил сборку. Процесс компиляции неспешный выходит, боюсь, сутки займёт.
vak: (Default)
Оказывается, Гугл уже несколько лет развивает собственную процессорную архитектуру, которая называется Lanai. Про неё стало известно пять лет назад, когда Гугл добавил её реализацию в компилятор Clang:

"LLVM Patches Confirm Google Has Its Own In-House Processor"

Подробности архитектуры Гугл не раскрывает, и доступный хардвер не обещает. Чуть больше подробностей можно найти в статье:

"Google crafts custom networking CPU with parallel computing links"

Вроде как 32-битный процессор с 32 регистрами общего назначения. Утверждается, что идея процессора навеяна книгой:

"Parallel Computer Architecture. A Hardware / Software Approach"

В компиляторе Clang имеется поддержка этой архитектуры, если задать флажок --target=lanai. Вот как выглядит язык ассемблера:
$ cat hello.c 
int main()
{
return 0;
}
$ clang --target=lanai -S -O hello.c
$ cat hello.s
.text
.file "hello.c"
.globl main ! -- Begin function main
.p2align 2
.type main,@function
main: ! @main
! %bb.0:
st %fp, [--%sp]
add %sp, 0x8, %fp
sub %sp, 0x8, %sp
or %r0, 0x0, %rv
ld -4[%fp], %pc ! return
add %fp, 0x0, %sp
ld -8[%fp], %fp
.Lfunc_end0:
.size main, .Lfunc_end0-main
! -- End function
.ident "clang version 10.0.0-4ubuntu1 "
.section ".note.GNU-stack","",@progbits
.addrsig
Но не всё так безнадёжно. На гитхабе я обнаружил исходники симулятора архитектуры Lanai: https://github.com/TrueBitProject/lanai