diff --git a/src/compiler/Generation/QBE/QBEGenerator.cs b/src/compiler/Generation/QBE/QBEGenerator.cs index 049d3ad..2ffd4a3 100644 --- a/src/compiler/Generation/QBE/QBEGenerator.cs +++ b/src/compiler/Generation/QBE/QBEGenerator.cs @@ -421,7 +421,7 @@ public static class QBEGenerator } } - parameterVars.Add(new Variable(parameter.Name, new Val(parameterName, parameter.Type, ValKind.Immediate))); + parameterVars.Add(new Variable(parameter.Name, new Val(parameterName, parameter.Type, ValKind.Value))); } EmitBlock(body, parameterVars); @@ -509,11 +509,7 @@ public static class QBEGenerator private static void EmitAssignment(BoundAssignmentNode assignment) { var expression = EmitExpression(assignment.Expression); - if (expression.Kind != ValKind.Pointer) - { - throw new UnreachableException(); - } - + Debug.Assert(expression.Kind == ValKind.LValue); var value = EmitUnwrap(EmitExpression(assignment.Value)); EmitCopy(assignment.Value.Type, value, expression.Name); } @@ -596,7 +592,7 @@ public static class QBEGenerator { var tmp = VarName(); _builder.AppendLine($" {tmp} =l alloc8 {SizeOf(variableDeclaration.Type)}"); - _variables.Push(new Variable(variableDeclaration.Name, new Val(tmp, variableDeclaration.Type, ValKind.Pointer))); + _variables.Push(new Variable(variableDeclaration.Name, new Val(tmp, variableDeclaration.Type, ValKind.LValue))); } private static void EmitWhile(BoundWhileNode whileStatement) @@ -658,7 +654,7 @@ public static class QBEGenerator _builder.AppendLine($" {pointer} =l mul {index}, {SizeOf(elementType)}"); _builder.AppendLine($" {pointer} =l add {pointer}, 8"); _builder.AppendLine($" {pointer} =l add {array}, {pointer}"); - return new Val(pointer, arrayIndexAccess.Type, ValKind.Pointer); + return new Val(pointer, arrayIndexAccess.Type, ValKind.LValue); } private static void EmitArrayBoundsCheck(string array, string index) @@ -703,7 +699,7 @@ public static class QBEGenerator _builder.AppendLine($" {dataPointer} =l add {arrayPointer}, 8"); _builder.AppendLine($" call $nub_memset(l {dataPointer}, w 0, l {capacityInBytes})"); - return new Val(arrayPointer, arrayInitializer.Type, ValKind.Immediate); + return new Val(arrayPointer, arrayInitializer.Type, ValKind.Value); } private static Val EmitDereference(BoundDereferenceNode dereference) @@ -711,17 +707,13 @@ public static class QBEGenerator var result = EmitUnwrap(EmitExpression(dereference.Expression)); var outputName = VarName(); _builder.AppendLine($" {outputName} {QBEAssign(dereference.Type)} {QBELoad(dereference.Type)} {result}"); - return new Val(outputName, dereference.Type, ValKind.Immediate); + return new Val(outputName, dereference.Type, ValKind.Value); } private static Val EmitAddressOf(BoundAddressOfNode addressOf) { var value = EmitExpression(addressOf.Expression); - if (value.Kind != ValKind.Pointer) - { - throw new UnreachableException(); - } - + Debug.Assert(value.Kind == ValKind.LValue); return value; } @@ -730,7 +722,7 @@ public static class QBEGenerator var left = EmitUnwrap(EmitExpression(binaryExpression.Left)); var right = EmitUnwrap(EmitExpression(binaryExpression.Right)); var outputName = VarName(); - var output = new Val(outputName, binaryExpression.Type, ValKind.Immediate); + var output = new Val(outputName, binaryExpression.Type, ValKind.Value); switch (binaryExpression.Operator) { @@ -964,19 +956,19 @@ public static class QBEGenerator { var value = float.Parse(literal.Literal, CultureInfo.InvariantCulture); var bits = BitConverter.SingleToInt32Bits(value); - return new Val(bits.ToString(), literal.Type, ValKind.Immediate); + return new Val(bits.ToString(), literal.Type, ValKind.Value); } if (literal.Type.IsFloat64) { var value = double.Parse(literal.Literal, CultureInfo.InvariantCulture); var bits = BitConverter.DoubleToInt64Bits(value); - return new Val(bits.ToString(), literal.Type, ValKind.Immediate); + return new Val(bits.ToString(), literal.Type, ValKind.Value); } if (literal.Type.IsInteger) { - return new Val(literal.Literal, literal.Type, ValKind.Immediate); + return new Val(literal.Literal, literal.Type, ValKind.Value); } break; @@ -985,21 +977,21 @@ public static class QBEGenerator { if (literal.Type.IsInteger) { - return new Val(literal.Literal.Split(".").First(), literal.Type, ValKind.Immediate); + return new Val(literal.Literal.Split(".").First(), literal.Type, ValKind.Value); } if (literal.Type.IsFloat32) { var value = float.Parse(literal.Literal, CultureInfo.InvariantCulture); var bits = BitConverter.SingleToInt32Bits(value); - return new Val(bits.ToString(), literal.Type, ValKind.Immediate); + return new Val(bits.ToString(), literal.Type, ValKind.Value); } if (literal.Type.IsFloat64) { var value = double.Parse(literal.Literal, CultureInfo.InvariantCulture); var bits = BitConverter.DoubleToInt64Bits(value); - return new Val(bits.ToString(), literal.Type, ValKind.Immediate); + return new Val(bits.ToString(), literal.Type, ValKind.Value); } break; @@ -1010,14 +1002,14 @@ public static class QBEGenerator { var stringLiteral = new StringLiteral(literal.Literal, StringName()); _stringLiterals.Add(stringLiteral); - return new Val(stringLiteral.Name, literal.Type, ValKind.Immediate); + return new Val(stringLiteral.Name, literal.Type, ValKind.Value); } if (literal.Type.IsCString) { var cStringLiteral = new CStringLiteral(literal.Literal, CStringName()); _cStringLiterals.Add(cStringLiteral); - return new Val(cStringLiteral.Name, literal.Type, ValKind.Immediate); + return new Val(cStringLiteral.Name, literal.Type, ValKind.Value); } break; @@ -1026,7 +1018,7 @@ public static class QBEGenerator { if (literal.Type.IsBool) { - return new Val(bool.Parse(literal.Literal) ? "1" : "0", literal.Type, ValKind.Immediate); + return new Val(bool.Parse(literal.Literal) ? "1" : "0", literal.Type, ValKind.Value); } break; @@ -1068,7 +1060,7 @@ public static class QBEGenerator } } - return new Val(output, structInitializer.StructType, ValKind.Immediate); + return new Val(output, structInitializer.StructType, ValKind.Value); } private static Val EmitUnaryExpression(BoundUnaryExpressionNode unaryExpression) @@ -1084,16 +1076,16 @@ public static class QBEGenerator { case NubPrimitiveType { Kind: PrimitiveTypeKind.I64 }: _builder.AppendLine($" {outputName} =l neg {operand}"); - return new Val(outputName, unaryExpression.Type, ValKind.Immediate); + return new Val(outputName, unaryExpression.Type, ValKind.Value); case NubPrimitiveType { Kind: PrimitiveTypeKind.I32 or PrimitiveTypeKind.I16 or PrimitiveTypeKind.I8 }: _builder.AppendLine($" {outputName} =w neg {operand}"); - return new Val(outputName, unaryExpression.Type, ValKind.Immediate); + return new Val(outputName, unaryExpression.Type, ValKind.Value); case NubPrimitiveType { Kind: PrimitiveTypeKind.F64 }: _builder.AppendLine($" {outputName} =d neg {operand}"); - return new Val(outputName, unaryExpression.Type, ValKind.Immediate); + return new Val(outputName, unaryExpression.Type, ValKind.Value); case NubPrimitiveType { Kind: PrimitiveTypeKind.F32 }: _builder.AppendLine($" {outputName} =s neg {operand}"); - return new Val(outputName, unaryExpression.Type, ValKind.Immediate); + return new Val(outputName, unaryExpression.Type, ValKind.Value); } break; @@ -1104,7 +1096,7 @@ public static class QBEGenerator { case NubPrimitiveType { Kind: PrimitiveTypeKind.Bool }: _builder.AppendLine($" {outputName} =w xor {operand}, 1"); - return new Val(outputName, unaryExpression.Type, ValKind.Immediate); + return new Val(outputName, unaryExpression.Type, ValKind.Value); } break; @@ -1130,7 +1122,7 @@ public static class QBEGenerator if (memberAccess.Member == "count") { _builder.AppendLine($" {output} =l loadl {item}"); - return new Val(output, memberAccess.Type, ValKind.Immediate); + return new Val(output, memberAccess.Type, ValKind.Value); } break; @@ -1140,7 +1132,7 @@ public static class QBEGenerator if (memberAccess.Member == "count") { _builder.AppendLine($" {output} =l call $nub_string_length(l {item})"); - return new Val(output, memberAccess.Type, ValKind.Immediate); + return new Val(output, memberAccess.Type, ValKind.Value); } break; } @@ -1149,7 +1141,7 @@ public static class QBEGenerator if (memberAccess.Member == "count") { _builder.AppendLine($" {output} =l call $nub_cstring_length(l {item})"); - return new Val(output, memberAccess.Type, ValKind.Immediate); + return new Val(output, memberAccess.Type, ValKind.Value); } break; } @@ -1159,7 +1151,7 @@ public static class QBEGenerator var offset = OffsetOf(structDefinition, memberAccess.Member); _builder.AppendLine($" {output} =l add {item}, {offset}"); - return new Val(output, memberAccess.Type, ValKind.Pointer); + return new Val(output, memberAccess.Type, ValKind.LValue); } } @@ -1211,12 +1203,12 @@ public static class QBEGenerator { var outputName = VarName(); _builder.AppendLine($" {outputName} {QBEAssign(funcCall.Type)} call {funcPointer}({string.Join(", ", parameterStrings)})"); - return new Val(outputName, funcCall.Type, ValKind.Immediate); + return new Val(outputName, funcCall.Type, ValKind.Value); } else { _builder.AppendLine($" call {funcPointer}({string.Join(", ", parameterStrings)})"); - return new Val(string.Empty, funcCall.Type, ValKind.Immediate); + return new Val(string.Empty, funcCall.Type, ValKind.Value); } } @@ -1242,11 +1234,11 @@ public static class QBEGenerator switch (val.Kind) { case ValKind.Func: - case ValKind.Immediate: + case ValKind.Value: { return val.Name; } - case ValKind.Pointer: + case ValKind.LValue: { if (val.Type is NubStructType) { @@ -1298,6 +1290,6 @@ internal class Val(string name, NubType type, ValKind kind) internal enum ValKind { Func, - Pointer, - Immediate + LValue, + Value } \ No newline at end of file