diff --git a/cc_core.c b/cc_core.c index f3e546b..5023433 100644 --- a/cc_core.c +++ b/cc_core.c @@ -388,7 +388,28 @@ void constant_load(struct token_list* a) emit_out("\n"); } -void variable_load(struct token_list* a) +void emit_dereference(int load_byte) { + if(load_byte) + { + if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("LOAD8 R0 R0 0\n"); + else if(X86 == Architecture) emit_out("LOAD_BYTE\n"); + else if(AMD64 == Architecture) emit_out("LOAD_BYTE\n"); + else if(ARMV7L == Architecture) emit_out("!0 R0 LOAD8 R0 MEMORY\n"); + else if(AARCH64 == Architecture) emit_out("DEREF_X0_BYTE\n"); + else if(RISCV64 == Architecture) emit_out("RD_A0 RS1_A0 LBU\n"); + } + else + { + if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("LOAD R0 R0 0\n"); + else if(X86 == Architecture) emit_out("LOAD_INTEGER\n"); + else if(AMD64 == Architecture) emit_out("LOAD_INTEGER\n"); + else if(ARMV7L == Architecture) emit_out("!0 R0 LOAD32 R0 MEMORY\n"); + else if(AARCH64 == Architecture) emit_out("DEREF_X0\n"); + else if(RISCV64 == Architecture) emit_out("RD_A0 RS1_A0 LD\n"); + } +} + +void variable_load(struct token_list* a, int num_dereference) { require(NULL != global_token, "incomplete variable load received\n"); if((match("FUNCTION", a->type->name) || match("FUNCTION*", a->type->name)) && match("(", global_token->s)) @@ -412,14 +433,23 @@ void variable_load(struct token_list* a) emit_out("\n"); if(TRUE == Address_of) return; - if(match("=", global_token->s)) return; + if(!match("=", global_token->s)) { + emit_dereference(FALSE); + } - if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("LOAD R0 R0 0\n"); - else if(X86 == Architecture) emit_out("LOAD_INTEGER\n"); - else if(AMD64 == Architecture) emit_out("LOAD_INTEGER\n"); - else if(ARMV7L == Architecture) emit_out("!0 R0 LOAD32 R0 MEMORY\n"); - else if(AARCH64 == Architecture) emit_out("DEREF_X0\n"); - else if(RISCV64 == Architecture) emit_out("RD_A0 RS1_A0 LD\n"); + while (num_dereference > 0) + { + if(match("char*", current_target->name)) { + /* Load a single byte */ + emit_dereference(TRUE); + } + else + { + emit_dereference(FALSE); + } + current_target = current_target->type; + num_dereference = num_dereference - 1; + } } void function_load(struct token_list* a) @@ -688,6 +718,11 @@ void primary_expr_number() void primary_expr_variable() { + int num_dereference = 0; + while(global_token->s[0] == '*') { + global_token = global_token->next; + num_dereference = num_dereference + 1; + } char* s = global_token->s; global_token = global_token->next; struct token_list* a = sym_lookup(s, global_constant_list); @@ -697,21 +732,21 @@ void primary_expr_variable() return; } - a= sym_lookup(s, function->locals); + a = sym_lookup(s, function->locals); if(NULL != a) { - variable_load(a); + variable_load(a, num_dereference); return; } a = sym_lookup(s, function->arguments); if(NULL != a) { - variable_load(a); + variable_load(a, num_dereference); return; } - a= sym_lookup(s, global_function_list); + a = sym_lookup(s, global_function_list); if(NULL != a) { function_load(a); @@ -1310,6 +1345,7 @@ void primary_expr() else if(global_token->s[0] == '\'') primary_expr_char(); else if(global_token->s[0] == '"') primary_expr_string(); else if(in_set(global_token->s[0], "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_")) primary_expr_variable(); + else if(global_token->s[0] == '*') primary_expr_variable(); else if(in_set(global_token->s[0], "0123456789")) primary_expr_number(); else primary_expr_failure(); } diff --git a/cc_types.c b/cc_types.c index a09bcd4..07975ff 100644 --- a/cc_types.c +++ b/cc_types.c @@ -54,7 +54,6 @@ struct type* new_primitive(char* name0, char* name1, char* name2, int size, int b->size = register_size; b->is_signed = sign; b->indirect = a; - b->type = b; a->type = b; struct type* r = calloc(1, sizeof(struct type)); @@ -64,6 +63,7 @@ struct type* new_primitive(char* name0, char* name1, char* name2, int size, int r->is_signed = sign; r->indirect = b; r->type = r; + b->type = r; return r; } diff --git a/makefile-tests b/makefile-tests index 65590e0..6968de2 100644 --- a/makefile-tests +++ b/makefile-tests @@ -51,6 +51,7 @@ aarch64-tests: \ test0024-aarch64-binary \ test0025-aarch64-binary \ test0026-aarch64-binary \ + test0027-aarch64-binary \ test0100-aarch64-binary \ test0101-aarch64-binary \ test0102-aarch64-binary \ @@ -88,6 +89,7 @@ amd64-tests: \ test0024-amd64-binary \ test0025-amd64-binary \ test0026-amd64-binary \ + test0027-amd64-binary \ test0100-amd64-binary \ test0101-amd64-binary \ test0102-amd64-binary \ @@ -179,6 +181,7 @@ armv7l-tests: \ test0024-armv7l-binary \ test0025-armv7l-binary \ test0026-armv7l-binary \ + test0027-armv7l-binary \ test0100-armv7l-binary \ test0101-armv7l-binary \ test0102-armv7l-binary \ @@ -216,6 +219,7 @@ x86-tests: \ test0024-x86-binary \ test0025-x86-binary \ test0026-x86-binary \ + test0027-x86-binary \ test0100-x86-binary \ test0101-x86-binary \ test0102-x86-binary \ @@ -255,6 +259,7 @@ riscv64-tests: \ test0024-riscv64-binary \ test0025-riscv64-binary \ test0026-riscv64-binary \ + test0027-riscv64-binary \ test0100-riscv64-binary \ test0101-riscv64-binary \ test0102-riscv64-binary \ @@ -345,6 +350,9 @@ test0025-riscv64-binary: M2-Planet | results test0026-riscv64-binary: M2-Planet | results test/test0026/run_test.sh riscv64 +test0027-riscv64-binary: M2-Planet | results + test/test0027/run_test.sh riscv64 + test0100-riscv64-binary: M2-Planet | results test/test0100/run_test.sh riscv64 @@ -450,6 +458,9 @@ test0025-aarch64-binary: M2-Planet | results test0026-aarch64-binary: M2-Planet | results test/test0026/run_test.sh aarch64 +test0027-aarch64-binary: M2-Planet | results + test/test0027/run_test.sh aarch64 + test0100-aarch64-binary: M2-Planet | results test/test0100/run_test.sh aarch64 @@ -555,6 +566,9 @@ test0025-amd64-binary: M2-Planet | results test0026-amd64-binary: M2-Planet | results test/test0026/run_test.sh amd64 +test0027-amd64-binary: M2-Planet | results + test/test0027/run_test.sh amd64 + test0100-amd64-binary: M2-Planet | results test/test0100/run_test.sh amd64 @@ -810,6 +824,9 @@ test0025-armv7l-binary: M2-Planet | results test0026-armv7l-binary: M2-Planet | results test/test0026/run_test.sh armv7l +test0027-armv7l-binary: M2-Planet | results + test/test0026/run_test.sh armv7l + test0100-armv7l-binary: M2-Planet | results test/test0100/run_test.sh armv7l @@ -915,6 +932,9 @@ test0025-x86-binary: M2-Planet | results test0026-x86-binary: M2-Planet | results test/test0026/run_test.sh x86 +test0027-x86-binary: M2-Planet | results + test/test0027/run_test.sh x86 + test0100-x86-binary: M2-Planet | results test/test0100/run_test.sh x86 diff --git a/test/test.answers b/test/test.answers index efb12a7..e771e46 100644 --- a/test/test.answers +++ b/test/test.answers @@ -176,6 +176,10 @@ bf7204e213a7221aa783a68d841b5dfb6baa2bb0f5d5bf361e1edfe0c6c1b30b test/results/t f4676ec3d8eade4c0f405a4b66d7069c78b881fd3f654e7e04f3fe56326542b5 test/results/test0026-armv7l-binary 856fdc8a9045f71583337dfc4a0d2a5cd01a72061d292b6d75e6fa52e70c78df test/results/test0026-riscv64-binary 46381cee997ec150a6b3bb7b978908df8d30cf65cc98744451a00f6eb5a70aa6 test/results/test0026-x86-binary +308ff16be0bbd485cb550ee2f7b49f0bc971bcf00cb043fa59f7053fe5ae7a16 test/results/test0027-aarch64-binary +1591d35cf06ee0b2a746f81445b871e19440908c1b49657c85934d7daf131488 test/results/test0027-amd64-binary +f871d50855f0b12aa4925b819e1a67140027737262686bca8d622b42cb22bc43 test/results/test0027-riscv64-binary +04e75e83bcea38ba913117c4a4fd1dac5264321aa34eb40a934d6596b6bf7978 test/results/test0027-x86-binary 29bc8c839549d674dd7717ee31aa7a974fb81163c7a75ec6357ab129f91ba48c test/results/test0100-aarch64-binary 1f51f1fdc444e40917a7fe59d70472b7bca9a623230093c39c55dd5b911e6ed6 test/results/test0100-amd64-binary bc2666096825062ad5bf840e94fe1fe26b37bef2d024d642cc237f98c65fcccc test/results/test0100-armv7l-binary @@ -217,9 +221,9 @@ eb1f6aab09a1a4966f9f49a518d8aa03ca97aa7c46e443871d758a306671a85e test/results/t a2cbfd5f76d3be8049c6737e3fa02f191caf29b6885db006fa23f86e6eacc186 test/results/test0106-knight-posix-binary d75e450e2fcdf19df63f9d6a3fe5e032933e57b33f6f06b39a8ed2f3dc759f17 test/results/test0106-riscv64-binary 473cc504d6cba9eaf648abcf15c83a317ff3f4a7f08f5e8936e3b35b2cc4fbc6 test/results/test0106-x86-binary -3b5ddb395491c54ddb705f22467807d450d6560cecd5e5a1e58a80b0d98cebab test/results/test1000-aarch64-binary -d0db9d1f07d96948e6ffd5a27247ac7cc0d72f70cb4131cdcdf0c2c43a3c76f4 test/results/test1000-amd64-binary -e17764ae5266384f263416333f2fb490d591ed92fa94a6e44dc22d07baaf3700 test/results/test1000-armv7l-binary -7916298f9d8e4e033a0be485c35d3f1194f85f0a8ce73ad3ae34296dcd69ebfa test/results/test1000-knight-posix-binary -d922ad66b74ab8a084d061d7b82877a099a808d51ccc3a9b15eddf23251ab6c1 test/results/test1000-riscv64-binary -53eb324f93c79212bf9a01b2f01b033c3b1149a7ea4a2d12eb6fffe518e65a11 test/results/test1000-x86-binary +b5187732c5dd3c90f07404636c8a929d8ef0f4b0e859228468825eff4dbfd66b test/results/test1000-aarch64-binary +25c32aaa0dcda0aba7f2b0c9a87a923a904161448b50ad5c8c8032fb27e29f51 test/results/test1000-amd64-binary +7676c997da4ca49b204bfb884eec89418e5bb9620c1e686e03ba5064e7406ca6 test/results/test1000-armv7l-binary +f33537743e53ad62849af0675f5d3635ff0f3a1ba8169768289c125a014607c3 test/results/test1000-knight-posix-binary +120e74cb11b9df0fd0793cfae6475cfaf95f8af4242d3b4f8b33247249fff25d test/results/test1000-riscv64-binary +72ee105c0fd1356c029966a7c550c019a7ccc5763ec8c2f2e40affc345e1349b test/results/test1000-x86-binary diff --git a/test/test0027/dereference.c b/test/test0027/dereference.c new file mode 100644 index 0000000..90ecfe3 --- /dev/null +++ b/test/test0027/dereference.c @@ -0,0 +1,28 @@ +/* Copyright (C) 2021 Andrius Štikonas + * This file is part of M2-Planet. + * + * M2-Planet is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * M2-Planet is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with M2-Planet. If not, see . + */ + +int main(int argc, char** argv) +{ + char *d = "test\n"; + if(*d != 't') { + return 1; + } + int i = 2; + int *j = &i; + *j = 0; + return *j; +} diff --git a/test/test0027/run_test.sh b/test/test0027/run_test.sh new file mode 100755 index 0000000..1676d73 --- /dev/null +++ b/test/test0027/run_test.sh @@ -0,0 +1,72 @@ +#! /bin/sh +## Copyright (C) 2017 Jeremiah Orians +## Copyright (C) 2020-2021 deesix +## This file is part of M2-Planet. +## +## M2-Planet is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. +## +## M2-Planet is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with M2-Planet. If not, see . + +set -ex + +ARCH="$1" +. test/env.inc.sh +TMPDIR="test/test0027/tmp-${ARCH}" + +mkdir -p ${TMPDIR} + +# Build the test +bin/M2-Planet \ + --architecture ${ARCH} \ + --debug \ + -f test/test0027/dereference.c \ + -o ${TMPDIR}/dereference.M1 \ + || exit 1 + +# Build debug footer +blood-elf \ + ${BLOOD_ELF_WORD_SIZE_FLAG} \ + -f ${TMPDIR}/dereference.M1 \ + ${ENDIANNESS_FLAG} \ + --entry _start \ + -o ${TMPDIR}/dereference-footer.M1 \ + || exit 2 + +# Macro assemble with libc written in M1-Macro +M1 \ + -f M2libc/${ARCH}/${ARCH}_defs.M1 \ + -f M2libc/${ARCH}/libc-core.M1 \ + -f ${TMPDIR}/dereference.M1 \ + -f ${TMPDIR}/dereference-footer.M1 \ + ${ENDIANNESS_FLAG} \ + --architecture ${ARCH} \ + -o ${TMPDIR}/dereference.hex2 \ + || exit 2 + +# Resolve all linkages +hex2 \ + -f M2libc/${ARCH}/ELF-${ARCH}-debug.hex2 \ + -f ${TMPDIR}/dereference.hex2 \ + ${ENDIANNESS_FLAG} \ + --architecture ${ARCH} \ + --base-address ${BASE_ADDRESS} \ + -o test/results/test0027-${ARCH}-binary \ + || exit 3 + +# Ensure binary works if host machine supports test +if [ "$(get_machine ${GET_MACHINE_FLAGS})" = "${ARCH}" ] +then + . ./sha256.sh + # Verify that the resulting file works + ./test/results/test0027-${ARCH}-binary || exit 4 +fi +exit 0 diff --git a/test/test1000/proof.answer b/test/test1000/proof.answer index 42c2f1c..5055a12 100644 --- a/test/test1000/proof.answer +++ b/test/test1000/proof.answer @@ -1 +1 @@ -0e01009082d89c270ce3adb147c2c0e248cb963724203188ebcc89ab0042355a test/test1000/proof +a7014fa831a6f837d25bace5fdce16ff16cb155eb6676ad1f4bdc239d4ba361d test/test1000/proof