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