ARCH(3)                    Library Functions Manual                    ARCH(3)

NAME
     NXGetAllArchInfos, NXGetLocalArchInfo, NXGetArchInfoFromName,
     NXGetArchInfoFromCpuType, NXFreeArchInfo, NXFindBestFatArch,
     NXCombineCpuSubtypes – get architecture information

SYNOPSIS
     #include <mach-o/arch.h>

     extern const NXArchInfo *
     NXGetAllArchInfos(void);

     extern const NXArchInfo *
     NXGetLocalArchInfo(void);

     extern const NXArchInfo *
     NXGetArchInfoFromName(const char *name);

     extern const NXArchInfo *
     NXGetArchInfoFromCpuType(cpu_type_t cputype, cpu_subtype_t cpusubtype);

     extern void
     NXFreeArchInfo(NXArchInfo *x);

     extern struct fat_arch *
     NXFindBestFatArch(cpu_type_t cputype, cpu_subtype_t cpusubtype,
         struct fat_arch *fat_archs, uint32_t nfat_archs);

     extern struct fat_arch_64 *
     NXFindBestFatArch_64(cpu_type_t cputype, cpu_subtype_t cpusubtype,
         struct fat_arch_64 *fat_archs64, uint32_t nfat_archs);

     extern cpu_subtype_t
     NXCombineCpuSubtypes(cpu_type_t cputype, cpu_subtype_t cpusubtype1,
         cpu_subtype_t cpusubtype2);

