diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2018-07-17 20:59:53 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-17 20:59:53 +0300 |
commit | 2e533d85ee6c7922c97e2e59945d86d2d696ebcd (patch) | |
tree | e0a818350ca888f562b1f28a113ee05a7368c5ec /src/ILCompiler.CppCodeGen | |
parent | c1e97380862b2281763b34462627a86187f47bea (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.cs | 65 |
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) { |