From c2915c086aecef4dcbb3e8e0b52f3af5051e76cf Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Tue, 20 Jun 2023 20:37:33 +0100 Subject: [PATCH] Change calling convention for FILE_OPEN to handle different integer sizes Fixes #724 --- src/jit/jit-exits.c | 14 +++++--------- src/jit/jit-exits.h | 3 +-- src/jit/jit-irgen.c | 15 ++++++++++----- src/rt/rt.h | 2 +- test/regress/issue724.vhd | 29 +++++++++++++++++++++++++++++ test/regress/testlist.txt | 1 + 6 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 test/regress/issue724.vhd diff --git a/src/jit/jit-exits.c b/src/jit/jit-exits.c index 29e29f3d..2fc55845 100644 --- a/src/jit/jit-exits.c +++ b/src/jit/jit-exits.c @@ -107,17 +107,14 @@ void x_file_write(void **_fp, uint8_t *data, int32_t len) fwrite(data, 1, len, *fp); } -void x_file_read(void **_fp, uint8_t *data, int32_t size, int32_t count, - int32_t *out) +int64_t x_file_read(void **_fp, uint8_t *data, int64_t size, int64_t count) { FILE **fp = (FILE **)_fp; if (*fp == NULL) jit_msg(NULL, DIAG_FATAL, "read from closed file"); - size_t n = fread(data, size, count, *fp); - if (out != NULL) - *out = n; + return fread(data, size, count, *fp); } void x_file_close(void **_fp) @@ -1004,11 +1001,10 @@ void __nvc_do_exit(jit_exit_t which, jit_anchor_t *anchor, jit_scalar_t *args, { void **_fp = args[0].pointer; uint8_t *data = args[1].pointer; - int32_t size = args[2].integer; - int32_t count = args[3].integer; - int32_t *out = args[4].pointer; + int64_t size = args[2].integer; + int64_t count = args[3].integer; - x_file_read(_fp, data, size, count, out); + args[0].integer = x_file_read(_fp, data, size, count); } break; diff --git a/src/jit/jit-exits.h b/src/jit/jit-exits.h index 3baeb96b..3e40afb4 100644 --- a/src/jit/jit-exits.h +++ b/src/jit/jit-exits.h @@ -47,8 +47,7 @@ void x_sched_waveform_s(sig_shared_t *ss, uint32_t offset, uint64_t scalar, void x_file_open(int8_t *status, void **_fp, const uint8_t *name_bytes, int32_t name_len, int8_t mode); void x_file_write(void **_fp, uint8_t *data, int32_t len); -void x_file_read(void **_fp, uint8_t *data, int32_t size, int32_t count, - int32_t *out); +int64_t x_file_read(void **_fp, uint8_t *data, int64_t size, int64_t count); void x_file_close(void **_fp); int8_t x_endfile(void *_f); void x_index_fail(int32_t value, int32_t left, int32_t right, int8_t dir, diff --git a/src/jit/jit-irgen.c b/src/jit/jit-irgen.c index 54e3f040..b465e8bd 100644 --- a/src/jit/jit-irgen.c +++ b/src/jit/jit-irgen.c @@ -2926,17 +2926,22 @@ static void irgen_op_file_read(jit_irgen_t *g, int op) jit_value_t size = jit_value_from_int64(irgen_size_bytes(elem_type)); - jit_value_t outlen = jit_null_ptr(); - if (vcode_count_args(op) >= 4) - outlen = irgen_get_arg(g, op, 3); - j_send(g, 0, file); j_send(g, 1, ptr); j_send(g, 2, size); j_send(g, 3, count); - j_send(g, 4, outlen); macro_exit(g, JIT_EXIT_FILE_READ); + + if (vcode_count_args(op) >= 4) { + vcode_type_t out_type = vcode_reg_type(vcode_get_arg(op, 3)); + jit_size_t out_size = irgen_jit_size(vtype_pointed(out_type)); + + jit_value_t outarg = irgen_get_arg(g, op, 3); + jit_value_t outptr = jit_addr_from_value(outarg, 0); + jit_value_t len = j_recv(g, 0); + j_store(g, out_size, len, outptr); + } } static void irgen_op_file_write(jit_irgen_t *g, int op) diff --git a/src/rt/rt.h b/src/rt/rt.h index feab093d..a2c75718 100644 --- a/src/rt/rt.h +++ b/src/rt/rt.h @@ -23,7 +23,7 @@ #include -#define RT_ABI_VERSION 17 +#define RT_ABI_VERSION 18 #define RT_ALIGN_MASK 0x7 #define RT_MULTITHREADED 0 diff --git a/test/regress/issue724.vhd b/test/regress/issue724.vhd new file mode 100644 index 00000000..3b5bb3cb --- /dev/null +++ b/test/regress/issue724.vhd @@ -0,0 +1,29 @@ +use std.textio.all ; + +entity issue724 is +end entity ; + +architecture arch of issue724 is + + constant FNAME : string := "./dummy.txt" ; + +begin + + tb : process + file fin : text ; + variable l : line ; + variable a, b : integer ; + variable count : natural := 0 ; + begin + file_open(fin, FNAME, write_mode) ; + write(l, string'("hello, world")); + writeline(fin, l); + file_close(fin); + + file_open(fin, FNAME, read_mode) ; + readline(fin, l) ; + assert l.all /= "" report "Empty line read" severity failure ; + file_close(fin) ; + std.env.stop ; + end process ; +end architecture; diff --git a/test/regress/testlist.txt b/test/regress/testlist.txt index ec72727b..8238f131 100644 --- a/test/regress/testlist.txt +++ b/test/regress/testlist.txt @@ -808,3 +808,4 @@ issue714 normal elab39 shell issue718 normal,gold,2008 issue726 normal,2008 +issue724 normal,2019 -- 2.39.2