public ProgramClosure(MethodInfo entryMethod, CrRuntimeLibrary crRuntime) { var optimizationsTable = BuildProgramWideOptimizationsTable(); Runtime = crRuntime; Runtime.Closure = this; EntryInterpreter = entryMethod.Register(); ResultingInFunctionOptimizationPass.Runtime = Runtime; ResultingGlobalOptimizationPass.Runtime = Runtime; BuildMethodClosure(); MetaLinkerOptimizer.ApplyOptimizations(MethodClosure.Values.ToList()); if (optimizationsTable.Optimize(this)) { MetaLinkerOptimizer.ApplyOptimizations(MethodClosure.Values.ToList()); } //BuildMethodClosure(); AddAlwaysUsedType(typeof(object)); TypesClosureLinker.SortTypeClosure(UsedTypes, crRuntime); var typeTable = new TypeDescriptionTable(UsedTypes); _typeDictionary = typeTable.ExtractInformation(); BuildVirtualMethodTable(typeTable, MethodClosure); }
private void BuildMethodClosure() { var entryInterpreter = EntryInterpreter; var result = TypesClosureLinker.BuildClosureForEntry(entryInterpreter, this); MethodClosure = result.MethodInterpreters; UsedTypes = result.UsedTypes.ToList(); foreach (var methodInterpreter in MethodClosure) { methodInterpreter.Value.Process(Runtime); methodInterpreter.Value.MidRepresentation.UpdateUseDef(); } }