diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2018-03-14 01:09:29 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-03-14 01:09:29 +0300 |
commit | 82cfd0f1b2660d508b43ec7f696f481b0d716c03 (patch) | |
tree | f9029dd94da321f42f587244c8cc73a43048b5a4 /src/ILCompiler.CppCodeGen | |
parent | ac0e7837374061ab10f8632563818afa371075fb (diff) |
Fix interface dispatch with CppCodegen (#5533)
This got broken when sorting got introduced to stabilize the executable image. Instead of relying on implicit ordering of nodes, use order specified in the map.
Diffstat (limited to 'src/ILCompiler.CppCodeGen')
-rw-r--r-- | src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs b/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs index fb2130704..bf2938b34 100644 --- a/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs +++ b/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs @@ -15,6 +15,8 @@ using Internal.Text; using Internal.TypeSystem; using Internal.TypeSystem.Ecma; +using Debug = System.Diagnostics.Debug; + namespace ILCompiler.CppCodeGen { internal class CppWriter @@ -1011,10 +1013,6 @@ namespace ILCompiler.CppCodeGen //RTR header needs to be declared after all modules have already been output string rtrHeader = string.Empty; - // GetData stabilizes the indices of the embedded objects. This must be done manually - // for C++ codegen since we don't currently emit the DispatchMapTable node directly. - factory.DispatchMapTable.GetData(factory, false); - // Iterate through nodes foreach (var node in nodeIterator.GetNodes()) { @@ -1022,15 +1020,19 @@ namespace ILCompiler.CppCodeGen OutputTypeNode(node as EETypeNode, factory, typeDefinitions, methodTables); else if ((node is EETypeOptionalFieldsNode || node is TypeManagerIndirectionNode || node is GenericCompositionNode) && !(node as ObjectNode).ShouldSkipEmittingObjectNode(factory)) additionalNodes.Append(GetCodeForObjectNode(node as ObjectNode, factory)); - else if (node is InterfaceDispatchMapNode) + else if (node is ArrayOfEmbeddedPointersNode<InterfaceDispatchMapNode> dispatchMap) { - dispatchPointers.Append("(void *)"); - dispatchPointers.Append(((ISymbolNode)node).GetMangledName(factory.NameMangler)); - dispatchPointers.Append("(),"); - dispatchPointers.AppendLine(); - dispatchMapCount++; - additionalNodes.Append(GetCodeForObjectNode(node as ObjectNode, factory)); - + var dispatchMapData = dispatchMap.GetData(factory, false); + Debug.Assert(dispatchMapData.Relocs.Length == dispatchMapData.Data.Length / factory.Target.PointerSize); + foreach (Relocation reloc in dispatchMapData.Relocs) + { + dispatchPointers.Append("(void *)"); + dispatchPointers.Append(reloc.Target.GetMangledName(factory.NameMangler)); + dispatchPointers.Append("(),"); + dispatchPointers.AppendLine(); + dispatchMapCount++; + additionalNodes.Append(GetCodeForObjectNode(reloc.Target as ObjectNode, factory)); + } } else if (node is ReadyToRunHeaderNode) rtrHeader = GetCodeForReadyToRunHeader(node as ReadyToRunHeaderNode, factory); |