From e74635a3cfb48d1338ce4d8649f84202752c1915 Mon Sep 17 00:00:00 2001 From: Anders Blomdell <anders.blomdell@control.lth.se> Date: Tue, 9 Dec 2014 18:54:52 +0100 Subject: [PATCH] Corrected sizeof for 2006 C-code --- compiler/2006/C_CodeGen.jrag | 35 +++++++++++++++++------------ lib/c/2006/Makefile | 2 ++ lib/c/2006/test/test_labcomm.c | 22 +++++++++--------- lib/c/2006/test/test_labcomm_copy.c | 21 +++++++++++------ lib/c/2006/test/test_sample.lc | 2 +- 5 files changed, 49 insertions(+), 33 deletions(-) diff --git a/compiler/2006/C_CodeGen.jrag b/compiler/2006/C_CodeGen.jrag index 0beef11..26346d4 100644 --- a/compiler/2006/C_CodeGen.jrag +++ b/compiler/2006/C_CodeGen.jrag @@ -1589,36 +1589,43 @@ aspect C_Sizeof { } } + public void Exp.C_emitSizeof(C_env env, int i) { + } + + public void VariableSize.C_emitSizeof(C_env env, int i) { + env.println("result += labcomm"+env.verStr+"_size_packed32(" + + env.qualid + env.memberAccessor() + "n_" + i + ");"); + } + public void ArrayType.C_emitSizeof(C_env env) { + for (int i = 0 ; i < getNumExp() ; i++) { + getExp(i).C_emitSizeof(env, i); + } if (getType().C_isDynamic()) { env.println("{"); env.indent(); C_emitLoopVariables(env); for (int i = 0 ; i < getNumExp() ; i++) { - String iterator = "i_" + env.depth + "_" + i; - env.println("for (" + iterator + " = 0" + - " ; " + - iterator + " < " + getExp(i).C_getLimit(env, i) + - " ; " + - iterator + "++) {"); - env.indent(); + String iterator = "i_" + env.depth + "_" + i; + env.println("for (" + iterator + " = 0" + + " ; " + + iterator + " < " + getExp(i).C_getLimit(env, i) + + " ; " + + iterator + "++) {"); + env.indent(); } C_emitCalcIndex(env); getType().C_emitSizeof(C_Nest(env)); for (int i = 0 ; i < getNumExp() ; i++) { - env.unindent(); - env.println("}"); + env.unindent(); + env.println("}"); } env.unindent(); env.println("}"); } else { - for (int i = 0 ; i < getNumExp() ; i++) { - env.println("result += labcomm"+env.verStr+"_size_packed32(" + - getExp(i).C_getLimit(env, i) + ");"); - } env.print("result += " + getType().C_fixedSizeof()); for (int i = 0 ; i < getNumExp() ; i++) { - env.print(" * " + getExp(i).C_getLimit(env, i)); + env.print(" * " + getExp(i).C_getLimit(env, i)); } env.println(";"); } diff --git a/lib/c/2006/Makefile b/lib/c/2006/Makefile index e418fbc..194b0bc 100644 --- a/lib/c/2006/Makefile +++ b/lib/c/2006/Makefile @@ -92,6 +92,8 @@ $(TEST_DIR)/gen/%: $(TEST_DIR)/gen/%.o | $(TEST_DIR)/gen $(TEST_DIR)/gen/%.o: $(TEST_DIR)/%.c | $(TEST_DIR)/gen $(CC) $(CFLAGS_TEST) -o $@ -c $< +.PRECIOUS: $(TEST_DIR)/gen/%.c +.PRECIOUS: $(TEST_DIR)/gen/%.h $(TEST_DIR)/gen/%.c $(TEST_DIR)/gen/%.h: $(TEST_DIR)/%.lc | $(TEST_DIR)/gen $(LABCOMM) \ --c=$(TEST_DIR)/gen/$*.c \ diff --git a/lib/c/2006/test/test_labcomm.c b/lib/c/2006/test/test_labcomm.c index 088f1b5..64a6c9e 100644 --- a/lib/c/2006/test/test_labcomm.c +++ b/lib/c/2006/test/test_labcomm.c @@ -103,13 +103,13 @@ static struct labcomm2006_reader reader = { static int32_t encoder_data[256]; static test_sample_test_var encoder_var = { .n_0 = 1, - .n_1 = 1, + .n_2 = 1, .a = encoder_data, }; static int32_t decoder_data[256]; static test_sample_test_var decoder_var = { .n_0 = 1, - .n_1 = 1, + .n_2 = 1, .a = decoder_data, };; @@ -151,27 +151,27 @@ int test_decode_one(struct labcomm2006_decoder *decoder) static void test_encode_decode(struct labcomm2006_encoder *encoder, struct labcomm2006_decoder *decoder, - int expected, uint32_t n_0, uint32_t n_1) + int expected, uint32_t n_0, uint32_t n_2) { int err; writer.pos = 0; encoder_var.n_0 = n_0; - encoder_var.n_1 = n_1; + encoder_var.n_2 = n_2; encoder_var.a[0] = 314; labcomm2006_encode_test_sample_test_var(encoder, &encoder_var); err = test_decode_one(decoder); - fprintf(stderr, "decode of sample %u * %u -> size=%d err=%d\n", - n_0, n_1, writer.pos, err); + fprintf(stderr, "decode of sample %u * 2 * %u -> size=%d err=%d\n", + n_0, n_2, writer.pos, err); if (writer.pos != labcomm2006_sizeof_test_sample_test_var(&encoder_var)) { - fprintf(stderr, "Incorrect sizeof %u * %u (%d != %d)\n", - n_0, n_1, + fprintf(stderr, "Incorrect sizeof %u * 2 * %u (%d != %d)\n", + n_0, n_2, writer.pos, labcomm2006_sizeof_test_sample_test_var(&encoder_var)); exit(1); } if (writer.pos != expected) { fprintf(stderr, "Unexpected size %u * %u (%d != %d)\n", - n_0, n_1, + n_0, n_2, writer.pos, expected); exit(1); } @@ -196,13 +196,13 @@ int main(void) labcomm2006_encoder_register_test_sample_test_var(encoder); err = test_decode_one(decoder); fprintf(stderr, "decode of register -> index %d\n", err); - test_encode_decode(encoder, decoder, 16, 1, 1); + test_encode_decode(encoder, decoder, 20, 1, 1); if (decoder_var.a[0] != encoder_var.a[0]) { fprintf(stderr, "Failed to decode correct value %d != %d\n", encoder_var.a[0], decoder_var.a[0]); exit(1); } - test_encode_decode(encoder, decoder, 28, 2, 2); + test_encode_decode(encoder, decoder, 44, 2, 2); test_encode_decode(encoder, decoder, 12, 0, 0); for (i = 1 ; i <= 4 ; i++) { test_encode_decode(encoder, decoder, 12, 0, (1<<(7*i))-1); diff --git a/lib/c/2006/test/test_labcomm_copy.c b/lib/c/2006/test/test_labcomm_copy.c index e554e1e..aa7723c 100644 --- a/lib/c/2006/test/test_labcomm_copy.c +++ b/lib/c/2006/test/test_labcomm_copy.c @@ -123,11 +123,13 @@ int main(int argc, char **argv) labcomm2006_encoder_register_test_sample_test_var(encoder); test_var.n_0 = 2; - test_var.n_1 = 7; - test_var.a = calloc(test_var.n_0 * test_var.n_1, sizeof(*test_var.a)); + test_var.n_2 = 7; + test_var.a = calloc(test_var.n_0 * 2 * test_var.n_2, sizeof(*test_var.a)); for (int i = 0; i < test_var.n_0; i++) - for (int j = 0; j < test_var.n_1; j++) - test_var.a[i] = 10 * i + j; + for (int j = 0; j < 2; j++) + for (int k = 0; k < test_var.n_2; k++) { + test_var.a[(((i) * 2 + j) * test_var.n_2) + k] = 100 * i + 10 * j + k; + } labcomm2006_encode_test_sample_test_var(encoder, &test_var); labcomm2006_encoder_register_more_types_A(encoder); @@ -194,10 +196,15 @@ int main(int argc, char **argv) puts("P copied ok"); assert(cache_test_var.n_0 == test_var.n_0); - assert(cache_test_var.n_1 == test_var.n_1); + assert(cache_test_var.n_2 == test_var.n_2); for (int i = 0; i < test_var.n_0; i++) - for (int j = 0; j < test_var.n_1; j++) - assert(cache_test_var.a[p.n_0 * i + j] == test_var.a[p.n_0 * i + j]); + for (int j = 0; j < 2; j++) + for (int k = 0; k < test_var.n_2; k++) { + assert(cache_test_var.a[(((i) * 2 + j) * test_var.n_2) + k] == + test_var.a[(((i) * 2 + j) * test_var.n_2) + k]); + assert(cache_test_var.a[(((i) * 2 + j) * test_var.n_2) + k] == + 100 * i + 10 * j + k); + } free(test_var.a); puts("test_var copied ok"); diff --git a/lib/c/2006/test/test_sample.lc b/lib/c/2006/test/test_sample.lc index bac6bb6..302c615 100644 --- a/lib/c/2006/test/test_sample.lc +++ b/lib/c/2006/test/test_sample.lc @@ -1 +1 @@ -sample int test_var[_,_]; +sample int test_var[_,2,_]; -- GitLab