Skip to content

Commit 936c676

Browse files
author
NielsDev
committed
Fix issue with .ctor
1 parent b6f8f5e commit 936c676

File tree

2 files changed

+44
-27
lines changed

2 files changed

+44
-27
lines changed

CSharpLLVM/Compilation/Compiler.cs

Lines changed: 40 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,21 @@ public void Compile(string moduleName)
103103
// O0
104104
if (Options.Optimization >= OptimizationLevel.O0)
105105
{
106+
// Function passes.
106107
LLVM.AddPromoteMemoryToRegisterPass(mFunctionPassManager);
107108
LLVM.AddConstantPropagationPass(mFunctionPassManager);
108109
LLVM.AddReassociatePass(mFunctionPassManager);
109110
LLVM.AddInstructionCombiningPass(mFunctionPassManager);
110-
LLVM.AddMemCpyOptPass(mFunctionPassManager);
111+
112+
// Module passes.
113+
LLVM.AddStripDeadPrototypesPass(mPassManager);
114+
LLVM.AddStripSymbolsPass(mPassManager);
111115
}
112116

113117
// O1
114118
if (Options.Optimization >= OptimizationLevel.O1)
115119
{
120+
// Function passes.
116121
LLVM.AddLowerExpectIntrinsicPass(mFunctionPassManager);
117122
LLVM.AddEarlyCSEPass(mFunctionPassManager);
118123
LLVM.AddLoopRotatePass(mFunctionPassManager);
@@ -124,25 +129,9 @@ public void Compile(string moduleName)
124129
LLVM.AddDeadStoreEliminationPass(mFunctionPassManager);
125130
LLVM.AddJumpThreadingPass(mFunctionPassManager);
126131
LLVM.AddCFGSimplificationPass(mFunctionPassManager);
127-
}
128-
129-
// O2
130-
if (Options.Optimization >= OptimizationLevel.O2)
131-
{
132-
LLVM.AddLoopVectorizePass(mFunctionPassManager);
133-
LLVM.AddSLPVectorizePass(mFunctionPassManager);
134-
}
135-
136-
// O0
137-
if (Options.Optimization >= OptimizationLevel.O0)
138-
{
139-
LLVM.AddStripDeadPrototypesPass(mPassManager);
140-
LLVM.AddStripSymbolsPass(mPassManager);
141-
}
132+
LLVM.AddMemCpyOptPass(mFunctionPassManager);
142133

