阶段2-4/2-5:Stb V2(头 128B/槽表段/值段/常量表 8B)+ Codegen V2 重写
Stb.h/.cpp V2:
- 头 128B:kOffSlots/kOffValues/kOffNSlots/kOffValuesSize/kOffMeta/kOffMaxStack
- 常量表 8B(无 tag)、槽表行 8B {addr,预留}、static_assert 更新
- StbView:新字段访问器 + slots_bytes + 段校验 6 段(含元数据空段)
Codegen V2:
- 变长指令发射(Codec 位号,emit/E_rr..E_cal/E_slot_off)
- 槽表→值段布局(1/2/4/8 对齐;实例=1 槽表条目指向字段块)
- 常量表位模式去重(LOADK 按 func 解释);字节化跳转回填
- max_stack(调用图 DAG 最长路径 + 环检测递归报错)
- 用户 FB 内联(LOAD_OFF/STORE_OFF 字段访问);内建 FB → CAL fb_id,slot
- 头 128B 拼装(version=2/STATOR2/段序)
配套:main.cpp 常量显示去 tag;codegen_test 临时剥离(阶段 3 重写);
machine_test 修正(72 op + 负例修复)。ctest:10/13 绿(vm/cases 预期内剥离)。
This commit is contained in:
+10
-9
@@ -78,16 +78,17 @@ target_compile_definitions(typecheck_test PRIVATE
|
||||
add_test(NAME typecheck_types
|
||||
COMMAND typecheck_test)
|
||||
|
||||
# TODO(V2): 阶段 3 重写 codegen_test(用 compiler::Codec 断言 V2 产物,去 isa 依赖)
|
||||
# 寄存器码测试(12.8 切片 1):用例 01/02 出映像(REPO_ROOT 注入源目录绝对路径)
|
||||
add_executable(codegen_test
|
||||
./src/codegen_test.cpp)
|
||||
|
||||
target_link_libraries(codegen_test PRIVATE compiler isa)
|
||||
target_compile_definitions(codegen_test PRIVATE
|
||||
REPO_ROOT="${CMAKE_SOURCE_DIR}")
|
||||
|
||||
add_test(NAME codegen_slice1
|
||||
COMMAND codegen_test)
|
||||
# add_executable(codegen_test
|
||||
# ./src/codegen_test.cpp)
|
||||
#
|
||||
# target_link_libraries(codegen_test PRIVATE compiler isa)
|
||||
# target_compile_definitions(codegen_test PRIVATE
|
||||
# REPO_ROOT="${CMAKE_SOURCE_DIR}")
|
||||
#
|
||||
# add_test(NAME codegen_slice1
|
||||
# COMMAND codegen_test)
|
||||
|
||||
# VM 测试:手工映像 + 编译器产物 + 定时器 + 确定性(REPO_ROOT 注入源目录绝对路径)
|
||||
add_executable(vm_test
|
||||
|
||||
@@ -132,7 +132,7 @@ static bool test_positive() {
|
||||
CHECK(cfg.find_type("DT") != nullptr && cfg.find_type("DT")->func == 6);
|
||||
CHECK(cfg.find_type("NOPE") == nullptr);
|
||||
|
||||
CHECK(cfg.ops().size() == 68);
|
||||
CHECK(cfg.ops().size() == 72);
|
||||
const compiler::ConfigOp* move = cfg.find_op("MOVE");
|
||||
CHECK(move != nullptr && move->prefix == "11" && move->op == 0 && move->fmt == "RR" &&
|
||||
move->func_mode == "width" && move->params.size() == 2);
|
||||
@@ -288,8 +288,8 @@ static bool test_negative() {
|
||||
// fb 字段类型未知
|
||||
{
|
||||
std::string fbs = kFbsAll;
|
||||
const std::string old = "[[\"in\", \"BOOL\"]], [\"pt\", \"TIME\"]";
|
||||
const std::string bad = "[[\"in\", \"REAL\"]], [\"pt\", \"TIME\"]";
|
||||
const std::string old = "[[\"in\", \"BOOL\"], [\"pt\", \"TIME\"]";
|
||||
const std::string bad = "[[\"in\", \"NOPE\"], [\"pt\", \"TIME\"]";
|
||||
fbs.replace(fbs.find(old), old.size(), bad);
|
||||
if (!expect_load_err("mc_v2_bad12.toml", m + kTypesAll + kOpsBasic + fbs,
|
||||
"unknown field type")) {
|
||||
|
||||
Reference in New Issue
Block a user