前回の続き。RISC-Vエミュレータであるriscvemuのコンパイルオプションを調べていたのだが、やっと意味が分かってきた。
riscvemuのディレクトリにはjs/
が入っており、RISC-VのJavascriptエミュレータが入っている。
最初はC言語からこのJavascript記述を呼び出しているのかと思ったが、その逆だった。C言語の記述から、Javascriptのファイルを生成していたのだ。
考えてみれば、これは当然のことだ。EmscriptenはC言語記述から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)