DESCRIPTION
     These functions are intended for use in programs that have to deal with
     universal files or programs that can target multiple architectures.
     Typically, a program will use a command-line argument that starts with
     “-arch name”, where this specifies an architecture.  These functions and
     data structures provide some help for processing architecture flags and
     then processing the contents of a universal file.

     The structure NXArchInfo is defined in ⟨mach-o/arch.h⟩:

                   typedef struct {
                           const char *name;
                           cpu_type_t cputype;
                           cpu_subtype_t cpusubtype;
                           enum NXByteOrder byteorder;
                           const char *description;
                   } NXArchInfo;
     It is used to hold the name of the architecture and the corresponding CPU
     type and CPU subtype, together with the architecture's byte order and a
     brief description string.

     The currently known architectures are:

     Name          CPU Type              CPU Subtype                 Description
     x86_64        CPU_TYPE_X86_64       CPU_SUBTYPE_X86_64_ALL      Intel
                                                                     x86-64
     i386          CPU_TYPE_I386         CPU_SUBTYPE_I386_ALL        Intel
                                                                     80x86
     arm           CPU_TYPE_ARM          CPU_SUBTYPE_ARM_ALL         ARM
     arm64         CPU_TYPE_ARM64        CPU_SUBTYPE_ARM64_ALL       ARM64
     arm64e        CPU_TYPE_ARM64        CPU_SUBTYPE_ARM64E          ARM64E
     arm64_32      CPU_TYPE_ARM64_32     CPU_SUBTYPE_ARM64_32_V8     ARM64_32
     ppc           CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_ALL     PowerPC
     ppc64         CPU_TYPE_POWERPC64    CPU_SUBTYPE_POWERPC64_ALL   PowerPC
                                                                     64-bit
     m68k          CPU_TYPE_MC680x0      CPU_SUBTYPE_MC680x0_ALL     Motorola
                                                                     68K
     hppa          CPU_TYPE_HPPA         CPU_SUBTYPE_HPPA_ALL        HP-PA
     i860          CPU_TYPE_I860         CPU_SUBTYPE_I860_ALL        Intel 860
     m88k          CPU_TYPE_MC88000      CPU_SUBTYPE_MC88000_ALL     Motorola
                                                                     88K
     sparc         CPU_TYPE_SPARC        CPU_SUBTYPE_SPARC_ALL       SPARC
     i486          CPU_TYPE_I386         CPU_SUBTYPE_486             Intel 486
     i486SX        CPU_TYPE_I386         CPU_SUBTYPE_486SX           Intel
                                                                     486SX
     pentium       CPU_TYPE_I386         CPU_SUBTYPE_PENT            Intel
                                                                     Pentium
     i586          CPU_TYPE_I386         CPU_SUBTYPE_586             Intel 586
     pentpro       CPU_TYPE_I386         CPU_SUBTYPE_PENTPRO         Intel
                                                                     Pentium
                                                                     Pro
     i686          CPU_TYPE_I386         CPU_SUBTYPE_PENTPRO         Intel
                                                                     Pentium
                                                                     Pro
     pentIIm3      CPU_TYPE_I386         CPU_SUBTYPE_PENTII_M3       Intel
                                                                     Pentium II
                                                                     Model 3
     pentIIm5      CPU_TYPE_I386         CPU_SUBTYPE_PENTII_M5       Intel
                                                                     Pentium II
                                                                     Model 5
     pentium4      CPU_TYPE_I386         CPU_SUBTYPE_PENTIUM_4       Intel
                                                                     Pentium 4
     armv4t        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V4T         arm v4t
     armv5         CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V5TEJ       arm v5
     xscale        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_XSCALE      arm xscale
     armv6         CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V6          arm v6
     armv6m        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V6M         arm v6m
     armv7         CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V7          arm v7
     armv7f        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V7F         arm v7f
     armv7s        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V7S         arm v7s
     armv7k        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V7K         arm v7k
     armv7m        CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V7M         arm v7m
     armv7em       CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V7EM        arm v7em
     armv8         CPU_TYPE_ARM          CPU_SUBTYPE_ARM_V8          arm v8
     arm64         CPU_TYPE_ARM64        CPU_SUBTYPE_ARM64_V8        arm64 v8
     ppc601        CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_601     PowerPC
                                                                     601
     ppc603        CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_603     PowerPC
                                                                     603
     ppc604        CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_604     PowerPC
                                                                     604
     ppc604e       CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_604e    PowerPC
                                                                     604e
     ppc750        CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_750     PowerPC
                                                                     750
     ppc7400       CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_7400    PowerPC
                                                                     7400
     ppc7450       CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_7450    PowerPC
                                                                     7450
     ppc970        CPU_TYPE_POWERPC      CPU_SUBTYPE_POWERPC_970     PowerPC
                                                                     970
     m68030        CPU_TYPE_MC680x0      CPU_SUBTYPE_MC68030_ONLY    Motorola
                                                                     68030
     m68040        CPU_TYPE_MC680x0      CPU_SUBTYPE_MC68040         Motorola
                                                                     68040
     hppa7100LC    CPU_TYPE_HPPA         CPU_SUBTYPE_HPPA_7100LC     HP-PA
                                                                     7100LC

     The first set of entries are used for the architecture family.  The
     second set of entries are used for a specific architecture, when more
     than one specific architecture is supported in a family of architectures.

     NXGetAllArchInfos() returns a pointer to an array of all known NXArchInfo
     structures.  The last NXArchInfo is marked by a NULL name.

     NXGetLocalArchInfo() returns the NXArchInfo for the local host, or NULL
     if none is known.

     NXGetArchInfoFromName() and NXGetArchInfoFromCpuType() return the
     NXArchInfo from the architecture's name or CPU type/CPU subtype
     combination.  A CPU subtype of CPU_SUBTYPE_MULTIPLE can be used to
     request the most general NXArchInfo known for the given CPU type.  NULL
     is returned if no matching NXArchInfo can be found.

     NXFreeArchInfo() is passed a pointer to an NXArchInfo returned by the
     above interfaces and if not in the array returned in NXGetAllArchInfos()
     will free(3) the description field and then the NXArchInfo pointer.

     The above interfaces that return pointers to NXArchInfo structs in normal
     cases returns a pointer from the array returned in NXGetAllArchInfos().
     In some cases when the cputype is CPU_TYPE_I386 or CPU_TYPE_POWERPC it
     will return a malloc(3)'ed NXArchInfo struct which contains a string in
     the description field also a malloc(3)'ed pointer.  To allow programs not
     to leak memory they can call NXFreeArchInfo() on pointers returned from
     the above interfaces.  Since this is a new API on older systems can use
     the code below.  Going forward the above interfaces will only return
     pointers from the array returned in NXGetAllArchInfos().

           static void NXFreeArchInfo(
           const NXArchInfo *x)
           {
                   const NXArchInfo *p;

                   p = NXGetAllArchInfos();
                   while(p->name != NULL){
                           if(x == p)
                                   return;
                           p++;
                   }
                   free((char *)x->description);
                   free((NXArchInfo *)x);
           }

     NXFindBestFatArch() is passed a CPU type and CPU subtype and a set of
     fat_arch structs.  It selects the best one that matches (if any), and
     returns a pointer to that fat_arch struct (or NULL).  The fat_arch
     structs must be in the host byte order and correct such that fat_archs
     really points to enough memory for nfat_archs structs.  It is possible
     that this routine could fail if new CPU types or CPU subtypes are added
     and an old version of this routine is used.  But if there is an exact
     match between the CPU type and CPU subtype and one of the fat_arch
     structs, this routine will always succeed.

     NXFindBestFatArch_64() is the same as NXFindBestFatArch() but returns and
     takes fat_arch_64 structs.

     NXCombineCpuSubtypes() returns the resulting CPU subtype when combining
     two different CPU subtypes for the specified CPU type.  If the two CPU
     subtypes can't be combined (the specific subtypes are mutually
     exclusive), -1 is returned, indicating it is an error to combine them.
     This can also fail and return -1 if new CPU types or CPU subtypes are
     added and an old version of this routine is used.  But if the CPU
     subtypes are the same, they can always be combined and this routine will
     return the CPU subtype passed in.

SEE ALSO
     arch(1)

                                 June 8, 2016