File: parent\parent\Common\Compiler\DependencyAnalysis\NodeFactory.Wasm.cs
Web Access
Project: ILCompiler.Compiler.csproj (ILCompiler.Compiler)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Frozen;
using System.Threading;
using Internal.Text;

namespace ILCompiler.DependencyAnalysis
{
    public partial class NodeFactory
    {
        // The well-known wasm globals are immutable relocation targets. They are created
        // lazily on first access (only wasm targets ever request them) so non-wasm compilations don't
        // pay the allocation.
        private FrozenDictionary<Utf8String, WasmWellKnownGlobalSymbolNode> _wasmWellKnownGlobals;

        public WasmWellKnownGlobalSymbolNode GetWellKnownWasmGlobalSymbol(Utf8String symbolName)
        {
            FrozenDictionary<Utf8String, WasmWellKnownGlobalSymbolNode> globals = _wasmWellKnownGlobals;
            if (globals is null)
            {
                globals = FrozenDictionary.Create<Utf8String, WasmWellKnownGlobalSymbolNode>([
                    new(new(WasmWellKnownGlobalSymbolNode.StackPointerName), new WasmWellKnownGlobalSymbolNode(WasmWellKnownGlobalSymbolNode.StackPointerName)),
                    new(new(WasmWellKnownGlobalSymbolNode.ImageBaseName), new WasmWellKnownGlobalSymbolNode(WasmWellKnownGlobalSymbolNode.ImageBaseName)),
                    new(new(WasmWellKnownGlobalSymbolNode.TableBaseName), new WasmWellKnownGlobalSymbolNode(WasmWellKnownGlobalSymbolNode.TableBaseName)),
                    new(new(WasmWellKnownGlobalSymbolNode.AsyncContinuationName), new WasmWellKnownGlobalSymbolNode(WasmWellKnownGlobalSymbolNode.AsyncContinuationName))
                ]);

                globals = Interlocked.CompareExchange(ref _wasmWellKnownGlobals, globals, null) ?? globals;
            }

            return globals[symbolName];
        }
    }
}