ysyx-org / jemu-decoder

The decoder library for jemu execution and web documentation
https://jemu.oscc.cc
MIT License
56 stars 16 forks source link

Unable to build the decoder #20

Closed jaxvanyang closed 1 year ago

jaxvanyang commented 1 year ago

On ArchWSL, with Node.js 20.5.0 and npm 9.8.1. Install:

$ npm install

added 103 packages, and audited 105 packages in 11s

23 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

Build:

$ npm run build

> jemu-decoder@0.0.1 build
> node ./scripts/build.js

#
# Fatal error in , line 0
# Fatal JavaScript invalid size error 169220804 (see crbug.com/1201626)
#
#
#
#FailureMessage Object: 0x7fffb044cf30
 1: 0x7f07ba59297b  [/usr/bin/../lib/libnode.so.115]
 2: 0x7f07bb265f44 V8_Fatal(char const*, ...) [/usr/bin/../lib/libnode.so.115]
 3: 0x7f07baaf9302  [/usr/bin/../lib/libnode.so.115]
 4: 0x7f07bacb5070  [/usr/bin/../lib/libnode.so.115]
 5: 0x7f07bacb58c8  [/usr/bin/../lib/libnode.so.115]
 6: 0x7f07baedc81a v8::internal::Runtime_GrowArrayElements(int, unsigned long*, v8::internal::Isolate*) [/usr/bin/../lib/libnode.so.115]
 7: 0x7f075a7d9ef6
fish: Job 1, 'npm run build' terminated by signal SIGTRAP (Trace or breakpoint trap)

另外我试了 Node.js 16、18,也是类似的错误,感觉很奇怪。

jaxvanyang commented 1 year ago

另外我想问下有没有比较容易解析的官方操作码文档,因为我想给 Compiler Explorer 加上操作码帮助信息^1,但苦于没有一个稳定的 source。也可以给你们完善 YAML,但是我现在项目都跑不起来……

zhangyx1998 commented 1 year ago

已经了解该问题,正在尝试复现

zhangyx1998 commented 1 year ago

问题已解决,最新代码运行 npm run build 会输出如下警告:

Invalid range S13 in BEQ/imm
  given range is: S13, 31, 7, 25:30, 8:11, $0
  Skipping ...
Invalid range $0 in BEQ/imm
  given range is: S13, 31, 7, 25:30, 8:11, $0
  Skipping ...

上述错误依然会导致BEQ解析不正确,但是不再会导致build崩溃。

原代码没有检查上述情况,导致parseInt输出的NaN进入循环,造成无限执行Array.push()并最终导致数组越界,触发node internal error。

zhangyx1998 commented 1 year ago

另外我想问下有没有比较容易解析的官方操作码文档,因为我想给 Compiler Explorer 加上操作码帮助信息1,但苦于没有一个稳定的 source。也可以给你们完善 YAML,但是我现在项目都跑不起来……

Footnotes

  1. https://github.com/compiler-explorer/compiler-explorer/issues/4584

目前我计划采用RISC-V官方的结构化数据 riscv-opcodes 重构项目,但是会有如下几个问题:

  1. 如何处理结构化数据中的 import (也就是如何将官方数据中不同类型的指令不重不漏地解析出来,并且给每个指令打上相应的标签)。这个问题相对比较好办,但是需要自己实现一个parser,并且对官方数据中新增的语法结构保持兼容,这就需要持续投入精力开发。
  2. 如何兼容现有的多语言文字描述,这是目前的核心问题。官方结构化数据不包含指令描述,我们现有的指令描述来自另一个官方仓库 riscv-isa-manual. 但是为了多语言支持以及语言上的简洁,我们并没有直接采用原文,而是对其中的内容做了整理和总结,并进行了人工翻译。
  3. 这个项目拆分自RISC-V指令集模拟器JsEMU的解码器,并且计划日后进一步完善拓展成为一个能够提供图形化difftest功能的框架。因此,还需要可靠的指令行为描述模型。目前看来比较可行的方法是实现一个DSL解析器,并采用现有的DSL仓库作为数据源(例如 CoreDSL).

我计划于近期开始对该项目进行一次重构升级,希望尽量多地从社区获取帮助。如果你有兴趣参与开发维护的话,欢迎联系我进一步讨论。

jaxvanyang commented 1 year ago

我计划于近期开始对该项目进行一次重构升级,希望尽量多地从社区获取帮助。如果你有兴趣参与开发维护的话,欢迎联系我进一步讨论。

非常乐意,但我只是 RISC-V 的初学者,给 CE 加 help message 也只是想顺便学习一下指令集,专业的工作可能无法胜任,但我会尽量提供帮助。 重构的话我有一些想法可以讨论一下:

  1. 添加简单的 test CI,尽早检查出像编译失败这种简单错误,也可以设计针对于 parser 的测试用例。
  2. 感觉指令数据分文件保存对解析并不太方便,也许可以利用一个 yaml文件可以包含多条数据的特性整合所有的数据文件,并合并 yaml和 md 文件。不知道分文件保存是不是出于对 Web 前端的考虑。
  3. 指令描述确实比较头疼,感觉除了人工没什么太好的办法,但最好能将这个过程中的一部分自动化。
  4. DSL 我不是很了解,只能尽量尝试提供帮助了。
zhangyx1998 commented 1 year ago

ymlmd两部分是为了分开machine readable部分和human readable。

jaxvanyang commented 1 year ago

ymlmd两部分是为了分开machine readable部分和human readable。

也许可以用 machine readable 的 YAML 生成 human readable 的内容?因为就我目前来看,将现有 MD 中的内容加到 YAML 里貌似不是很难,例如:

---
opcode:
  name: ADDI
  mask: '-----------------000-----0010011'

  args:
    rs1: 19:15
    rd: 11:7
    imm: 31:20

  exec:
    rd: "rs1 + imm"

  meta:
    encoding: I
    importance: 0
description:
  locale:
    en:
       title: Add Immediate
...
    zh:
       title: 加立即数
...
    all:
       hint:
          title: `NOP` Pseudo Instruction
          content: |
             `NOP`s can be used to align...

              `ADDI` was chosen...
---
# other opcodes

麻烦的是需要重写 MD to HTML 的逻辑,但是可以方便其他用途的解析,比如我前面提到的 CE。

jaxvanyang commented 1 year ago

现在可以成功 build decoder,但是预览网页报找不到文件的错,full log:https://pastebin.com/HUXgZYNt

zhangyx1998 commented 1 year ago

现在可以成功 build decoder,但是预览网页报找不到文件的错,full log:https://pastebin.com/HUXgZYNt

git submodule init && git submodule update

jaxvanyang commented 1 year ago

git submodule init && git submodule update

ok 了,没注意到还有 submodule。