From 9e6970de62a6955c8ec478d1582c8c6e2bbcccb7 Mon Sep 17 00:00:00 2001 From: Guy C Date: Thu, 27 Feb 2025 19:55:35 +0000 Subject: [PATCH] feat: implements overflow runtime error handling --- src/main/wacc/backend/RuntimeErrors.scala | 5 +++++ src/main/wacc/backend/asmGenerator.scala | 20 ++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/wacc/backend/RuntimeErrors.scala b/src/main/wacc/backend/RuntimeErrors.scala index d5df01c..06062ad 100644 --- a/src/main/wacc/backend/RuntimeErrors.scala +++ b/src/main/wacc/backend/RuntimeErrors.scala @@ -27,4 +27,9 @@ object RuntimeErrors { "fatal error: null pair dereferenced or freed", ".L._errNullPtr" ) + val overflowError = RuntimeError( + ".L._errOverflow_str0", + "fatal error: integer overflow or underflow occurred", + ".L._errOverflow" + ) } diff --git a/src/main/wacc/backend/asmGenerator.scala b/src/main/wacc/backend/asmGenerator.scala index 38ed7a5..411d02e 100644 --- a/src/main/wacc/backend/asmGenerator.scala +++ b/src/main/wacc/backend/asmGenerator.scala @@ -66,6 +66,7 @@ object asmGenerator { } ++ zeroDivError.stringDef ++ badChrError.stringDef ++ nullPtrError.stringDef // TODO COLLATE TO ONE LIST INSTANCE + ++ overflowError.stringDef Chain( Directive.IntelSyntax, @@ -186,7 +187,7 @@ object asmGenerator { stackAlign, Load(RDI, IndexAddress(RIP, LabelArg(badChrError.strLabel))), assemblyIR.Call(CLibFunc.PrintF), - Move(RDI, ImmediateVal(-1)), + Move(RDI, ImmediateVal(255)), assemblyIR.Call(CLibFunc.Exit) ) @@ -199,6 +200,15 @@ object asmGenerator { assemblyIR.Call(CLibFunc.Exit) ) + chain ++= Chain( + LabelDef(overflowError.errLabel), + stackAlign, + Load(RDI, IndexAddress(RIP, LabelArg(overflowError.strLabel))), + assemblyIR.Call(CLibFunc.PrintF), + Move(RDI, ImmediateVal(255)), + assemblyIR.Call(CLibFunc.Exit) + ) + chain } @@ -345,7 +355,11 @@ object asmGenerator { chain += Move(EAX, MemLocation(RAX, D32)) chain += stack.push(D32, RAX) case UnaryOperator.Negate => - chain += Negate(stack.head) + chain += Xor(EAX, EAX) + chain += Subtract(EAX, stack.head) + chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow) + chain += stack.drop() + chain += stack.push(Q64, RAX) case UnaryOperator.Not => chain += Xor(stack.head, ImmediateVal(1)) } @@ -359,12 +373,14 @@ object asmGenerator { op match { case BinaryOperator.Add => chain += Add(stack.head, destX) + chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow) case BinaryOperator.Sub => chain += Subtract(destX, stack.head) chain += stack.drop() chain += stack.push(destX.size, RAX) case BinaryOperator.Mul => chain += Multiply(destX, stack.head) + chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow) chain += stack.drop() chain += stack.push(destX.size, RAX)