143-
// O1
144-
if (Options.Optimization >= OptimizationLevel.O1)
145-
{
134+
// Module passes.
146135
LLVM.AddAlwaysInlinerPass(mPassManager);
147136
LLVM.AddDeadArgEliminationPass(mPassManager);
148137
LLVM.AddAggressiveDCEPass(mFunctionPassManager);
@@ -151,11 +140,16 @@ public void Compile(string moduleName)
151140
// O2
152141
if (Options.Optimization >= OptimizationLevel.O2)
153142
{
143+
// Function passes.
144+
LLVM.AddLoopVectorizePass(mFunctionPassManager);
145+
LLVM.AddSLPVectorizePass(mFunctionPassManager);
146+
147+
// Module passes.
154148
LLVM.AddFunctionInliningPass(mPassManager);
155149
LLVM.AddConstantMergePass(mPassManager);
156150
LLVM.AddArgumentPromotionPass(mPassManager);
157151
}
158-
152+
159153
// Initialize types and runtime.
160154
string dataLayout = LLVM.GetDataLayout(Module);
161155
TargetData = LLVM.CreateTargetData(dataLayout);
@@ -173,7 +167,9 @@ public void Compile(string moduleName)
173167
Console.ForegroundColor = ConsoleColor.Gray;
174168

175169
// Debug: print LLVM assembly code.
176-
//Console.WriteLine(LLVM.PrintModuleToString(mModule));
170+
#if DEBUG
171+
Console.WriteLine(LLVM.PrintModuleToString(mModule));
172+
#endif
177173

178174
// Verify and throw exception on error.
179175
Console.ForegroundColor = ConsoleColor.DarkGray;
@@ -197,7 +193,7 @@ public void Compile(string moduleName)
197193
TargetMachineRef machine = LLVM.CreateTargetMachine(target, triplet, "generic", "", CodeGenOptLevel.CodeGenLevelDefault, RelocMode.RelocDefault, CodeModel.CodeModelDefault);
198194
LLVM.SetModuleDataLayout(mModule, LLVM.CreateTargetDataLayout(machine));
199195
CodeGenFileType type = (Options.OutputAssembly) ? CodeGenFileType.AssemblyFile : CodeGenFileType.ObjectFile;
200-
196+
201197
if (LLVM.TargetMachineEmitToFile(machine, mModule, Options.OutputFile, type, out error))
202198
{
203199
throw new InvalidOperationException(error);
@@ -284,6 +280,8 @@ private int sortTypes(TypeDefinition left, TypeDefinition right)
284280
private void compileModule(ModuleDefinition moduleDef)
285281
{
286282
List<MethodDefinition> methods = new List<MethodDefinition>();
283+
List<MethodDefinition> ctors = new List<MethodDefinition>();
284+
287285
Collection<TypeDefinition> types = moduleDef.Types;
288286
List<TypeDefinition> sortedTypes = new List<TypeDefinition>();
289287

@@ -300,7 +298,13 @@ private void compileModule(ModuleDefinition moduleDef)
300298
// Compiles types and adds methods.
301299
foreach (TypeDefinition type in sortedTypes)
302300
{
303-
compileType(type, methods);
301+
compileType(type, methods, ctors);
302+
}
303+
304+
// COmpile .ctors.
305+
foreach (MethodDefinition ctor in ctors)
306+
{
307+
compileMethod(ctor);
304308
}
305309

306310
// Compile methods.
@@ -322,20 +326,30 @@ private void compileModule(ModuleDefinition moduleDef)
322326
/// Compiles a type.
323327
/// </summary>
324328
/// <param name="type">The type definition.</param>
325-
private void compileType(TypeDefinition type, List<MethodDefinition> methods)
329+
/// <param name="methods">The list of methods to add ours to.</param>
330+
/// <param name="ctors">The list of ctors to add our to.</param>
331+
private void compileType(TypeDefinition type, List<MethodDefinition> methods, List<MethodDefinition> ctors)
326332
{
327333
// Nested types.
328334
foreach (TypeDefinition inner in type.NestedTypes)
329335
{
330-
compileType(inner, methods);
336+
compileType(inner, methods, ctors);
331337
}
332338

333339
mTypeCompiler.Compile(type);
334340

335341
// Note: First, we need all types to generate before we can generate methods,
336342
// because methods may refer to types that are not yet generated.
337343
if (!type.IsInterface)
338-
methods.AddRange(type.Methods);
344+
{
345+
foreach (MethodDefinition method in type.Methods)
346+
{
347+
if (method.Name == ".ctor")
348+
ctors.Add(method);
349+
else
350+
methods.Add(method);
351+
}
352+
}
339353
}
340354

341355
/// <summary>

CSharpLLVM/Generator/Instructions/Objects/EmitNewobj.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ public void Emit(Instruction instruction, MethodContext context, BuilderRef buil
3535
objPtr = LLVM.BuildAlloca(builder, type, "newobj");
3636
}
3737

38+
// Constructor.
39+
ValueRef? ctorFunc = context.Compiler.Lookup.GetFunction(NameHelper.CreateMethodName(ctor));
40+
3841
// Get .ctor parameters.
3942
int paramCount = 1 + ctor.Parameters.Count;
4043
ValueRef[] values = new ValueRef[paramCount];
@@ -46,7 +49,7 @@ public void Emit(Instruction instruction, MethodContext context, BuilderRef buil
4649
}
4750

4851
// Call .ctor.
49-
LLVM.BuildCall(builder, context.Compiler.Lookup.GetFunction(NameHelper.CreateMethodName(ctor)).Value, values, string.Empty);
52+
LLVM.BuildCall(builder, ctorFunc.Value, values, string.Empty);
5053

5154
// Load and push object on stack.
5255
ValueRef obj = (ptr) ? objPtr : LLVM.BuildLoad(builder, objPtr, "obj");

0 commit comments

Comments
 (0)