Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>2018-03-14 01:09:29 +0300
committerGitHub <noreply@github.com>2018-03-14 01:09:29 +0300
commit82cfd0f1b2660d508b43ec7f696f481b0d716c03 (patch)
treef9029dd94da321f42f587244c8cc73a43048b5a4 /src/ILCompiler.CppCodeGen
parentac0e7837374061ab10f8632563818afa371075fb (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.cs26
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);