From 97f7347addc84535620fdd5d5e78ea83f1536874 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Fri, 18 Nov 2022 21:05:40 +0000 Subject: [PATCH] Fix address calculation in irgen_op_memset. Issue #575 --- src/jit/jit-irgen.c | 4 +++- test/jit/issue575.vhd | 15 +++++++++++++++ test/test_jit.c | 26 ++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 test/jit/issue575.vhd diff --git a/src/jit/jit-irgen.c b/src/jit/jit-irgen.c index bc4bf0d2..287898b3 100644 --- a/src/jit/jit-irgen.c +++ b/src/jit/jit-irgen.c @@ -1082,6 +1082,8 @@ static void irgen_op_memset(jit_irgen_t *g, int op) irgen_label_t *l_exit = irgen_alloc_label(g); irgen_label_t *l_head = irgen_alloc_label(g); + jit_value_t base_ptr = irgen_lea(g, base); + j_cmp(g, JIT_CC_LE, length, jit_value_from_int64(0)); j_jump(g, JIT_CC_T, l_exit); @@ -1092,7 +1094,7 @@ static void irgen_op_memset(jit_irgen_t *g, int op) jit_value_t ctr = jit_value_from_reg(ctr_r); jit_value_t off = j_mul(g, ctr, scale); - jit_value_t ptr = j_add(g, base, off); + jit_value_t ptr = j_add(g, base_ptr, off); j_store(g, irgen_jit_size(vtype), value, jit_addr_from_value(ptr, 0)); jit_value_t next = j_add(g, ctr, jit_value_from_int64(1)); diff --git a/test/jit/issue575.vhd b/test/jit/issue575.vhd new file mode 100644 index 00000000..8282aec4 --- /dev/null +++ b/test/jit/issue575.vhd @@ -0,0 +1,15 @@ +package issue575 is + type rec is record + x : integer; + y : bit_vector(1 to 3); + end record; + + procedure test (x : out rec; val : bit); +end package; + +package body issue575 is + procedure test (x : out rec; val : bit) is + begin + x.y := (others => val); + end procedure; +end package body; diff --git a/test/test_jit.c b/test/test_jit.c index 672927fd..4e664e47 100644 --- a/test/test_jit.c +++ b/test/test_jit.c @@ -1406,6 +1406,31 @@ START_TEST(test_lvn3) } END_TEST +START_TEST(test_issue575) +{ + input_from_file(TESTDIR "/jit/issue575.vhd"); + + parse_check_simplify_and_lower(T_PACKAGE, T_PACK_BODY); + + jit_t *j = jit_new(); + + struct { + int32_t x; + uint8_t y[3]; + } rec = { 42, { 0, 0, 0 } }; + + jit_handle_t fn = + compile_for_test(j, "WORK.ISSUE575.TEST(17WORK.ISSUE575.RECJ)"); + jit_call(j, fn, NULL, NULL, &rec, 1); + + ck_assert_int_eq(rec.x, 42); + for (int i = 0; i < 3; i++) + ck_assert_int_eq(rec.y[i], 1); + + jit_free(j); +} +END_TEST + Suite *get_jit_tests(void) { Suite *s = suite_create("jit"); @@ -1445,6 +1470,7 @@ Suite *get_jit_tests(void) tcase_add_test(tc, test_lvn1); tcase_add_test(tc, test_lvn2); tcase_add_test(tc, test_lvn3); + tcase_add_test(tc, test_issue575); suite_add_tcase(s, tc); return s; -- 2.39.2