diff options
author | Michal Strehovský <michals@microsoft.com> | 2018-05-11 19:18:09 +0300 |
---|---|---|
committer | Michal Strehovský <michals@microsoft.com> | 2018-05-11 19:18:09 +0300 |
commit | f23d2de22ecbec5285bc1fec602df538ec6ec3fe (patch) | |
tree | 43c51bc4a75f760348af18aa7429de81480934d4 /src/ILCompiler.Compiler | |
parent | 8f12ec10abe7ec1eeee33955589a78fde94308d0 (diff) |
Add support for setting AppContext switches
Adds an `--appcontextswitch` argument to the compiler (and accompanying `AppContextSwitchOverrides` MSBuild `ItemGroup`) to influence class library behaviors.
Diffstat (limited to 'src/ILCompiler.Compiler')
3 files changed, 107 insertions, 0 deletions
diff --git a/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.Sorting.cs b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.Sorting.cs new file mode 100644 index 000000000..67a2b612c --- /dev/null +++ b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.Sorting.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Internal.TypeSystem; + +using Debug = System.Diagnostics.Debug; + +namespace Internal.IL.Stubs.StartupCode +{ + partial class AppContextInitializerMethod + { + protected override int ClassCode => 15749517; + + protected override int CompareToImpl(MethodDesc other, TypeSystemComparer comparer) + { + // Should be a singleton + Debug.Assert(this == other); + return 0; + } + } +} diff --git a/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.cs b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.cs new file mode 100644 index 000000000..2c2d3a51a --- /dev/null +++ b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.cs @@ -0,0 +1,83 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; + +using Internal.TypeSystem; + +namespace Internal.IL.Stubs.StartupCode +{ + public sealed partial class AppContextInitializerMethod : ILStubMethod + { + private TypeDesc _owningType; + private MethodSignature _signature; + private IReadOnlyCollection<string> _switches; + + public AppContextInitializerMethod(TypeDesc owningType, IEnumerable<string> switches) + { + _owningType = owningType; + _switches = new List<string>(switches); + } + + public override TypeSystemContext Context + { + get + { + return _owningType.Context; + } + } + + public override TypeDesc OwningType + { + get + { + return _owningType; + } + } + + public override string Name + { + get + { + return "SetAppContextSwitches"; + } + } + + public override MethodIL EmitIL() + { + ILEmitter emitter = new ILEmitter(); + ILCodeStream codeStream = emitter.NewCodeStream(); + + MetadataType appContextType = Context.SystemModule.GetKnownType("System", "AppContext"); + MethodDesc setSwitchMethod = appContextType.GetKnownMethod("SetSwitch", null); + ILToken setSwitchToken = emitter.NewToken(setSwitchMethod); + + foreach (string switchName in _switches) + { + codeStream.Emit(ILOpcode.ldstr, emitter.NewToken(switchName)); + codeStream.EmitLdc(1); + codeStream.Emit(ILOpcode.call, setSwitchToken); + } + + codeStream.Emit(ILOpcode.ret); + + return emitter.Link(this); + } + + public override MethodSignature Signature + { + get + { + if (_signature == null) + { + _signature = new MethodSignature(MethodSignatureFlags.Static, 0, + Context.GetWellKnownType(WellKnownType.Void), + TypeDesc.EmptyTypes); + } + + return _signature; + } + } + } +} diff --git a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj index 9744fa933..b86472d82 100644 --- a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj +++ b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj @@ -352,6 +352,8 @@ <Compile Include="Compiler\WindowsNodeMangler.cs" /> <Compile Include="IL\ILImporter.Scanner.cs" /> <Compile Include="IL\Stubs\PInvokeILProvider.cs" /> + <Compile Include="IL\Stubs\StartupCode\AppContextInitializerMethod.cs" /> + <Compile Include="IL\Stubs\StartupCode\AppContextInitializerMethod.Sorting.cs" /> <Compile Include="IL\Stubs\StartupCode\StartupCodeMainMethod.cs" /> <Compile Include="IL\Stubs\StartupCode\StartupCodeMainMethod.Sorting.cs" /> <Compile Include="IL\Stubs\StartupCode\NativeLibraryStartupMethod.cs" /> |