记录 Gnu Modula 2

Gnu Modula 2 在 gcc 源码目录里,属于处理源代码的前端。根据职业生涯所学从 AST 到 GIMPLE 到 pass 到 RTL, 竟不知从何下手去移植到 RISC-V。 查询了一下 modula 2 的用法。和 gcc 较为相似,使用 gm2 编译运行 .mod 文件。 猜测是也能在 riscv-gnu-toolchain 里生成可执行文件,类似于 riscv-gnu-unknown-linux/elf-gcc。 将 gcc 切换到 devel/modula-2 分支之后,使用 --with=rv64gc --with-abi-lp64d 编译了一次,缺少某个库而报错。 意外的是,如果进入 gcc 文件夹,使用 --enable-libgm2 GM2_for_target=riscv 配置一下之后,编译通过了。 想到修改 makefile 。添加 makefile 的难处在于,gm2 在 gcc 文件夹中,如何使之脱离 gcc 并能够使用。

<span title='2023-11-16 11:30:03 +0000 UTC'>November 16, 2023</span>&nbsp;·&nbsp;xyenchi

debug record

工具链 riscv-gnu-toolchain 源码 https://github.com/gcc-mirror/gcc/blob/master/gcc/common/config/riscv/riscv-common.cc 方法 git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git ./configure --prefix="$PWD/opt" --with-arch=rv64gc --with-abi=lp64d make -j $(nproc) make linux -j $(nproc) gdb opt/riscv64-unknown-linux-gnu-gcc 没想到想办法实现了好几天的 -march=rv64gcv0p7 解析成 rv64i2p1_m2p0_a2p1_f2p2 _d2p2 _c2p0 _v0p7 而不是 rv64i2p1_m2p0_a2p1_f2p2_d2p2_c2p0_v0p7_zicsr2p0_zifencei2p0_zve32f1p0_zve32x1p0_zve64d1p0_zve64f1p0_zve64x1p0_zvl128b1p0_zvl32b1p0_zvl64b1p0 因为 T head 实现方法是 -march=rv64gcXthreadVector 而搁置了。 初期是在 handle_implied_ext 前面判断版本。但是发现参数 *ext 在与 riscv_implied_info[] 比较,没有获取大小版本的机会,于是引入了一个参数指给 riscv_ext_version_table[]。还用过 get_default_version,始终卡在不知道获取了哪个扩展的 major_version = 2, minor_version = 0。 继而想在parse调用 handle_implied_ext 之前判断出大小版本返回 implied_version_p = false。但是使用前文中的 itr 调用 lookup()始终不对。自此编程苦手烂尾。

<span title='2023-11-06 11:30:03 +0000 UTC'>November 6, 2023</span>&nbsp;·&nbsp;xyenchi