feat: implements overflow runtime error handling
This commit is contained in:
@@ -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"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user