feat: implements overflow runtime error handling

This commit is contained in:
Guy C
2025-02-27 19:55:35 +00:00
parent ea262e9a56
commit 9e6970de62
2 changed files with 23 additions and 2 deletions

View File

@@ -27,4 +27,9 @@ object RuntimeErrors {
"fatal error: null pair dereferenced or freed", "fatal error: null pair dereferenced or freed",
".L._errNullPtr" ".L._errNullPtr"
) )
val overflowError = RuntimeError(
".L._errOverflow_str0",
"fatal error: integer overflow or underflow occurred",
".L._errOverflow"
)
} }

View File

@@ -66,6 +66,7 @@ object asmGenerator {
} ++ zeroDivError.stringDef } ++ zeroDivError.stringDef
++ badChrError.stringDef ++ badChrError.stringDef
++ nullPtrError.stringDef // TODO COLLATE TO ONE LIST INSTANCE ++ nullPtrError.stringDef // TODO COLLATE TO ONE LIST INSTANCE
++ overflowError.stringDef
Chain( Chain(
Directive.IntelSyntax, Directive.IntelSyntax,
@@ -186,7 +187,7 @@ object asmGenerator {
stackAlign, stackAlign,
Load(RDI, IndexAddress(RIP, LabelArg(badChrError.strLabel))), Load(RDI, IndexAddress(RIP, LabelArg(badChrError.strLabel))),
assemblyIR.Call(CLibFunc.PrintF), assemblyIR.Call(CLibFunc.PrintF),
Move(RDI, ImmediateVal(-1)), Move(RDI, ImmediateVal(255)),
assemblyIR.Call(CLibFunc.Exit) assemblyIR.Call(CLibFunc.Exit)
) )
@@ -199,6 +200,15 @@ object asmGenerator {
assemblyIR.Call(CLibFunc.Exit) 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 chain
} }
@@ -345,7 +355,11 @@ object asmGenerator {
chain += Move(EAX, MemLocation(RAX, D32)) chain += Move(EAX, MemLocation(RAX, D32))
chain += stack.push(D32, RAX) chain += stack.push(D32, RAX)
case UnaryOperator.Negate => 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 => case UnaryOperator.Not =>
chain += Xor(stack.head, ImmediateVal(1)) chain += Xor(stack.head, ImmediateVal(1))
} }
@@ -359,12 +373,14 @@ object asmGenerator {
op match { op match {
case BinaryOperator.Add => case BinaryOperator.Add =>
chain += Add(stack.head, destX) chain += Add(stack.head, destX)
chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow)
case BinaryOperator.Sub => case BinaryOperator.Sub =>
chain += Subtract(destX, stack.head) chain += Subtract(destX, stack.head)
chain += stack.drop() chain += stack.drop()
chain += stack.push(destX.size, RAX) chain += stack.push(destX.size, RAX)
case BinaryOperator.Mul => case BinaryOperator.Mul =>
chain += Multiply(destX, stack.head) chain += Multiply(destX, stack.head)
chain += Jump(LabelArg(overflowError.errLabel), Cond.Overflow)
chain += stack.drop() chain += stack.drop()
chain += stack.push(destX.size, RAX) chain += stack.push(destX.size, RAX)