File: Options.cs
Web Access
Project: src\src\runtime\src\tools\ilasm\src\ILAssembler\ILAssembler.csproj (ILAssembler)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Reflection.PortableExecutable;

namespace ILAssembler
{
    /// <summary>
    /// Debug mode for the assembler, controlling JIT optimization and sequence points.
    /// </summary>
    public enum DebugMode
    {
        /// <summary>
        /// Implicit sequence points - enables edit and continue.
        /// Produces DebuggingModes = Default | DisableOptimizations | EnableEditAndContinue (0x103).
        /// </summary>
        Impl,

        /// <summary>
        /// Optimized debugging - enables JIT optimization while preserving debug info.
        /// Produces DebuggingModes = Default | IgnoreSymbolStoreSequencePoints (0x03).
        /// </summary>
        Opt
    }

    public sealed class Options
    {
        /// <summary>
        /// Disable inheriting from System.Object by default.
        /// </summary>
        public bool NoAutoInherit { get; set; }

        /// <summary>
        /// Subsystem value in the NT Optional header (overrides .subsystem directive).
        /// </summary>
        public Subsystem? Subsystem { get; set; }

        /// <summary>
        /// Subsystem version (major.minor) in the NT Optional header.
        /// </summary>
        public (ushort Major, ushort Minor)? SubsystemVersion { get; set; }

        /// <summary>
        /// FileAlignment value in the NT Optional header (overrides .alignment directive).
        /// </summary>
        public int? FileAlignment { get; set; }

        /// <summary>
        /// ImageBase value in the NT Optional header (overrides .imagebase directive).
        /// </summary>
        public long? ImageBase { get; set; }

        /// <summary>
        /// SizeOfStackReserve value in the NT Optional header (overrides .stackreserve directive).
        /// </summary>
        public long? StackReserve { get; set; }

        /// <summary>
        /// CLR ImageFlags value in the CLR header (overrides .corflags directive).
        /// </summary>
        public CorFlags? CorFlags { get; set; }

        /// <summary>
        /// Target machine type (x64, arm, arm64).
        /// </summary>
        public Machine? Machine { get; set; }

        /// <summary>
        /// Create an AppContainer exe or dll.
        /// </summary>
        public bool AppContainer { get; set; }

        /// <summary>
        /// Set High Entropy Virtual Address capable PE32+ images.
        /// </summary>
        public bool HighEntropyVA { get; set; }

        /// <summary>
        /// Indicate that no base relocations are needed.
        /// </summary>
        public bool StripReloc { get; set; }

        /// <summary>
        /// Create a 32BitPreferred image.
        /// </summary>
        public bool Prefer32Bit { get; set; }

        /// <summary>
        /// Produce deterministic outputs.
        /// </summary>
        public bool Deterministic { get; set; }

        /// <summary>
        /// Metadata version string.
        /// </summary>
        public string? MetadataVersion { get; set; }

        /// <summary>
        /// Enable debug mode: create PDB, disable JIT optimization.
        /// </summary>
        public bool Debug { get; set; }

        /// <summary>
        /// Create PDB file without enabling debug info tracking.
        /// </summary>
        public bool Pdb { get; set; }

        /// <summary>
        /// Debug mode: Impl for implicit sequence points, Opt to enable JIT optimization.
        /// When null with Debug=true, uses default (DisableOptimizations).
        /// </summary>
        public DebugMode? DebugMode { get; set; }

        /// <summary>
        /// Override the name of the compiled assembly.
        /// </summary>
        public string? AssemblyName { get; set; }

        /// <summary>
        /// Path to key file for strong name signing.
        /// </summary>
        public string? KeyFile { get; set; }

        /// <summary>
        /// Optimize long instructions to short.
        /// </summary>
        /// <remarks>TODO: Not yet implemented - accepted for CLI compatibility.</remarks>
        public bool Optimize { get; set; }

        /// <summary>
        /// Fold identical method bodies into one.
        /// </summary>
        /// <remarks>TODO: Not yet implemented - accepted for CLI compatibility.</remarks>
        public bool Fold { get; set; }

        /// <summary>
        /// Try to create output file despite errors (results may be invalid).
        /// </summary>
        public bool ErrorTolerant { get; set; }
    }
}