...
This commit is contained in:
@@ -122,7 +122,7 @@ public static class QBEGenerator
|
||||
PrimitiveTypeKind.F64 => "stored",
|
||||
PrimitiveTypeKind.F32 => "stores",
|
||||
PrimitiveTypeKind.Bool => "storew",
|
||||
_ => throw new UnreachableException()
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
},
|
||||
NubStructType => "storel",
|
||||
NubFixedArrayType => "storel",
|
||||
@@ -150,7 +150,7 @@ public static class QBEGenerator
|
||||
PrimitiveTypeKind.F64 => "loadd",
|
||||
PrimitiveTypeKind.F32 => "loads",
|
||||
PrimitiveTypeKind.Bool => "loadw",
|
||||
_ => throw new UnreachableException()
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
},
|
||||
NubStructType => "loadl",
|
||||
NubFixedArrayType => "loadl",
|
||||
@@ -178,7 +178,7 @@ public static class QBEGenerator
|
||||
PrimitiveTypeKind.F64 => "=d",
|
||||
PrimitiveTypeKind.F32 => "=s",
|
||||
PrimitiveTypeKind.Bool => "=w",
|
||||
_ => throw new UnreachableException()
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
},
|
||||
NubStructType => "=l",
|
||||
NubFixedArrayType => "=l",
|
||||
@@ -231,7 +231,7 @@ public static class QBEGenerator
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new UnreachableException();
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -303,11 +303,31 @@ public static class QBEGenerator
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new UnreachableException();
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static int OffsetOf(StructDefinitionNode structDefinition, string member)
|
||||
{
|
||||
var offset = 0;
|
||||
|
||||
foreach (var field in structDefinition.Fields)
|
||||
{
|
||||
if (field.Name == member)
|
||||
{
|
||||
return offset;
|
||||
}
|
||||
|
||||
var fieldAlignment = AlignmentOf(field.Type);
|
||||
|
||||
offset = AlignTo(offset, fieldAlignment);
|
||||
offset += SizeOf(field.Type);
|
||||
}
|
||||
|
||||
throw new UnreachableException($"Member '{member}' not found in struct");
|
||||
}
|
||||
|
||||
private static bool IsLargeType(NubType type)
|
||||
{
|
||||
return type switch
|
||||
@@ -352,7 +372,7 @@ public static class QBEGenerator
|
||||
PrimitiveTypeKind.F64 => "d",
|
||||
PrimitiveTypeKind.F32 => "s",
|
||||
PrimitiveTypeKind.Bool => "w",
|
||||
_ => throw new UnreachableException()
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
},
|
||||
NubStructType structType => StructName(_definitionTable.LookupStruct(structType.Namespace, structType.Name).GetValue()),
|
||||
NubFixedArrayType => "l",
|
||||
@@ -383,7 +403,7 @@ public static class QBEGenerator
|
||||
PrimitiveTypeKind.F64 => "d",
|
||||
PrimitiveTypeKind.F32 => "s",
|
||||
PrimitiveTypeKind.Bool => "w",
|
||||
_ => throw new UnreachableException()
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
},
|
||||
NubStructType structType => StructName(_definitionTable.LookupStruct(structType.Namespace, structType.Name).GetValue()),
|
||||
NubFixedArrayType => "l",
|
||||
@@ -464,7 +484,7 @@ public static class QBEGenerator
|
||||
PrimitiveTypeKind.F64 => "d",
|
||||
PrimitiveTypeKind.F32 => "s",
|
||||
PrimitiveTypeKind.Bool => "w",
|
||||
_ => throw new UnreachableException()
|
||||
_ => throw new ArgumentOutOfRangeException()
|
||||
},
|
||||
NubStructType structType => StructName(_definitionTable.LookupStruct(structType.Namespace, structType.Name).GetValue()),
|
||||
NubFixedArrayType fixedArrayType => $"b {SizeOf(fixedArrayType)}",
|
||||
@@ -557,7 +577,7 @@ public static class QBEGenerator
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new UnreachableException();
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -636,7 +656,7 @@ public static class QBEGenerator
|
||||
Debug.Assert(structType != null);
|
||||
|
||||
var structDefinition = _definitionTable.LookupStruct(structType.Namespace, structType.Name).GetValue();
|
||||
var offset = LookupMemberOffset(structDefinition, memberAssignment.MemberAccess.Member);
|
||||
var offset = OffsetOf(structDefinition, memberAssignment.MemberAccess.Member);
|
||||
|
||||
var item = GenerateExpression(memberAssignment.MemberAccess.Expression);
|
||||
var pointer = VarName();
|
||||
@@ -770,7 +790,7 @@ public static class QBEGenerator
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new UnreachableException();
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -859,7 +879,7 @@ public static class QBEGenerator
|
||||
case MemberAccessNode memberAccess:
|
||||
return GenerateMemberAccessPointer(memberAccess);
|
||||
default:
|
||||
throw new UnreachableException();
|
||||
throw new ArgumentOutOfRangeException();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1160,7 +1180,7 @@ public static class QBEGenerator
|
||||
|
||||
foreach (var field in structDefinition.Fields)
|
||||
{
|
||||
var offset = LookupMemberOffset(structDefinition, field.Name);
|
||||
var offset = OffsetOf(structDefinition, field.Name);
|
||||
|
||||
if (structInitializer.Initializers.TryGetValue(field.Name, out var fieldValue))
|
||||
{
|
||||
@@ -1249,7 +1269,7 @@ public static class QBEGenerator
|
||||
case NubStructType structType:
|
||||
{
|
||||
var structDefinition = _definitionTable.LookupStruct(structType.Namespace, structType.Name).GetValue();
|
||||
var offset = LookupMemberOffset(structDefinition, memberAccess.Member);
|
||||
var offset = OffsetOf(structDefinition, memberAccess.Member);
|
||||
|
||||
var offsetName = VarName();
|
||||
_builder.AppendLine($" {offsetName} =l add {item}, {offset}");
|
||||
@@ -1257,7 +1277,7 @@ public static class QBEGenerator
|
||||
}
|
||||
default:
|
||||
{
|
||||
throw new UnreachableException(nameof(memberAccess.Expression.Type));
|
||||
throw new ArgumentOutOfRangeException(nameof(memberAccess.Expression.Type));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1384,24 +1404,4 @@ public static class QBEGenerator
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
private static int LookupMemberOffset(StructDefinitionNode structDefinition, string member)
|
||||
{
|
||||
var offset = 0;
|
||||
|
||||
foreach (var field in structDefinition.Fields)
|
||||
{
|
||||
if (field.Name == member)
|
||||
{
|
||||
return offset;
|
||||
}
|
||||
|
||||
var fieldAlignment = AlignmentOf(field.Type);
|
||||
|
||||
offset = AlignTo(offset, fieldAlignment);
|
||||
offset += SizeOf(field.Type);
|
||||
}
|
||||
|
||||
throw new ArgumentException($"Member '{member}' not found in struct");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user