diff --git a/CHANGELOG.org b/CHANGELOG.org index 192bafe..022f199 100644 --- a/CHANGELOG.org +++ b/CHANGELOG.org @@ -20,6 +20,7 @@ ** Changed Tweaked cc_types.c to better match amd64 assembly Replaced out with output_list in cc_core.c +For 32bit behavior on 64bit platforms ** Fixed diff --git a/cc_core.c b/cc_core.c index bf5b34c..184fb08 100644 --- a/cc_core.c +++ b/cc_core.c @@ -35,7 +35,6 @@ char* break_target_func; char* break_target_num; struct token_list* break_frame; int current_count; -struct type* last_type; int Address_of; /* Imported functions */ @@ -45,6 +44,9 @@ char* numerate_number(int a); int numerate_string(char *a); char* number_to_hex(int a, int bytes); +/* Host touchy function will need custom on 64bit systems*/ +int fixup_int32(int a); + struct token_list* emit(char *s, struct token_list* head) { struct token_list* t = calloc(1, sizeof(struct token_list)); @@ -397,7 +399,7 @@ void primary_expr_number() { if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) { - int size = numerate_string(global_token->s); + int size = fixup_int32(numerate_string(global_token->s)); if((32768 > size) && (size > -32768)) { emit_out("LOADI R0 "); @@ -499,14 +501,13 @@ struct type* promote_type(struct type* a, struct type* b) void common_recursion(FUNCTION f) { - last_type = current_target; - global_token = global_token->next; - if((KNIGHT_POSIX == Architecture) || (KNIGHT_NATIVE == Architecture)) emit_out("PUSHR R0 R15\t#_common_recursion\n"); else if(X86 == Architecture) emit_out("PUSH_eax\t#_common_recursion\n"); else if(AMD64 == Architecture) emit_out("PUSH_RAX\t#_common_recursion\n"); else if(ARMV7L == Architecture) emit_out("{R0} PUSH_ALWAYS\t#_common_recursion\n"); + struct type* last_type = current_target; + global_token = global_token->next; f(); current_target = promote_type(current_target, last_type); diff --git a/cc_types.c b/cc_types.c index 7fa197e..9d206ab 100644 --- a/cc_types.c +++ b/cc_types.c @@ -143,11 +143,14 @@ void require_match(char* message, char* required); int member_size; struct type* build_member(struct type* last, int offset) { - struct type* member_type = type_name(); struct type* i = calloc(1, sizeof(struct type)); + i->members = last; + i->offset = offset; + + struct type* member_type = type_name(); + i->type = member_type; i->name = global_token->s; global_token = global_token->next; - i->members = last; /* Check to see if array */ if(match( "[", global_token->s)) @@ -162,8 +165,7 @@ struct type* build_member(struct type* last, int offset) i->size = member_type->size; } member_size = i->size; - i->type = member_type; - i->offset = offset; + return i; } diff --git a/functions/fixup.c b/functions/fixup.c new file mode 100644 index 0000000..45b438b --- /dev/null +++ b/functions/fixup.c @@ -0,0 +1,22 @@ +/* Copyright (C) 2016 Jeremiah Orians + * 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 . + */ + +/* This only works for 32bit architectures */ +int fixup_int32(int a) +{ + return a; +} diff --git a/test/common_amd64/amd64_defs.M1 b/test/common_amd64/amd64_defs.M1 index e13feb2..bec3224 100644 --- a/test/common_amd64/amd64_defs.M1 +++ b/test/common_amd64/amd64_defs.M1 @@ -38,6 +38,7 @@ DEFINE JUMP_EQ 0F84 DEFINE JUMP_NE 0F85 DEFINE LOAD_BASE_ADDRESS_rax 488D85 DEFINE LOAD_BYTE 0FBE00 +DEFINE LOAD_EFFECTIVE_ADDRESS_rax 488D8424 DEFINE LOAD_EFFECTIVE_ADDRESS_rdi 488DBC24 DEFINE LOAD_EFFECTIVE_ADDRESS_rdx 488D9424 DEFINE LOAD_EFFECTIVE_ADDRESS_rsi 488DB424 @@ -55,6 +56,7 @@ DEFINE MODULUS_rax_from_rbx_into_rbx 48F7FB DEFINE MOVE_rbx_to_rax 4889D8 DEFINE MOVE_rdx_to_rax 4889D0 DEFINE MOVEZX 480FB6C0 +DEFINE MOVESX 4863C0 DEFINE MULTIPLY_rax_by_rbx_into_rax 48F7E3 DEFINE NOP 0000000000000000 DEFINE NOT_rax 48F7D0 diff --git a/test/common_amd64/functions/fixup.c b/test/common_amd64/functions/fixup.c new file mode 100644 index 0000000..c178cdb --- /dev/null +++ b/test/common_amd64/functions/fixup.c @@ -0,0 +1,24 @@ +/* Copyright (C) 2016 Jeremiah Orians + * 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 . + */ + +/* Only works for AMD64 with the value in RAX */ +int fixup_int32(int a) +{ + asm("LOAD_EFFECTIVE_ADDRESS_rax %8" + "LOAD_INTEGER" + "MOVESX"); +} diff --git a/test/test.answers b/test/test.answers index d255f58..8844485 100644 --- a/test/test.answers +++ b/test/test.answers @@ -53,10 +53,10 @@ a9cf4422e05075395ad75bbfe4b2659aec4541edd46d8c6b5064d3496b06a0b6 test/results/t 1154f39f25dcd6d914e9a542306f95280926baf985d011b2152c7ea0b87ab42d test/results/test10-knight-native-binary c1b5a2a3cd46c5e95e5540e871c2a916e028684ca80f51c001ef489342e27625 test/results/test10-knight-posix-binary b3e13d54aab689137628fb9c4487bfd8288f9bd18bef8fe756577c8d2dce1f1f test/results/test10-x86-binary -68862cbb943373c84f41d454ede6318fe5d20217624dc72ae7f6cf968e661aee test/results/test100-amd64-binary -7fdb5af1f3f3a11d616b0fa41dca001142780287e2c3b4e43dbd6a6839cc2455 test/results/test100-armv7l-binary -c5ecaae26e27fc58b6055182dc31b2d76fcfade0c0e62113e23a8d31852cddba test/results/test100-knight-posix-binary -fb19b73f76074f6144d3e2e0c9c00148a604c423b8f83521ec383e03af343421 test/results/test100-x86-binary +417ad7db393d6b81ec0dc0fb26b426b9ddd9038cf0645d53131af8698cf65097 test/results/test100-amd64-binary +0c03b5826145cfdd0ef7bb9e8d1c2fc3abdac86b0fa57806da80154c1972f314 test/results/test100-armv7l-binary +0ce1baf73766c193bd2aece2ac6caf485dbe0d2c54901d15f2095a2df739323e test/results/test100-knight-posix-binary +67e558164795211e0ccd4e0564d0f0d41b76800df97a635c07bdf63d0cf9feda test/results/test100-x86-binary 34e6d535e30ef8826a4ad1a4d08b76cfa370c54595599ad3be784b64c9cd8ec5 test/results/test11-amd64-binary d9d465340abbce2d5964a6bc58e6cdd0ef93fb3d0199eaa823c86ec6abd0452a test/results/test11-armv7l-binary 955b564d2c89abf2cfc6c80d766cd11479d146b828dec69e654b0958a62d5e6e test/results/test11-knight-native-binary diff --git a/test/test100/hello-amd64.sh b/test/test100/hello-amd64.sh index 82116c3..e0d3d70 100755 --- a/test/test100/hello-amd64.sh +++ b/test/test100/hello-amd64.sh @@ -27,6 +27,7 @@ set -ex -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f test/common_amd64/functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ @@ -72,6 +73,7 @@ then -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ diff --git a/test/test100/hello-armv7l.sh b/test/test100/hello-armv7l.sh index c25f044..f41cfa1 100755 --- a/test/test100/hello-armv7l.sh +++ b/test/test100/hello-armv7l.sh @@ -27,6 +27,7 @@ set -ex -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ @@ -72,6 +73,7 @@ then -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ diff --git a/test/test100/hello-knight-posix.sh b/test/test100/hello-knight-posix.sh index a051be8..68a4a67 100755 --- a/test/test100/hello-knight-posix.sh +++ b/test/test100/hello-knight-posix.sh @@ -27,6 +27,7 @@ set -ex -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ @@ -67,6 +68,7 @@ then -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ diff --git a/test/test100/hello-x86.sh b/test/test100/hello-x86.sh index d873462..ac74080 100755 --- a/test/test100/hello-x86.sh +++ b/test/test100/hello-x86.sh @@ -27,6 +27,7 @@ set -ex -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ @@ -72,6 +73,7 @@ then -f functions/numerate_number.c \ -f functions/file_print.c \ -f functions/number_pack.c \ + -f functions/fixup.c \ -f functions/string.c \ -f cc.h \ -f cc_reader.c \ diff --git a/test/test100/hello.sh b/test/test100/hello.sh index 928f033..24570c6 100755 --- a/test/test100/hello.sh +++ b/test/test100/hello.sh @@ -19,46 +19,22 @@ set -ex # Build using seed if possible if [ -f bin/M2-Planet-seed ] then -[ ! -f test/results ] && mkdir -p test/results -./bin/M2-Planet-seed -f test/common_x86/functions/file.c \ - -f test/common_x86/functions/malloc.c \ - -f functions/calloc.c \ - -f test/common_x86/functions/exit.c \ - -f functions/match.c \ - -f functions/in_set.c \ - -f functions/numerate_number.c \ - -f functions/file_print.c \ - -f functions/number_pack.c \ - -f functions/string.c \ - -f cc.h \ - -f cc_reader.c \ - -f cc_strings.c \ - -f cc_types.c \ - -f cc_core.c \ - -f cc.c \ - --debug \ - -o test/test100/cc.M1 || exit 1 + [ ! -f test/results ] && mkdir -p test/results + cp bin/M2-Planet-seed bin/M2-Planet -# Build debug footer -blood-elf -f test/test100/cc.M1 \ - -o test/test100/cc-footer.M1 || exit 2 - -# Macro assemble with libc written in M1-Macro -M1 -f test/common_x86/x86_defs.M1 \ - -f test/common_x86/libc-core.M1 \ - -f test/test100/cc.M1 \ - -f test/test100/cc-footer.M1 \ - --LittleEndian \ - --architecture x86 \ - -o test/test100/cc.hex2 || exit 3 - -# Resolve all linkages -hex2 -f test/common_x86/ELF-i386-debug.hex2 \ - -f test/test100/cc.hex2 \ - --LittleEndian \ - --architecture x86 \ - --BaseAddress 0x8048000 \ - -o test/results/test100-x86-binary --exec_enable || exit 4 + if [ "$(get_machine ${GET_MACHINE_FLAGS})" = "amd64" ] + then + ./test/test100/hello-amd64.sh + mv test/results/test100-amd64-binary bin/M2-Planet + elif [ "$(get_machine ${GET_MACHINE_FLAGS})" = "x86" ] + then + ./test/test100/hello-x86.sh + mv test/results/test100-x86-binary bin/M2-Planet + elif [ "$(get_machine ${GET_MACHINE_FLAGS})" = "armv7l" ] + then + ./test/test100/hello-armv7l.sh + mv test/results/test100-armv7l-binary bin/M2-Planet + fi else [ -z "${CC+x}" ] && export CC=gcc @@ -70,6 +46,7 @@ ${CC} ${CFLAGS} \ functions/numerate_number.c \ functions/file_print.c \ functions/number_pack.c \ + functions/fixup.c \ functions/string.c \ cc_reader.c \ cc_strings.c \ diff --git a/test/test100/proof.answer b/test/test100/proof.answer index b8d3066..03589b5 100644 --- a/test/test100/proof.answer +++ b/test/test100/proof.answer @@ -1 +1 @@ -a055c6feac7ac8980d6c0369a18d91750795470a1817587490e7bf386c51e2b7 test/test100/proof +093748f4d5efd09b0b40b7aa7781e1ad3ae7a24e01b43838dcbf0692c5d1a9d3 test/test100/proof