Skip to content

Commit 398ed5e

Browse files
authored
Add more diagnostics during dumping of IR (#923)
1 parent c0de201 commit 398ed5e

19 files changed

+325
-115
lines changed

Cesium.CodeGen.Tests/CodeGenNetInteropTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ private async Task VerifyAssemblyRuns(byte[] assemblyContentToRun, AbsolutePath
4040
var runtimeConfigPath = Path.ChangeExtension(assemblyPath.Value, ".runtimeconfig.json");
4141

4242
await File.WriteAllBytesAsync(assemblyPath.Value, assemblyContentToRun);
43-
await File.WriteAllTextAsync(runtimeConfigPath, RuntimeConfig.EmitNet9());
43+
await File.WriteAllTextAsync(runtimeConfigPath, RuntimeConfig.EmitNet10());
4444

4545
DeployReferenceAssembly(CSharpCompilationUtil.CesiumRuntimeLibraryPath);
4646
DeployReferenceAssembly(referencePath);

Cesium.CodeGen/Extensions/BlockItemEx.cs

Lines changed: 194 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
using Cesium.CodeGen.Contexts;
77
using Cesium.CodeGen.Ir.BlockItems;
88
using Cesium.CodeGen.Ir.Declarations;
9+
using Cesium.CodeGen.Ir.Expressions;
910
using Cesium.Core;
1011
using System.Diagnostics;
12+
using static System.Runtime.InteropServices.JavaScript.JSType;
1113
using AmbiguousBlockItem = Cesium.Ast.AmbiguousBlockItem;
1214
using BreakStatement = Cesium.Ast.BreakStatement;
1315
using CaseStatement = Cesium.Ast.CaseStatement;
@@ -127,6 +129,10 @@ public static void Dump(this Ir.Expressions.IExpression expression, TextWriter w
127129
binaryExpression.Operator.Dump(writer);
128130
binaryExpression.Right.Dump(writer);
129131
break;
132+
case Ir.Expressions.UnaryOperatorExpression unaryExpression:
133+
unaryExpression.Operator.Dump(writer);
134+
unaryExpression.Target.Dump(writer);
135+
break;
130136
case Ir.Expressions.ConstantLiteralExpression constLiteralExpression:
131137
constLiteralExpression.Constant.Dump(writer);
132138
break;
@@ -136,6 +142,110 @@ public static void Dump(this Ir.Expressions.IExpression expression, TextWriter w
136142
case Ir.Expressions.PostfixIncrementDecrementExpression.ValuePreservationExpression valuePreservationExpression:
137143
valuePreservationExpression.Expression.Dump(writer);
138144
break;
145+
case Ir.Expressions.LocalAllocationExpression localAllocationExpression:
146+
writer.Write($"{localAllocationExpression.ArrayType.Base.ToString()}[{localAllocationExpression.ArrayType.Size}]");
147+
break;
148+
case Ir.Expressions.GetAddressValueExpression getAddressValueExpression:
149+
writer.Write($"&");
150+
getAddressValueExpression.Value.Dump(writer);
151+
break;
152+
case Ir.Expressions.IdentifierExpression identifierExpression:
153+
writer.Write(identifierExpression.Identifier);
154+
break;
155+
case Ir.Expressions.FunctionCallExpression functionCallExpression:
156+
functionCallExpression.Function.Dump(writer);
157+
writer.Write($"(");
158+
for (var i = 0;i < functionCallExpression.Arguments.Count;i++)
159+
{
160+
if (i > 0)
161+
{
162+
writer.Write(", ");
163+
}
164+
functionCallExpression.Arguments[i].Dump(writer);
165+
}
166+
writer.Write($")");
167+
break;
168+
case Ir.Expressions.CompoundInitializationExpression compoundInitializationExpression:
169+
compoundInitializationExpression.ArrayInitializer.Dump(writer);
170+
break;
171+
case Ir.Expressions.ArrayInitializerExpression arrayInitializerExpression:
172+
writer.Write("{");
173+
for (var i = 0; i < arrayInitializerExpression.Initializers.Length; i++)
174+
{
175+
if (i > 0)
176+
{
177+
writer.Write(", ");
178+
}
179+
arrayInitializerExpression.Initializers[i]?.Dump(writer);
180+
}
181+
writer.Write("}");
182+
break;
183+
case Ir.Expressions.CompoundObjectInitializationExpression compoundObjectInitializationExpression:
184+
writer.Write("{");
185+
for (var i = 0; i < compoundObjectInitializationExpression.Initializers.Length; i++)
186+
{
187+
if (i > 0)
188+
{
189+
writer.Write(", ");
190+
}
191+
compoundObjectInitializationExpression.Initializers[i]?.Dump(writer);
192+
}
193+
writer.Write("}");
194+
break;
195+
case Ir.Expressions.CompoundObjectFieldInitializer compoundObjectFieldInitializer:
196+
foreach (var d in compoundObjectFieldInitializer.Designation.Designators)
197+
{
198+
d.Dump(writer);
199+
writer.Write(" = ");
200+
}
201+
202+
compoundObjectFieldInitializer.Inner.Dump(writer);
203+
writer.Write("}");
204+
break;
205+
case Ir.Expressions.TypeCastExpression typeCastExpression:
206+
writer.Write("(");
207+
writer.Write(typeCastExpression.TargetType.ToString());
208+
writer.Write(")");
209+
typeCastExpression.Expression.Dump(writer);
210+
break;
211+
case Ir.Expressions.ConsumeExpression consumeExpression:
212+
consumeExpression.Expression.Dump(writer);
213+
break;
214+
case Ir.Expressions.SizeOfOperatorExpression sizeOfOperatorExpression:
215+
writer.Write("sizeof(");
216+
writer.Write(sizeOfOperatorExpression.Type.ToString());
217+
writer.Write(")");
218+
break;
219+
case Ir.Expressions.IndirectFunctionCallExpression indirectFunctionCallExpression:
220+
indirectFunctionCallExpression.Callee.Dump(writer);
221+
writer.Write($"(");
222+
for (var i = 0; i < indirectFunctionCallExpression.Arguments.Count; i++)
223+
{
224+
if (i > 0)
225+
{
226+
writer.Write(", ");
227+
}
228+
indirectFunctionCallExpression.Arguments[i].Dump(writer);
229+
}
230+
writer.Write($")");
231+
break;
232+
case Ir.Expressions.CommaExpression commaExpression:
233+
writer.Write("(");
234+
writer.Write(commaExpression.Left.ToString());
235+
writer.Write(",");
236+
writer.Write(commaExpression.Right.ToString());
237+
writer.Write(")");
238+
break;
239+
case Ir.Expressions.ConditionalExpression conditionalExpression:
240+
conditionalExpression.Condition.Dump(writer);
241+
writer.Write("?");
242+
conditionalExpression.TrueExpression.Dump(writer);
243+
writer.Write(":");
244+
conditionalExpression.FalseExpression.Dump(writer);
245+
break;
246+
case Ir.Expressions.InstanceForOffsetOfExpression:
247+
// Do nothing for this expression/value
248+
break;
139249
default:
140250
Debug.Assert(false, $"Dumping {expression.GetType().Name} not implemented");
141251
break;
@@ -155,6 +265,32 @@ public static void Dump(this Ir.Expressions.Values.IValue expression, TextWriter
155265
writer.Write($"<var #{localValueVariable.VarIndex}>");
156266
}
157267

268+
break;
269+
case Ir.Expressions.Values.LValueArrayElement localArrayVariable:
270+
localArrayVariable.Array.Dump(writer);
271+
writer.Write($"[{localArrayVariable.Index}]");
272+
break;
273+
case Ir.Expressions.Values.LValueGlobalVariable localGlobalVariable:
274+
writer.Write($"{localGlobalVariable.Name}");
275+
break;
276+
case Ir.Expressions.Values.LValueIndirection localIndirection:
277+
writer.Write($"*");
278+
localIndirection.PointerExpression.Dump(writer);
279+
break;
280+
case Ir.Expressions.Values.LValueParameter parameter:
281+
writer.Write(parameter.ParameterInfo.Name);
282+
break;
283+
case Ir.Expressions.Values.LValueInstanceField instanceField:
284+
writer.Write("(");
285+
instanceField.Expression.Dump(writer);
286+
writer.Write(").");
287+
writer.Write(instanceField.Name);
288+
break;
289+
case Ir.Expressions.Values.FunctionValue functionValue:
290+
writer.Write(functionValue.FunctionInfo.Identifier);
291+
break;
292+
case Ir.Expressions.InstanceForOffsetOfExpression:
293+
// Do nothing for this expression/value
158294
break;
159295
default:
160296
Debug.Assert(false, $"Dumping {expression.GetType().Name} not implemented");
@@ -167,7 +303,19 @@ public static void Dump(this Ir.Expressions.Constants.IConstant expression, Text
167303
{
168304
case Ir.Expressions.Constants.IntegerConstant integerConstant:
169305
writer.Write(integerConstant.Value.ToString());
170-
306+
break;
307+
case Ir.Expressions.Constants.FloatingPointConstant floatingPointConstant:
308+
writer.Write(floatingPointConstant.Value.ToString());
309+
break;
310+
case Ir.Expressions.Constants.StringConstant stringConstant:
311+
writer.Write("\"");
312+
writer.Write(stringConstant.Value);
313+
writer.Write("\"");
314+
break;
315+
case Ir.Expressions.Constants.CharConstant charConstant:
316+
writer.Write("'");
317+
writer.Write(charConstant.Value);
318+
writer.Write("'");
171319
break;
172320
default:
173321
Debug.Assert(false, $"Dumping {expression.GetType().Name} not implemented");
@@ -179,9 +327,54 @@ public static void Dump(this Ir.Expressions.BinaryOperators.BinaryOperator expre
179327
var operatorString = expression switch
180328
{
181329
Ir.Expressions.BinaryOperators.BinaryOperator.Add => "+",
330+
Ir.Expressions.BinaryOperators.BinaryOperator.Subtract => "-",
331+
Ir.Expressions.BinaryOperators.BinaryOperator.Multiply => "*",
332+
Ir.Expressions.BinaryOperators.BinaryOperator.Divide => "/",
333+
Ir.Expressions.BinaryOperators.BinaryOperator.Remainder => "%",
334+
335+
Ir.Expressions.BinaryOperators.BinaryOperator.BitwiseLeftShift => "<<",
336+
Ir.Expressions.BinaryOperators.BinaryOperator.BitwiseRightShift => ">>",
337+
Ir.Expressions.BinaryOperators.BinaryOperator.BitwiseOr => "|",
338+
Ir.Expressions.BinaryOperators.BinaryOperator.BitwiseAnd => "&",
339+
Ir.Expressions.BinaryOperators.BinaryOperator.BitwiseXor => "^",
340+
182341
Ir.Expressions.BinaryOperators.BinaryOperator.EqualTo => "==",
342+
Ir.Expressions.BinaryOperators.BinaryOperator.NotEqualTo => "!=",
343+
Ir.Expressions.BinaryOperators.BinaryOperator.LessThan => "<",
344+
Ir.Expressions.BinaryOperators.BinaryOperator.LessThanOrEqualTo => "<=",
345+
Ir.Expressions.BinaryOperators.BinaryOperator.GreaterThan => ">",
346+
Ir.Expressions.BinaryOperators.BinaryOperator.GreaterThanOrEqualTo => ">=",
347+
348+
Ir.Expressions.BinaryOperators.BinaryOperator.LogicalOr => "||",
349+
Ir.Expressions.BinaryOperators.BinaryOperator.LogicalAnd => "&&",
183350
_ => throw new InvalidOperationException($"Dumping BinaryOperator.{expression} not implemented"),
184351
};
185352
writer.Write(operatorString);
186353
}
354+
public static void Dump(this Ir.Expressions.UnaryOperator expression, TextWriter writer)
355+
{
356+
var operatorString = expression switch
357+
{
358+
Ir.Expressions.UnaryOperator.Negation => "-",
359+
Ir.Expressions.UnaryOperator.Promotion => "+",
360+
Ir.Expressions.UnaryOperator.BitwiseNot => "~",
361+
Ir.Expressions.UnaryOperator.LogicalNot => "!",
362+
Ir.Expressions.UnaryOperator.AddressOf => "&",
363+
Ir.Expressions.UnaryOperator.Indirection => "*",
364+
_ => throw new InvalidOperationException($"Dumping UnaryOperator.{expression} not implemented"),
365+
};
366+
writer.Write(operatorString);
367+
}
368+
public static void Dump(this Ast.Designator expression, TextWriter writer)
369+
{
370+
switch (expression)
371+
{
372+
case Ast.IdentifierDesignator identifier:
373+
writer.Write(identifier.FieldName);
374+
break;
375+
default:
376+
Debug.Assert(false, $"Dumping {expression.GetType().Name} not implemented");
377+
break;
378+
}
379+
}
187380
}

Cesium.CodeGen/Ir/Expressions/CommaExpression.cs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,23 +11,20 @@ namespace Cesium.CodeGen.Ir.Expressions;
1111

1212
internal sealed class CommaExpression : IExpression
1313
{
14-
private readonly IExpression _left;
15-
private readonly IExpression _right;
14+
internal IExpression Left { get; }
1615

17-
internal IExpression Left => _left;
18-
19-
internal IExpression Right => _right;
16+
internal IExpression Right { get; }
2017

2118
internal CommaExpression(IExpression left, IExpression right)
2219
{
23-
_left = left;
24-
_right = right;
20+
Left = left;
21+
Right = right;
2522
}
2623

2724
public CommaExpression(Ast.CommaExpression expression, IDeclarationScope scope)
2825
{
29-
_left = expression.Left.ToIntermediate(scope);
30-
_right = expression.Right.ToIntermediate(scope);
26+
Left = expression.Left.ToIntermediate(scope);
27+
Right = expression.Right.ToIntermediate(scope);
3128
}
3229

3330
public IExpression Lower(IDeclarationScope scope) => new CommaExpression(Left.Lower(scope), Right.Lower(scope));

Cesium.CodeGen/Ir/Expressions/CompoundObjectInitializationExpression.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ internal sealed class CompoundObjectInitializationExpression : IExpression
1919
private FieldDefinition? _typeDef;
2020
private Action? _prefixAction;
2121
private Action? _postfixAction;
22-
private readonly ImmutableArray<IExpression?> _initializers;
22+
23+
internal ImmutableArray<IExpression?> Initializers { get; }
2324

2425
public CompoundObjectInitializationExpression(IType? type, ImmutableArray<IExpression?> initializers)
2526
{
2627
_type = type;
27-
_initializers = initializers;
28+
Initializers = initializers;
2829
}
2930

3031
public CompoundObjectInitializationExpression(ImmutableArray<IExpression?> initializers)
@@ -36,7 +37,7 @@ public CompoundObjectInitializationExpression(CompoundLiteralExpression expressi
3637
{
3738
var (type, _) = LocalDeclarationInfo.ProcessSpecifiers(expression.TypeName.SpecifierQualifierList, scope);
3839
_type = type;
39-
_initializers = expression.Initializers.Select(initializer => IScopedDeclarationInfo.ConvertInitializer(_type, initializer, scope)).ToImmutableArray();
40+
Initializers = expression.Initializers.Select(initializer => IScopedDeclarationInfo.ConvertInitializer(_type, initializer, scope)).ToImmutableArray();
4041
}
4142

4243
public void Hint(FieldDefinition type, Action prefixAction, Action postfixAction)
@@ -54,7 +55,7 @@ public void EmitTo(IEmitScope scope)
5455
var instructions = scope.Method.Body.Instructions;
5556
TypeDefinition typeDef = _type != null ? ((StructType)_type).Resolve(scope.Context).Resolve() : _typeDef!.FieldType.Resolve();
5657
var fieldsDefs = typeDef.Fields;
57-
var initializers = _initializers;
58+
var initializers = Initializers;
5859

5960
if (typeDef.IsCArray())
6061
{
@@ -284,7 +285,7 @@ static Instruction GetWriteInstruction(MetadataType type)
284285
public IExpression Lower(IDeclarationScope scope)
285286
{
286287
var resolvedType = _type?.TypeKind == TypeKind.Unresolved ? scope.ResolveType(_type) : _type;
287-
var initializers = _initializers.Select(e => e?.Lower(scope)).ToImmutableArray();
288+
var initializers = Initializers.Select(e => e?.Lower(scope)).ToImmutableArray();
288289
return resolvedType == null ? new CompoundObjectInitializationExpression(initializers) : new CompoundObjectInitializationExpression(resolvedType, initializers);
289290
}
290291
}

0 commit comments

Comments
 (0)