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-07-17 20:59:53 +0300
committerGitHub <noreply@github.com>2018-07-17 20:59:53 +0300
commit2e533d85ee6c7922c97e2e59945d86d2d696ebcd (patch)
treee0a818350ca888f562b1f28a113ee05a7368c5ec /src/ILCompiler.CppCodeGen
parentc1e97380862b2281763b34462627a86187f47bea (diff)
Add support for embedding runtime configuration (#6103)
Runtime configuration (e.g. whether to use server GC) can currently be provided either through environment variables at runtime, or through a RhConfig.ini file placed next to the executable. This adds another channel where we burn a blob similar to RhConfig.ini format into the executable. The order of precedence is environment variable > RhConfig.ini > embedded config. The `ServerGarbageCollection` project property that is used to determine whether to link with a runtime that supports server GC will be also used to control whether to generate a configuration that enables server GC at runtime by default. Fixes #6100.
Diffstat (limited to 'src/ILCompiler.CppCodeGen')
-rw-r--r--src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs65
1 files changed, 42 insertions, 23 deletions
diff --git a/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs b/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs
index 78b2b1468..7472c0893 100644
--- a/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs
+++ b/src/ILCompiler.CppCodeGen/src/CppCodeGen/CppWriter.cs
@@ -799,42 +799,61 @@ namespace ILCompiler.CppCodeGen
}
}
}
+
+ bool generateMethod = !(node is BlobNode);
+
string pointerType = node is EETypeNode ? "MethodTable * " : "void* ";
- nodeCode.Append(pointerType);
- if (node is EETypeNode)
+ if (generateMethod)
{
- nodeCode.Append(GetCppMethodDeclarationName((node as EETypeNode).Type, "__getMethodTable"));
+ nodeCode.Append(pointerType);
+ if (node is EETypeNode)
+ {
+ nodeCode.Append(GetCppMethodDeclarationName((node as EETypeNode).Type, "__getMethodTable"));
+ }
+ else
+ {
+ string mangledName = ((ISymbolNode)node).GetMangledName(factory.NameMangler);
+
+ // Rename generic composition and optional fields nodes to avoid name clash with types
+ bool shouldReplaceNamespaceQualifier = node is GenericCompositionNode || node is EETypeOptionalFieldsNode;
+ nodeCode.Append(shouldReplaceNamespaceQualifier ? mangledName.Replace("::", "_") : mangledName);
+ }
+ nodeCode.Append("()");
+ nodeCode.AppendLine();
+ nodeCode.Append("{");
+ nodeCode.Indent();
+ nodeCode.AppendLine();
+ nodeCode.Append("static ");
}
else
{
- string mangledName = ((ISymbolNode)node).GetMangledName(factory.NameMangler);
-
- // Rename generic composition and optional fields nodes to avoid name clash with types
- bool shouldReplaceNamespaceQualifier = node is GenericCompositionNode || node is EETypeOptionalFieldsNode;
- nodeCode.Append(shouldReplaceNamespaceQualifier ? mangledName.Replace("::", "_") : mangledName);
+ nodeCode.Append("extern \"C\" ");
}
- nodeCode.Append("()");
- nodeCode.AppendLine();
- nodeCode.Append("{");
- nodeCode.Indent();
- nodeCode.AppendLine();
- nodeCode.Append("static struct {");
+ nodeCode.Append("struct {");
nodeCode.AppendLine();
nodeCode.Append(GetCodeForNodeStruct(nodeDataSections, node));
nodeCode.AppendLine();
- nodeCode.Append("} mt = {");
+
+ if (generateMethod)
+ nodeCode.Append("} mt = {");
+ else
+ nodeCode.Append(" } " + ((ISymbolNode)node).GetMangledName(factory.NameMangler) + " = {");
nodeCode.Append(GetCodeForNodeData(nodeDataSections, relocs, nodeData.Data, node, offset, factory));
nodeCode.Append("};");
- nodeCode.AppendLine();
- nodeCode.Append("return ( ");
- nodeCode.Append(pointerType);
- nodeCode.Append(")&mt;");
- nodeCode.Exdent();
- nodeCode.AppendLine();
- nodeCode.Append("}");
+
+ if (generateMethod)
+ {
+ nodeCode.AppendLine();
+ nodeCode.Append("return ( ");
+ nodeCode.Append(pointerType);
+ nodeCode.Append(")&mt;");
+ nodeCode.Exdent();
+ nodeCode.AppendLine();
+ nodeCode.Append("}");
+ }
nodeCode.AppendLine();
return nodeCode.ToString();
}
@@ -1018,7 +1037,7 @@ namespace ILCompiler.CppCodeGen
{
if (node is EETypeNode)
OutputTypeNode(node as EETypeNode, factory, typeDefinitions, methodTables);
- else if ((node is EETypeOptionalFieldsNode || node is TypeManagerIndirectionNode || node is GenericCompositionNode) && !(node as ObjectNode).ShouldSkipEmittingObjectNode(factory))
+ else if ((node is EETypeOptionalFieldsNode || node is TypeManagerIndirectionNode || node is GenericCompositionNode || node is BlobNode) && !(node as ObjectNode).ShouldSkipEmittingObjectNode(factory))
additionalNodes.Append(GetCodeForObjectNode(node as ObjectNode, factory));
else if (node is ArrayOfEmbeddedPointersNode<InterfaceDispatchMapNode> dispatchMap)
{