wwstage: remap error tag on try-propagate across reordered unions (#173)
wwstage cgtryprop returned the operand union's RAW tag when propagating a `c(s)?` error, while cstage (cmd/w6c/cgen.c:6161-6184) remaps it to the enclosing return union's variant ordering. When the operand and return unions differ in variant order, wwstage propagated the WRONG error variant at runtime — gate-blind: byte-id (990-997) and cstage==wwstage asm both pass because the bootstrap only ever tries same-order unions, while the differing-order case is silently wrong. Port cstage's remap loop into cgtryprop (iserror-only): for each error variant whose return-union index differs, emit the CMPQ/JNE/MOVQ/JMP that rewrites the tag in AX; the error payload words (DX/CX/R8) are untouched and ride the RET. Mirror cstage's emission exactly — lazy tryprop_ret allocation on the first remap, j==i skip, j<0 fallback, no dead label when empty, identical label strings and operand order — so same-order emits zero extra instructions (byte-id preserved) and differing-order is now byte-identical cstage==wwstage. Scope: error-variant remap only. wwstage's hardcoded success-tag=0 and iserror-only error detection (vs cstage's cg_tagged_success_tag + cg_variant_is_error legacy fallback) diverge for non-idx-0-success or unmarked unions — also gate-blind, also latent — filed separately as #216. test/wcc/925_tryprop_tag_remap_run: 5 rows (differing-order for both error variants, success unwrap, same-order byte-id witness, and a multi-word !str payload row asserting the payload bytes survive the remap), each with a cstage==wwstage .s byte-id check.
This commit is contained in:
7
Makefile
7
Makefile
@@ -248,6 +248,7 @@ TESTS = $(BIN)/test_smoke $(BIN)/test_lex $(BIN)/test_parse $(BIN)/test_check \
|
||||
$(BIN)/test_signed_data_emit_run \
|
||||
$(BIN)/test_tagged_call_arg \
|
||||
$(BIN)/test_tagged_call_arg_run \
|
||||
$(BIN)/test_tryprop_tag_remap_run \
|
||||
$(BIN)/test_sret_struct_return \
|
||||
$(BIN)/test_sret_struct_return_run \
|
||||
$(BIN)/test_sret_narrow_field \
|
||||
@@ -822,6 +823,12 @@ $(BIN)/test_tagged_call_arg_run: test/wcc/924_tagged_call_arg_run.c \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_tryprop_tag_remap_run: test/wcc/925_tryprop_tag_remap_run.c \
|
||||
$(BIN)/ww $(BIN)/w6c $(BIN)/w6a $(BIN)/w6l \
|
||||
$(BIN)/ww_ww $(BIN)/w6c_ww $(BIN)/w6a_ww $(BIN)/w6l_ww \
|
||||
$(LIB)/libwwrt.a | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
$(BIN)/test_sret_struct_return: test/wcc/721_sret_struct_return.c \
|
||||
$(BIN)/w6c $(BIN)/w6c_ww | $(BIN)
|
||||
$(CC) $(CFLAGS) -o $@ $<
|
||||
|
||||
Reference in New Issue
Block a user