/// <summary>Provides the canonical Architecture form for a given architecture sub architecture pair</summary> /// <param name="archType">Architecture type</param> /// <param name="subArch">Sub Architecture type</param> /// <returns>Canonical <see cref="TripleArchType"/></returns> /// <remarks> /// Some architectures, particularly ARM variants, have multiple sub-architecture types that /// have a canonical form (i.e. Arch=<see cref="TripleArchType.Arm"/>; SubArch=<see cref="TripleSubArchType.ARMSubArch_v7m"/>; /// has the Canonical Arch of <see cref="TripleArchType.Thumb"/>). This method retrieves the canonical Arch /// for a given architecture,SubArchitecture pair. /// </remarks> public static TripleArchType GetCanonicalArchForSubArch(TripleArchType archType, TripleSubArchType subArch) { archType.ValidateDefined(nameof(archType)); subArch.ValidateDefined(nameof(subArch)); switch (archType) { case TripleArchType.Kalimba: switch (subArch) { case TripleSubArchType.NoSubArch: case TripleSubArchType.KalimbaSubArch_v3: case TripleSubArchType.KalimbaSubArch_v4: case TripleSubArchType.KalimbaSubArch_v5: return(TripleArchType.Kalimba); default: return(TripleArchType.UnknownArch); } case TripleArchType.Arm: case TripleArchType.Armeb: switch (subArch) { case TripleSubArchType.ARMSubArch_v6m: return(archType == TripleArchType.Armeb ? TripleArchType.Thumbeb : TripleArchType.Thumb); case TripleSubArchType.KalimbaSubArch_v3: case TripleSubArchType.KalimbaSubArch_v4: case TripleSubArchType.KalimbaSubArch_v5: return(TripleArchType.UnknownArch); default: return(archType); } default: return(archType); } }
/// <summary>Retrieves the canonical name for an architecture type</summary> /// <param name="archType">Architecture type</param> /// <returns>String name for the architecture</returns> /// <overloads> /// Many parts of a triple can take a variety of literal string /// forms to allow for common real world triples when parsing. /// The GetCanonicalName methods provide the canonical form of /// such triple components used in a normalized triple. /// </overloads> public static string GetCanonicalName(TripleArchType archType) => NativeMethods.TripleGetArchTypeName(( LLVMTripleArchType )archType) ?? string.Empty;
/// <summary>Gets the default <see cref="TripleObjectFormatType"/> for a given <see cref="TripleArchType"/> and <see cref="TripleOSType"/></summary> /// <param name="arch">Architecture type</param> /// <param name="os">Operating system type</param> /// <returns>Default object format</returns> public static TripleObjectFormatType GetDefaultObjectFormat(TripleArchType arch, TripleOSType os) { switch (arch) { case TripleArchType.UnknownArch: case TripleArchType.Aarch64: case TripleArchType.Arm: case TripleArchType.Thumb: case TripleArchType.X86: case TripleArchType.X86_64: if (IsOsDarwin(os)) { return(TripleObjectFormatType.MachO); } if (os == TripleOSType.Win32) { return(TripleObjectFormatType.COFF); } return(TripleObjectFormatType.ELF); case TripleArchType.Aarch64_be: case TripleArchType.AMDGCN: case TripleArchType.Amdil: case TripleArchType.Amdil64: case TripleArchType.Armeb: case TripleArchType.Avr: case TripleArchType.BPFeb: case TripleArchType.BPFel: case TripleArchType.Hexagon: case TripleArchType.Lanai: case TripleArchType.Hsail: case TripleArchType.Hsail64: case TripleArchType.Kalimba: case TripleArchType.Le32: case TripleArchType.Le64: case TripleArchType.MIPS: case TripleArchType.MIPS64: case TripleArchType.MIPS64el: case TripleArchType.MIPSel: case TripleArchType.MSP430: case TripleArchType.Nvptx: case TripleArchType.Nvptx64: case TripleArchType.PPC64le: case TripleArchType.R600: case TripleArchType.Renderscript32: case TripleArchType.Renderscript64: case TripleArchType.Shave: case TripleArchType.Sparc: case TripleArchType.Sparcel: case TripleArchType.Sparcv9: case TripleArchType.Spir: case TripleArchType.Spir64: case TripleArchType.SystemZ: case TripleArchType.TCE: case TripleArchType.Thumbeb: case TripleArchType.Wasm32: case TripleArchType.Wasm64: case TripleArchType.Xcore: return(TripleObjectFormatType.ELF); case TripleArchType.PPC: case TripleArchType.PPC64: if (IsOsDarwin(os)) { return(TripleObjectFormatType.MachO); } return(TripleObjectFormatType.ELF); default: throw new ArgumentException("Unsupported Architecture", nameof(arch)); } }