Example #1
0
        /// <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);
            }
        }
Example #2
0
 /// <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;
Example #3
0
        /// <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));
            }
        }