From d03ca0906302aebf0dd6d9f9517d154f7b3e6fe4 Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Wed, 1 Sep 2021 15:41:14 +0000 Subject: some testing of strange print_char behaviour under optimization on gcc --- miniany/build.sh | 4 ++-- miniany/cc.c | 27 ++++++++++++++++++++++----- miniany/libc-freestanding.c | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/miniany/build.sh b/miniany/build.sh index 0db0d13..72a702c 100755 --- a/miniany/build.sh +++ b/miniany/build.sh @@ -31,11 +31,11 @@ case "${COMPILER}" in esac case "${LEVEL}" in - 0|1|2|3) + 0|1|2|3|s) CFLAGS+=" -O${LEVEL}" ;; d) - CFLAGS+=" -g -O0" + CFLAGS+=" -g -Og" DEBUG=1 ;; *) diff --git a/miniany/cc.c b/miniany/cc.c index 0805970..ccda806 100644 --- a/miniany/cc.c +++ b/miniany/cc.c @@ -648,7 +648,7 @@ int genMul( struct Generator *generator, int leftreg, int rightreg ) int reg; if( leftreg == EAX ) { - return genBinary( "mul", generator, leftreg, rightreg, 1 ); + reg = genBinary( "mul", generator, leftreg, rightreg, 1 ); } else { genSaveReg( generator, EAX ); if( leftreg != EDX ) { @@ -676,8 +676,10 @@ int genMul( struct Generator *generator, int leftreg, int rightreg ) genRestoreReg( generator, EDX ); } genRestoreReg( generator, EAX ); - return leftreg; + reg = leftreg; } + + return reg; } int genDiv( struct Generator *generator, int leftreg, int rightreg ) @@ -685,7 +687,7 @@ int genDiv( struct Generator *generator, int leftreg, int rightreg ) int reg; if( leftreg == EAX ) { - return genBinary( "div", generator, leftreg, rightreg, 1 ); + reg = genBinary( "div", generator, leftreg, rightreg, 1 ); } else { genSaveReg( generator, EAX ); genSaveReg( generator, EDX ); @@ -711,14 +713,19 @@ int genDiv( struct Generator *generator, int leftreg, int rightreg ) putnl( ); genRestoreReg( generator, EDX ); genRestoreReg( generator, EAX ); - return leftreg; + reg = leftreg; } + + return reg; } int generateFromAST( struct Generator *generator, struct ASTnode *node, int inreg ) { int leftreg, rightreg, reg; + reg = NOREG; + leftreg = NOREG; + rightreg = NOREG; if( node->left != NULL ) { leftreg = generateFromAST( generator, node->left, NOREG ); } @@ -748,6 +755,7 @@ int generateFromAST( struct Generator *generator, struct ASTnode *node, int inre reg = genDiv( generator, leftreg, rightreg ); break; case A_ASSIGN: + reg = inreg; break; default: putint( node->op ); @@ -829,7 +837,7 @@ struct ASTnode *parseExpression( struct Parser *parser ) if( parser->token == S_NUM ) { left = createASTleafInt( A_INT_LITERAL, parser->scanner->num ); - } else if( parser->token = S_IDENT ) { + } else if( parser->token == S_IDENT ) { sym = getSymbol( parser->global_scope, parser->scanner->ident ); if( sym == NULL ) { scannerPrintErrorHeader( parser->scanner ); @@ -840,6 +848,14 @@ struct ASTnode *parseExpression( struct Parser *parser ) exit( EXIT_FAILURE ); } left = createASTleafSym( A_IDENT, sym ); + } else { + left = NULL; + scannerPrintErrorHeader( parser->scanner ); + putstring( "unknown token '" ); + putint( parser->token ); + putstring( "' in expression" ); + putnl( ); + exit( EXIT_FAILURE ); } parser->token = getToken( parser->scanner ); @@ -862,6 +878,7 @@ struct ASTnode *parseExpression( struct Parser *parser ) } else if( parser->token == S_EOI || parser->token == S_SEMICOLON ) { node = left; } else { + node = NULL; scannerPrintErrorHeader( parser->scanner ); putstring( "unexpected token '" ); putint( parser->token ); diff --git a/miniany/libc-freestanding.c b/miniany/libc-freestanding.c index 2bcdf0c..09d9fc8 100644 --- a/miniany/libc-freestanding.c +++ b/miniany/libc-freestanding.c @@ -241,7 +241,7 @@ int putstring( char *s ) int putnl( ) { - putchar( '\n' ); + print_newline( ); return 0; } -- cgit v1.2.3-54-g00ecf