Fixup behavior on 64bit platforms
This commit is contained in:
parent
f43aa4a44c
commit
465b4c9c31
|
@ -20,6 +20,7 @@
|
||||||
** Changed
|
** Changed
|
||||||
Tweaked cc_types.c to better match amd64 assembly
|
Tweaked cc_types.c to better match amd64 assembly
|
||||||
Replaced out with output_list in cc_core.c
|
Replaced out with output_list in cc_core.c
|
||||||
|
For 32bit behavior on 64bit platforms
|
||||||
|
|
||||||
** Fixed
|
** Fixed
|
||||||
|
|
||||||
|
|
11
cc_core.c
11
cc_core.c
|
@ -35,7 +35,6 @@ char* break_target_func;
|
||||||
char* break_target_num;
|
char* break_target_num;
|
||||||
struct token_list* break_frame;
|
struct token_list* break_frame;
|
||||||
int current_count;
|
int current_count;
|
||||||
struct type* last_type;
|
|
||||||
int Address_of;
|
int Address_of;
|
||||||
|
|
||||||
/* Imported functions */
|
/* Imported functions */
|
||||||
|
@ -45,6 +44,9 @@ char* numerate_number(int a);
|
||||||
int numerate_string(char *a);
|
int numerate_string(char *a);
|
||||||
char* number_to_hex(int a, int bytes);
|
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* emit(char *s, struct token_list* head)
|
||||||
{
|
{
|
||||||
struct token_list* t = calloc(1, sizeof(struct token_list));
|
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))
|
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))
|
if((32768 > size) && (size > -32768))
|
||||||
{
|
{
|
||||||
emit_out("LOADI R0 ");
|
emit_out("LOADI R0 ");
|
||||||
|
@ -499,14 +501,13 @@ struct type* promote_type(struct type* a, struct type* b)
|
||||||
|
|
||||||
void common_recursion(FUNCTION f)
|
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");
|
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(X86 == Architecture) emit_out("PUSH_eax\t#_common_recursion\n");
|
||||||
else if(AMD64 == Architecture) emit_out("PUSH_RAX\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");
|
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();
|
f();
|
||||||
current_target = promote_type(current_target, last_type);
|
current_target = promote_type(current_target, last_type);
|
||||||
|
|
||||||
|
|
10
cc_types.c
10
cc_types.c
|
@ -143,11 +143,14 @@ void require_match(char* message, char* required);
|
||||||
int member_size;
|
int member_size;
|
||||||
struct type* build_member(struct type* last, int offset)
|
struct type* build_member(struct type* last, int offset)
|
||||||
{
|
{
|
||||||
struct type* member_type = type_name();
|
|
||||||
struct type* i = calloc(1, sizeof(struct type));
|
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;
|
i->name = global_token->s;
|
||||||
global_token = global_token->next;
|
global_token = global_token->next;
|
||||||
i->members = last;
|
|
||||||
|
|
||||||
/* Check to see if array */
|
/* Check to see if array */
|
||||||
if(match( "[", global_token->s))
|
if(match( "[", global_token->s))
|
||||||
|
@ -162,8 +165,7 @@ struct type* build_member(struct type* last, int offset)
|
||||||
i->size = member_type->size;
|
i->size = member_type->size;
|
||||||
}
|
}
|
||||||
member_size = i->size;
|
member_size = i->size;
|
||||||
i->type = member_type;
|
|
||||||
i->offset = offset;
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* This only works for 32bit architectures */
|
||||||
|
int fixup_int32(int a)
|
||||||
|
{
|
||||||
|
return a;
|
||||||
|
}
|
|
@ -38,6 +38,7 @@ DEFINE JUMP_EQ 0F84
|
||||||
DEFINE JUMP_NE 0F85
|
DEFINE JUMP_NE 0F85
|
||||||
DEFINE LOAD_BASE_ADDRESS_rax 488D85
|
DEFINE LOAD_BASE_ADDRESS_rax 488D85
|
||||||
DEFINE LOAD_BYTE 0FBE00
|
DEFINE LOAD_BYTE 0FBE00
|
||||||
|
DEFINE LOAD_EFFECTIVE_ADDRESS_rax 488D8424
|
||||||
DEFINE LOAD_EFFECTIVE_ADDRESS_rdi 488DBC24
|
DEFINE LOAD_EFFECTIVE_ADDRESS_rdi 488DBC24
|
||||||
DEFINE LOAD_EFFECTIVE_ADDRESS_rdx 488D9424
|
DEFINE LOAD_EFFECTIVE_ADDRESS_rdx 488D9424
|
||||||
DEFINE LOAD_EFFECTIVE_ADDRESS_rsi 488DB424
|
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_rbx_to_rax 4889D8
|
||||||
DEFINE MOVE_rdx_to_rax 4889D0
|
DEFINE MOVE_rdx_to_rax 4889D0
|
||||||
DEFINE MOVEZX 480FB6C0
|
DEFINE MOVEZX 480FB6C0
|
||||||
|
DEFINE MOVESX 4863C0
|
||||||
DEFINE MULTIPLY_rax_by_rbx_into_rax 48F7E3
|
DEFINE MULTIPLY_rax_by_rbx_into_rax 48F7E3
|
||||||
DEFINE NOP 0000000000000000
|
DEFINE NOP 0000000000000000
|
||||||
DEFINE NOT_rax 48F7D0
|
DEFINE NOT_rax 48F7D0
|
||||||
|
|
|
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Only works for AMD64 with the value in RAX */
|
||||||
|
int fixup_int32(int a)
|
||||||
|
{
|
||||||
|
asm("LOAD_EFFECTIVE_ADDRESS_rax %8"
|
||||||
|
"LOAD_INTEGER"
|
||||||
|
"MOVESX");
|
||||||
|
}
|
|
@ -53,10 +53,10 @@ a9cf4422e05075395ad75bbfe4b2659aec4541edd46d8c6b5064d3496b06a0b6 test/results/t
|
||||||
1154f39f25dcd6d914e9a542306f95280926baf985d011b2152c7ea0b87ab42d test/results/test10-knight-native-binary
|
1154f39f25dcd6d914e9a542306f95280926baf985d011b2152c7ea0b87ab42d test/results/test10-knight-native-binary
|
||||||
c1b5a2a3cd46c5e95e5540e871c2a916e028684ca80f51c001ef489342e27625 test/results/test10-knight-posix-binary
|
c1b5a2a3cd46c5e95e5540e871c2a916e028684ca80f51c001ef489342e27625 test/results/test10-knight-posix-binary
|
||||||
b3e13d54aab689137628fb9c4487bfd8288f9bd18bef8fe756577c8d2dce1f1f test/results/test10-x86-binary
|
b3e13d54aab689137628fb9c4487bfd8288f9bd18bef8fe756577c8d2dce1f1f test/results/test10-x86-binary
|
||||||
68862cbb943373c84f41d454ede6318fe5d20217624dc72ae7f6cf968e661aee test/results/test100-amd64-binary
|
417ad7db393d6b81ec0dc0fb26b426b9ddd9038cf0645d53131af8698cf65097 test/results/test100-amd64-binary
|
||||||
7fdb5af1f3f3a11d616b0fa41dca001142780287e2c3b4e43dbd6a6839cc2455 test/results/test100-armv7l-binary
|
0c03b5826145cfdd0ef7bb9e8d1c2fc3abdac86b0fa57806da80154c1972f314 test/results/test100-armv7l-binary
|
||||||
c5ecaae26e27fc58b6055182dc31b2d76fcfade0c0e62113e23a8d31852cddba test/results/test100-knight-posix-binary
|
0ce1baf73766c193bd2aece2ac6caf485dbe0d2c54901d15f2095a2df739323e test/results/test100-knight-posix-binary
|
||||||
fb19b73f76074f6144d3e2e0c9c00148a604c423b8f83521ec383e03af343421 test/results/test100-x86-binary
|
67e558164795211e0ccd4e0564d0f0d41b76800df97a635c07bdf63d0cf9feda test/results/test100-x86-binary
|
||||||
34e6d535e30ef8826a4ad1a4d08b76cfa370c54595599ad3be784b64c9cd8ec5 test/results/test11-amd64-binary
|
34e6d535e30ef8826a4ad1a4d08b76cfa370c54595599ad3be784b64c9cd8ec5 test/results/test11-amd64-binary
|
||||||
d9d465340abbce2d5964a6bc58e6cdd0ef93fb3d0199eaa823c86ec6abd0452a test/results/test11-armv7l-binary
|
d9d465340abbce2d5964a6bc58e6cdd0ef93fb3d0199eaa823c86ec6abd0452a test/results/test11-armv7l-binary
|
||||||
955b564d2c89abf2cfc6c80d766cd11479d146b828dec69e654b0958a62d5e6e test/results/test11-knight-native-binary
|
955b564d2c89abf2cfc6c80d766cd11479d146b828dec69e654b0958a62d5e6e test/results/test11-knight-native-binary
|
||||||
|
|
|
@ -27,6 +27,7 @@ set -ex
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f test/common_amd64/functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
@ -72,6 +73,7 @@ then
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
|
|
@ -27,6 +27,7 @@ set -ex
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
@ -72,6 +73,7 @@ then
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
|
|
@ -27,6 +27,7 @@ set -ex
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
@ -67,6 +68,7 @@ then
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
|
|
@ -27,6 +27,7 @@ set -ex
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
@ -72,6 +73,7 @@ then
|
||||||
-f functions/numerate_number.c \
|
-f functions/numerate_number.c \
|
||||||
-f functions/file_print.c \
|
-f functions/file_print.c \
|
||||||
-f functions/number_pack.c \
|
-f functions/number_pack.c \
|
||||||
|
-f functions/fixup.c \
|
||||||
-f functions/string.c \
|
-f functions/string.c \
|
||||||
-f cc.h \
|
-f cc.h \
|
||||||
-f cc_reader.c \
|
-f cc_reader.c \
|
||||||
|
|
|
@ -19,46 +19,22 @@ set -ex
|
||||||
# Build using seed if possible
|
# Build using seed if possible
|
||||||
if [ -f bin/M2-Planet-seed ]
|
if [ -f bin/M2-Planet-seed ]
|
||||||
then
|
then
|
||||||
[ ! -f test/results ] && mkdir -p test/results
|
[ ! -f test/results ] && mkdir -p test/results
|
||||||
./bin/M2-Planet-seed -f test/common_x86/functions/file.c \
|
cp bin/M2-Planet-seed bin/M2-Planet
|
||||||
-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
|
|
||||||
|
|
||||||
# Build debug footer
|
if [ "$(get_machine ${GET_MACHINE_FLAGS})" = "amd64" ]
|
||||||
blood-elf -f test/test100/cc.M1 \
|
then
|
||||||
-o test/test100/cc-footer.M1 || exit 2
|
./test/test100/hello-amd64.sh
|
||||||
|
mv test/results/test100-amd64-binary bin/M2-Planet
|
||||||
# Macro assemble with libc written in M1-Macro
|
elif [ "$(get_machine ${GET_MACHINE_FLAGS})" = "x86" ]
|
||||||
M1 -f test/common_x86/x86_defs.M1 \
|
then
|
||||||
-f test/common_x86/libc-core.M1 \
|
./test/test100/hello-x86.sh
|
||||||
-f test/test100/cc.M1 \
|
mv test/results/test100-x86-binary bin/M2-Planet
|
||||||
-f test/test100/cc-footer.M1 \
|
elif [ "$(get_machine ${GET_MACHINE_FLAGS})" = "armv7l" ]
|
||||||
--LittleEndian \
|
then
|
||||||
--architecture x86 \
|
./test/test100/hello-armv7l.sh
|
||||||
-o test/test100/cc.hex2 || exit 3
|
mv test/results/test100-armv7l-binary bin/M2-Planet
|
||||||
|
fi
|
||||||
# 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
|
|
||||||
|
|
||||||
else
|
else
|
||||||
[ -z "${CC+x}" ] && export CC=gcc
|
[ -z "${CC+x}" ] && export CC=gcc
|
||||||
|
@ -70,6 +46,7 @@ ${CC} ${CFLAGS} \
|
||||||
functions/numerate_number.c \
|
functions/numerate_number.c \
|
||||||
functions/file_print.c \
|
functions/file_print.c \
|
||||||
functions/number_pack.c \
|
functions/number_pack.c \
|
||||||
|
functions/fixup.c \
|
||||||
functions/string.c \
|
functions/string.c \
|
||||||
cc_reader.c \
|
cc_reader.c \
|
||||||
cc_strings.c \
|
cc_strings.c \
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
a055c6feac7ac8980d6c0369a18d91750795470a1817587490e7bf386c51e2b7 test/test100/proof
|
093748f4d5efd09b0b40b7aa7781e1ad3ae7a24e01b43838dcbf0692c5d1a9d3 test/test100/proof
|
||||||
|
|
Loading…
Reference in New Issue