FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VのJavascriptエミュレータはC言語から生成されている

前回の続き。RISC-Vエミュレータであるriscvemuのコンパイルオプションを調べていたのだが、やっと意味が分かってきた。

riscvemuのディレクトリにはjs/が入っており、RISC-VのJavascriptエミュレータが入っている。 最初はC言語からこのJavascript記述を呼び出しているのかと思ったが、その逆だった。C言語の記述から、Javascriptのファイルを生成していたのだ。

考えてみれば、これは当然のことだ。EmscriptenC言語記述からJavascriptを生成するものだ。なのでWebで動作するRISC-VエミュレータEmscriptenで生成しているのも納得できる。

Makefile.jsに生成スクリプトが格納されていた。

# build Javascript version of riscvemu
EMCC=emcc
EMCFLAGS=-O2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing
#EMCFLAGS+=-Werror
EMCFLAGS+=-DMAX_XLEN=64
EMLDFLAGS=-g -O3 -s TOTAL_MEMORY=536870912 --memory-init-file 0 --closure 0 -s NO_EXIT_RUNTIME=1 -s "EXPORTED_FUNCTIONS=['_console_queue_char','_main']"

all: js/riscvemu.js

JS_OBJS=riscvemu.js.o softfp.js.o ide.js.o

js/riscvemu.js: $(JS_OBJS)
        $(EMCC) $(EMLDFLAGS) -o $@ $(JS_OBJS)

%.js.o: %.c
        $(EMCC) $(EMCFLAGS) -c -o $@ $<

以下で実行してみた。

$ make -f Makefile.js
emcc -O2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing -DMAX_XLEN=64 -c -o riscvemu.js.o riscvemu.c
INFO:root:generating system asset: is_vanilla.txt... (this will be cached in "/home/vagrant/.emscripten_cache/is_vanilla.txt" for subsequent builds)
INFO:root: - ok
INFO:root:(Emscripten: Running sanity checks)
riscvemu.c:495:1: warning: unused function 'phys_read_u8' [-Wunused-function]
PHYS_MEM_READ_WRITE(8, uint8_t)
^
riscvemu.c:486:25: note: expanded from macro 'PHYS_MEM_READ_WRITE'
static inline uint_type phys_read_u ## size(RISCVCPUState *s, target_ulong addr) \
                        ^
<scratch space>:9:1: note: expanded from here
phys_read_u8
^
1 warning generated.
emcc -O2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing -DMAX_XLEN=64 -c -o softfp.js.o softfp.c
emcc -O2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing -DMAX_XLEN=64 -c -o ide.js.o ide.c
emcc -g -O3 -s TOTAL_MEMORY=536870912 --memory-init-file 0 --closure 0 -s NO_EXIT_RUNTIME=1 -s "EXPORTED_FUNCTIONS=['_console_queue_char','_main']" -o js/riscvemu.js riscvemu.js.o softfp.js.o ide.js.o
INFO:root:generating system library: libc.bc... (this will be cached in "/home/vagrant/.emscripten_cache/asmjs/libc.bc" for subsequent builds)

INFO:root: - ok
INFO:root:generating system library: dlmalloc.bc... (this will be cached in "/home/vagrant/.emscripten_cache/asmjs/dlmalloc.bc" for subsequent builds)
INFO:root: - ok
warning: Output contains some very large functions (3671 lines in _riscv_cpu_interp64), consider building source files with -Os or -Oz, and/or trying OUTLINING_LIMIT to break them up (see settings.js; note that the parameter there affects AST nodes, while we measure lines here, so the two may not match up)