summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2021-09-01 15:41:14 +0000
committerAndreas Baumann <mail@andreasbaumann.cc>2021-09-01 15:41:14 +0000
commitd03ca0906302aebf0dd6d9f9517d154f7b3e6fe4 (patch)
treee5e8555549c669933b0d9c51516c503a361e3cac
parent6a647f4c573c0d44e250fc99a69683a55b1afae6 (diff)
downloadcompilertests-d03ca0906302aebf0dd6d9f9517d154f7b3e6fe4.tar.gz
compilertests-d03ca0906302aebf0dd6d9f9517d154f7b3e6fe4.tar.bz2
some testing of strange print_char behaviour under optimization on gcc
-rwxr-xr-xminiany/build.sh4
-rw-r--r--miniany/cc.c27
-rw-r--r--miniany/libc-freestanding.c2
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;
}