public Dictionary <string, string> Merge() { // 排序编译单元 var sortedUnits = UnitMap.Values.ToList(); sortedUnits.Sort((lhs, rhs) => GetDependOrder(lhs).CompareTo(GetDependOrder(rhs))); // 合并编译单元 UnitMap.Clear(); var transMap = new Dictionary <string, string>(); // 收集桥接代码的所有依赖项 var bridgeUnitNames = new HashSet <string>(); var bridgeUnits = new List <CompileUnit>(); var remainUnits = new List <CompileUnit>(); for (; ;) { bool changed = false; foreach (var unit in sortedUnits) { string unitName = unit.Name; if (BridgeTypes.Contains(unitName) || bridgeUnitNames.Contains(unitName)) { bridgeUnits.Add(unit); bridgeUnitNames.Add(unitName); bridgeUnitNames.UnionWith(unit.DeclDepends); changed = true; } else { remainUnits.Add(unit); } } if (changed) { sortedUnits = remainUnits; remainUnits = new List <CompileUnit>(); } else { break; } } bridgeUnits.Sort((lhs, rhs) => GetDependOrder(lhs).CompareTo(GetDependOrder(rhs))); // 生成桥接单元 CompileUnit bridgeUnit = new CompileUnit(); bridgeUnit.Name = "il2cppBridge"; UnitMap.Add(bridgeUnit.Name, bridgeUnit); foreach (var unit in bridgeUnits) { bridgeUnit.DeclCode += "#define IL2CPP_BRIDGE_HAS_" + unit.Name + '\n'; bridgeUnit.Append(unit); transMap[unit.Name] = bridgeUnit.Name; } // 划分其他编译单元 CompileUnit currUnit = NewUnit(); foreach (var unit in sortedUnits) { Debug.Assert(!bridgeUnit.DeclDepends.Contains(unit.Name)); currUnit.Append(unit); transMap[unit.Name] = currUnit.Name; if (IsUnitFull(currUnit)) { currUnit = NewUnit(); } } if (currUnit.IsEmpty()) { UnitMap.Remove(currUnit.Name); } foreach (var unit in UnitMap.Values) { var declDeps = new HashSet <string>(); foreach (string dep in unit.DeclDepends) { declDeps.Add(transMap[dep]); } unit.DeclDepends = declDeps; var implDeps = new HashSet <string>(); foreach (string dep in unit.ImplDepends) { implDeps.Add(transMap[dep]); } unit.ImplDepends = implDeps; unit.Optimize(UnitMap); } return(transMap); }
public Dictionary <string, string> Merge() { // 排序编译单元 var sortedUnits = UnitMap.Values.ToList(); sortedUnits.Sort((lhs, rhs) => GetDependOrder(lhs).CompareTo(GetDependOrder(rhs))); // 合并编译单元 UnitMap.Clear(); var transMap = new Dictionary <string, string>(); CompileUnit bridgeUnit = new CompileUnit(); bridgeUnit.Name = "il2cppBridge"; UnitMap.Add(bridgeUnit.Name, bridgeUnit); CompileUnit currUnit = NewUnit(); foreach (var unit in sortedUnits) { if (BridgeTypes.Contains(unit.Name)) { bridgeUnit.Append(unit); transMap[unit.Name] = bridgeUnit.Name; } else { currUnit.Append(unit); transMap[unit.Name] = currUnit.Name; if (IsUnitFull(currUnit)) { currUnit = NewUnit(); } } } if (currUnit.IsEmpty()) { UnitMap.Remove(currUnit.Name); } foreach (var unit in UnitMap.Values) { var declDeps = new HashSet <string>(); foreach (string dep in unit.DeclDepends) { declDeps.Add(transMap[dep]); } unit.DeclDepends = declDeps; var implDeps = new HashSet <string>(); foreach (string dep in unit.ImplDepends) { implDeps.Add(transMap[dep]); } unit.ImplDepends = implDeps; unit.Optimize(UnitMap); } return(transMap); }