1e6c0d5c3SKonstantin Belousov.\" Copyright (c) 2016-2017 The FreeBSD Foundation. All rights reserved. 2df9330b5SEd Maste.\" 3df9330b5SEd Maste.\" This documentation was created by Ed Maste under sponsorship of 4df9330b5SEd Maste.\" The FreeBSD Foundation. 5df9330b5SEd Maste.\" 6df9330b5SEd Maste.\" Redistribution and use in source and binary forms, with or without 7df9330b5SEd Maste.\" modification, are permitted provided that the following conditions 8df9330b5SEd Maste.\" are met: 9df9330b5SEd Maste.\" 1. Redistributions of source code must retain the above copyright 10df9330b5SEd Maste.\" notice, this list of conditions and the following disclaimer. 11df9330b5SEd Maste.\" 2. Redistributions in binary form must reproduce the above copyright 12df9330b5SEd Maste.\" notice, this list of conditions and the following disclaimer in the 13df9330b5SEd Maste.\" documentation and/or other materials provided with the distribution. 14df9330b5SEd Maste.\" 15df9330b5SEd Maste.\" THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND 16df9330b5SEd Maste.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17df9330b5SEd Maste.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18df9330b5SEd Maste.\" ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE 19df9330b5SEd Maste.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20df9330b5SEd Maste.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21df9330b5SEd Maste.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22df9330b5SEd Maste.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23df9330b5SEd Maste.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24df9330b5SEd Maste.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25df9330b5SEd Maste.\" SUCH DAMAGE. 26df9330b5SEd Maste.\" 27df9330b5SEd Maste.\" $FreeBSD$ 28df9330b5SEd Maste.\" 294715c31eSEd Maste.Dd August 14, 2019 30df9330b5SEd Maste.Dt ARCH 7 31df9330b5SEd Maste.Os 32df9330b5SEd Maste.Sh NAME 33df9330b5SEd Maste.Nm arch 34df9330b5SEd Maste.Nd Architecture-specific details 35df9330b5SEd Maste.Sh DESCRIPTION 36df9330b5SEd MasteDifferences between CPU architectures and platforms supported by 37df9330b5SEd Maste.Fx . 38de6fc272SKonstantin Belousov.Ss Introduction 3925b526e6SKonstantin BelousovThis document is a quick reference of key ABI details of 4025b526e6SKonstantin Belousov.Fx 4125b526e6SKonstantin Belousovarchitecture ports. 4225b526e6SKonstantin BelousovFor full details consult the processor-specific ABI supplement 4325b526e6SKonstantin Belousovdocumentation. 4425b526e6SKonstantin Belousov.Pp 45dddb1576SKonstantin BelousovIf not explicitly mentioned, sizes are in bytes. 4645801499SEd MasteThe architecture details in this document apply to 4745801499SEd Maste.Fx 10.0 4845801499SEd Masteand later, unless otherwise noted. 49de6fc272SKonstantin Belousov.Pp 50e6c0d5c3SKonstantin Belousov.Fx 517748ab43SKonstantin Belousovuses a flat address space. 527748ab43SKonstantin BelousovVariables of types 53e6c0d5c3SKonstantin Belousov.Vt unsigned long , 54e6c0d5c3SKonstantin Belousov.Vt uintptr_t , 55de6fc272SKonstantin Belousovand 56de6fc272SKonstantin Belousov.Vt size_t 577748ab43SKonstantin Belousovand pointers all have the same representation. 58de6fc272SKonstantin Belousov.Pp 59de6fc272SKonstantin BelousovIn order to maximize compatibility with future pointer integrity mechanisms, 60de6fc272SKonstantin Belousovmanipulations of pointers as integers should be performed via 61de6fc272SKonstantin Belousov.Vt uintptr_t 62de6fc272SKonstantin Belousovor 63de6fc272SKonstantin Belousov.Vt intptr_t 64de6fc272SKonstantin Belousovand no other types. 65de6fc272SKonstantin BelousovIn particular, 66de6fc272SKonstantin Belousov.Vt long 67de6fc272SKonstantin Belousovand 68de6fc272SKonstantin Belousov.Vt ptrdiff_t 69de6fc272SKonstantin Belousovshould be avoided. 70de6fc272SKonstantin Belousov.Pp 71098150fbSWarner LoshOn some architectures, e.g., 72de6fc272SKonstantin Belousov.Dv sparc64 , 73de6fc272SKonstantin Belousov.Dv powerpc 74de6fc272SKonstantin Belousovand AIM variants of 75de6fc272SKonstantin Belousov.Dv powerpc64 , 76de6fc272SKonstantin Belousovthe kernel uses a separate address space. 77de6fc272SKonstantin BelousovOn other architectures, kernel and a user mode process share a 78de6fc272SKonstantin Belousovsingle address space. 79de6fc272SKonstantin BelousovThe kernel is located at the highest addresses. 80de6fc272SKonstantin Belousov.Pp 81de6fc272SKonstantin BelousovOn each architecture, the main user mode thread's stack starts near 82de6fc272SKonstantin Belousovthe highest user address and grows down. 8345801499SEd Maste.Pp 8445801499SEd Maste.Fx 8545801499SEd Mastearchitecture support varies by release. 8645801499SEd MasteThis table shows the first 8745801499SEd Maste.Fx 8845801499SEd Masterelease to support each architecture, and, for discontinued 8945801499SEd Mastearchitectures, the final release. 9045801499SEd Maste.Pp 9145801499SEd Maste.Bl -column -offset indent "Sy Architecture" "Sy Initial Release" "Sy Final Release" 9245801499SEd Maste.It Sy Architecture Ta Sy Initial Release Ta Sy Final Release 93f38b2297SIan Lepore.It aarch64 Ta 11.0 9404794d24SJohn Baldwin.It alpha Ta 3.2 Ta 6.4 9545801499SEd Maste.It amd64 Ta 5.1 9645801499SEd Maste.It arm Ta 6.0 97e9d6b13dSWarner Losh.It armeb Ta 8.0 Ta 11.x 9845801499SEd Maste.It armv6 Ta 10.0 9913368c38SWarner Losh.It armv7 Ta 12.0 1001f3de6dcSEd Maste.It ia64 Ta 5.0 Ta 10.4 10145801499SEd Maste.It i386 Ta 1.0 10245801499SEd Maste.It mips Ta 8.0 10345801499SEd Maste.It mipsel Ta 9.0 10445801499SEd Maste.It mipselhf Ta 12.0 10545801499SEd Maste.It mipshf Ta 12.0 10645801499SEd Maste.It mipsn32 Ta 9.0 10745801499SEd Maste.It mips64 Ta 9.0 10845801499SEd Maste.It mips64el Ta 9.0 10945801499SEd Maste.It mips64elhf Ta 12.0 11045801499SEd Maste.It mips64hf Ta 12.0 1117fb14275SEd Maste.It pc98 Ta 2.2 Ta 11.x 11245801499SEd Maste.It powerpc Ta 6.0 11345801499SEd Maste.It powerpcspe Ta 12.0 11445801499SEd Maste.It powerpc64 Ta 6.0 11545801499SEd Maste.It riscv64 Ta 12.0 11645801499SEd Maste.It riscv64sf Ta 12.0 11745801499SEd Maste.It sparc64 Ta 5.0 11845801499SEd Maste.El 119df9330b5SEd Maste.Ss Type sizes 120e6c0d5c3SKonstantin BelousovAll 121e6c0d5c3SKonstantin Belousov.Fx 122e6c0d5c3SKonstantin Belousovarchitectures use some variant of the ELF (see 123de6fc272SKonstantin Belousov.Xr elf 5 ) 124de6fc272SKonstantin Belousov.Sy Application Binary Interface 125de6fc272SKonstantin Belousov(ABI) for the machine processor. 126de6fc272SKonstantin BelousovAll supported ABIs can be divided into two groups: 127de6fc272SKonstantin Belousov.Bl -tag -width "Dv ILP32" 128de6fc272SKonstantin Belousov.It Dv ILP32 129de6fc272SKonstantin Belousov.Vt int , 130de6fc272SKonstantin Belousov.Vt long , 131de6fc272SKonstantin Belousov.Vt void * 132de6fc272SKonstantin Belousovtypes machine representations all have 4-byte size. 133de6fc272SKonstantin Belousov.It Dv LP64 134de6fc272SKonstantin Belousov.Vt int 135de6fc272SKonstantin Belousovtype machine representation uses 4 bytes, 136de6fc272SKonstantin Belousovwhile 137de6fc272SKonstantin Belousov.Vt long 138de6fc272SKonstantin Belousovand 139de6fc272SKonstantin Belousov.Vt void * 140de6fc272SKonstantin Belousovare 8 bytes. 141de6fc272SKonstantin Belousov.El 142e6c0d5c3SKonstantin BelousovCompilers define the 143de6fc272SKonstantin Belousov.Dv _LP64 144de6fc272SKonstantin Belousovsymbol when compiling for an 145de6fc272SKonstantin Belousov.Dv LP64 146de6fc272SKonstantin BelousovABI. 147de6fc272SKonstantin Belousov.Pp 148e6c0d5c3SKonstantin BelousovSome machines support more that one 149e6c0d5c3SKonstantin Belousov.Fx 150e6c0d5c3SKonstantin BelousovABI. 151de6fc272SKonstantin BelousovTypically these are 64-bit machines, where the 152de6fc272SKonstantin Belousov.Dq native 153de6fc272SKonstantin Belousov.Dv LP64 154de6fc272SKonstantin Belousovexecution environment is accompanied by the 155de6fc272SKonstantin Belousov.Dq legacy 156de6fc272SKonstantin Belousov.Dv ILP32 157de6fc272SKonstantin Belousovenvironment, which was historical 32-bit predecessor for 64-bit evolution. 158de6fc272SKonstantin BelousovExamples are: 159e6c0d5c3SKonstantin Belousov.Bl -column -offset indent "Dv powerpc64" "Sy ILP32 counterpart" 160de6fc272SKonstantin Belousov.It Sy LP64 Ta Sy ILP32 counterpart 161de6fc272SKonstantin Belousov.It Dv amd64 Ta Dv i386 162de6fc272SKonstantin Belousov.It Dv powerpc64 Ta Dv powerpc 163de6fc272SKonstantin Belousov.It Dv mips64* Ta Dv mips* 164de6fc272SKonstantin Belousov.El 165f38b2297SIan Lepore.Dv aarch64 166de6fc272SKonstantin Belousovcurrently does not support execution of 167de6fc272SKonstantin Belousov.Dv armv6 16813368c38SWarner Loshor 16913368c38SWarner Losh.Dv armv7 170de6fc272SKonstantin Belousovbinaries, even if the CPU implements 171de6fc272SKonstantin Belousov.Dv AArch32 172de6fc272SKonstantin Belousovexecution state. 173de6fc272SKonstantin Belousov.Pp 174dddb1576SKonstantin BelousovOn all supported architectures: 175df9330b5SEd Maste.Bl -column -offset -indent "long long" "Size" 176df9330b5SEd Maste.It Sy Type Ta Sy Size 177df9330b5SEd Maste.It short Ta 2 178df9330b5SEd Maste.It int Ta 4 179df9330b5SEd Maste.It long Ta sizeof(void*) 180df9330b5SEd Maste.It long long Ta 8 181df9330b5SEd Maste.It float Ta 4 182df9330b5SEd Maste.It double Ta 8 183df9330b5SEd Maste.El 1847748ab43SKonstantin BelousovIntegers are represented in two's complement. 185de6fc272SKonstantin BelousovAlignment of integer and pointer types is natural, that is, 186e6c0d5c3SKonstantin Belousovthe address of the variable must be congruent to zero modulo the type size. 187e6c0d5c3SKonstantin BelousovMost ILP32 ABIs, except 188e6c0d5c3SKonstantin Belousov.Dv arm , 189e6c0d5c3SKonstantin Belousovrequire only 4-byte alignment for 64-bit integers. 190dddb1576SKonstantin Belousov.Pp 191dddb1576SKonstantin BelousovMachine-dependent type sizes: 192dddb1576SKonstantin Belousov.Bl -column -offset indent "Sy Architecture" "Sy void *" "Sy long double" "Sy time_t" 193dddb1576SKonstantin Belousov.It Sy Architecture Ta Sy void * Ta Sy long double Ta Sy time_t 194f38b2297SIan Lepore.It aarch64 Ta 8 Ta 16 Ta 8 1956554316cSKonstantin Belousov.It amd64 Ta 8 Ta 16 Ta 8 1966554316cSKonstantin Belousov.It arm Ta 4 Ta 8 Ta 8 1976554316cSKonstantin Belousov.It armv6 Ta 4 Ta 8 Ta 8 1986554316cSKonstantin Belousov.It i386 Ta 4 Ta 12 Ta 4 1996554316cSKonstantin Belousov.It mips Ta 4 Ta 8 Ta 8 2006554316cSKonstantin Belousov.It mipsel Ta 4 Ta 8 Ta 8 2016554316cSKonstantin Belousov.It mipselhf Ta 4 Ta 8 Ta 8 2026554316cSKonstantin Belousov.It mipshf Ta 4 Ta 8 Ta 8 2036554316cSKonstantin Belousov.It mipsn32 Ta 4 Ta 8 Ta 8 2046554316cSKonstantin Belousov.It mips64 Ta 8 Ta 8 Ta 8 2056554316cSKonstantin Belousov.It mips64el Ta 8 Ta 8 Ta 8 2066554316cSKonstantin Belousov.It mips64elhf Ta 8 Ta 8 Ta 8 2076554316cSKonstantin Belousov.It mips64hf Ta 8 Ta 8 Ta 8 208fbcf7bcdSJustin Hibbits.It powerpc Ta 4 Ta 8 Ta 8 209fbcf7bcdSJustin Hibbits.It powerpcspe Ta 4 Ta 8 Ta 8 2106554316cSKonstantin Belousov.It powerpc64 Ta 8 Ta 8 Ta 8 2114dd67957SJohn Baldwin.It riscv64 Ta 8 Ta 16 Ta 8 2124dd67957SJohn Baldwin.It riscv64sf Ta 8 Ta 16 Ta 8 2136554316cSKonstantin Belousov.It sparc64 Ta 8 Ta 16 Ta 8 214df9330b5SEd Maste.El 215dddb1576SKonstantin Belousov.Pp 216dddb1576SKonstantin Belousov.Sy time_t 21749ccd3feSEd Masteis 8 bytes on all supported architectures except i386. 218df9330b5SEd Maste.Ss Endianness and Char Signedness 21942e83752SKonstantin Belousov.Bl -column -offset indent "Sy Architecture" "Sy Endianness" "Sy char Signedness" 220df9330b5SEd Maste.It Sy Architecture Ta Sy Endianness Ta Sy char Signedness 221f38b2297SIan Lepore.It aarch64 Ta little Ta unsigned 222df9330b5SEd Maste.It amd64 Ta little Ta signed 223df9330b5SEd Maste.It arm Ta little Ta unsigned 224df9330b5SEd Maste.It armv6 Ta little Ta unsigned 22513368c38SWarner Losh.It armv7 Ta little Ta unsigned 226df9330b5SEd Maste.It i386 Ta little Ta signed 2278395cdc1SEd Maste.It mips Ta big Ta signed 2288395cdc1SEd Maste.It mipsel Ta little Ta signed 2295bca2215SRuslan Bukin.It mipselhf Ta little Ta signed 2305bca2215SRuslan Bukin.It mipshf Ta big Ta signed 2318395cdc1SEd Maste.It mipsn32 Ta big Ta signed 2328395cdc1SEd Maste.It mips64 Ta big Ta signed 233df9330b5SEd Maste.It mips64el Ta little Ta signed 2345bca2215SRuslan Bukin.It mips64elhf Ta little Ta signed 2355bca2215SRuslan Bukin.It mips64hf Ta big Ta signed 236df9330b5SEd Maste.It powerpc Ta big Ta unsigned 237002cc1f9SJustin Hibbits.It powerpcspe Ta big Ta unsigned 238df9330b5SEd Maste.It powerpc64 Ta big Ta unsigned 2394dd67957SJohn Baldwin.It riscv64 Ta little Ta signed 2404dd67957SJohn Baldwin.It riscv64sf Ta little Ta signed 241df9330b5SEd Maste.It sparc64 Ta big Ta signed 242df9330b5SEd Maste.El 243df9330b5SEd Maste.Ss Page Size 2441859c867SKonstantin Belousov.Bl -column -offset indent "Sy Architecture" "Sy Page Sizes" 245df9330b5SEd Maste.It Sy Architecture Ta Sy Page Sizes 246f38b2297SIan Lepore.It aarch64 Ta 4K, 2M, 1G 247df9330b5SEd Maste.It amd64 Ta 4K, 2M, 1G 248df9330b5SEd Maste.It arm Ta 4K 249780586e8SEd Maste.It armv6 Ta 4K, 1M 25013368c38SWarner Losh.It armv7 Ta 4K, 1M 251df9330b5SEd Maste.It i386 Ta 4K, 2M (PAE), 4M 252df9330b5SEd Maste.It mips Ta 4K 253df9330b5SEd Maste.It mipsel Ta 4K 2545bca2215SRuslan Bukin.It mipselhf Ta 4K 2555bca2215SRuslan Bukin.It mipshf Ta 4K 256df9330b5SEd Maste.It mipsn32 Ta 4K 257df9330b5SEd Maste.It mips64 Ta 4K 258df9330b5SEd Maste.It mips64el Ta 4K 2595bca2215SRuslan Bukin.It mips64elhf Ta 4K 2605bca2215SRuslan Bukin.It mips64hf Ta 4K 261df9330b5SEd Maste.It powerpc Ta 4K 262002cc1f9SJustin Hibbits.It powerpcspe Ta 4K 263df9330b5SEd Maste.It powerpc64 Ta 4K 2644dd67957SJohn Baldwin.It riscv64 Ta 4K 2654dd67957SJohn Baldwin.It riscv64sf Ta 4K 266df9330b5SEd Maste.It sparc64 Ta 8K 267df9330b5SEd Maste.El 268df9330b5SEd Maste.Ss Floating Point 2691859c867SKonstantin Belousov.Bl -column -offset indent "Sy Architecture" "Sy float, double" "Sy long double" 270df9330b5SEd Maste.It Sy Architecture Ta Sy float, double Ta Sy long double 271f38b2297SIan Lepore.It aarch64 Ta hard Ta soft, quad precision 272df9330b5SEd Maste.It amd64 Ta hard Ta hard, 80 bit 273df9330b5SEd Maste.It arm Ta soft Ta soft, double precision 27445801499SEd Maste.It armv6 Ta hard(1) Ta hard, double precision 27513368c38SWarner Losh.It armv7 Ta hard(1) Ta hard, double precision 276df9330b5SEd Maste.It i386 Ta hard Ta hard, 80 bit 277df9330b5SEd Maste.It mips Ta soft Ta identical to double 278df9330b5SEd Maste.It mipsel Ta soft Ta identical to double 2795bca2215SRuslan Bukin.It mipselhf Ta hard Ta identical to double 2805bca2215SRuslan Bukin.It mipshf Ta hard Ta identical to double 281df9330b5SEd Maste.It mipsn32 Ta soft Ta identical to double 282df9330b5SEd Maste.It mips64 Ta soft Ta identical to double 283df9330b5SEd Maste.It mips64el Ta soft Ta identical to double 2845bca2215SRuslan Bukin.It mips64elhf Ta hard Ta identical to double 2855bca2215SRuslan Bukin.It mips64hf Ta hard Ta identical to double 286df9330b5SEd Maste.It powerpc Ta hard Ta hard, double precision 287002cc1f9SJustin Hibbits.It powerpcspe Ta hard Ta hard, double precision 288df9330b5SEd Maste.It powerpc64 Ta hard Ta hard, double precision 289cb8c6df4SKevin Lo.It riscv64 Ta hard Ta hard, double precision 290cb8c6df4SKevin Lo.It riscv64sf Ta soft Ta soft, double precision 291df9330b5SEd Maste.It sparc64 Ta hard Ta hard, quad precision 292df9330b5SEd Maste.El 29345801499SEd Maste.Pp 29445801499SEd Maste(1) Prior to 29545801499SEd Maste.Fx 11.0 , 29645801499SEd Mastearmv6 used the softfp ABI even though it supported only processors 29745801499SEd Mastewith a floating point unit. 298*4ef28065SEd Maste.Ss Default Tool Chain 2994715c31eSEd Maste.Fx uses a variety of tool chain components for the supported CPU 3004715c31eSEd Mastearchitectures: 3014715c31eSEd Maste.Xr clang 1 3024715c31eSEd Masteand 3034715c31eSEd Maste.Xr ld.lld 1 3044715c31eSEd Masteprovided by the base system, 3054715c31eSEd MasteGNU 3064715c31eSEd Maste.Xr gcc 1 3074715c31eSEd Masteand Binutils 3084715c31eSEd Maste.Xr ld 1 , 3094715c31eSEd Masteor an external toolchain compiler and linker provided by a port or package. 310*4ef28065SEd MasteThis table shows the default tool chain for each architecture. 3114715c31eSEd Maste.Bl -column -offset indent "Sy Architecture" "Sy Compiler" "Sy Linker" 3124715c31eSEd Maste.It Sy Architecture Ta Sy Compiler Ta Sy Linker 3134715c31eSEd Maste.It aarch64 Ta Clang Ta lld 3144715c31eSEd Maste.It amd64 Ta Clang Ta lld 3154715c31eSEd Maste.It arm Ta Clang Ta GNU ld 2.17.50 3164715c31eSEd Maste.It armv6 Ta Clang Ta GNU ld 2.17.50 3174715c31eSEd Maste.It armv7 Ta Clang Ta lld 3184715c31eSEd Maste.It i386 Ta Clang Ta lld 3194715c31eSEd Maste.It mips Ta GCC 4.2.1 Ta GNU ld 2.17.50 3204715c31eSEd Maste.It mipsel Ta GCC 4.2.1 Ta GNU ld 2.17.50 3214715c31eSEd Maste.It mipselhf Ta GCC 4.2.1 Ta GNU ld 2.17.50 3224715c31eSEd Maste.It mipshf Ta GCC 4.2.1 Ta GNU ld 2.17.50 3234715c31eSEd Maste.It mipsn32 Ta GCC 4.2.1 Ta GNU ld 2.17.50 3244715c31eSEd Maste.It mips64 Ta GCC 4.2.1 Ta GNU ld 2.17.50 3254715c31eSEd Maste.It mips64el Ta GCC 4.2.1 Ta GNU ld 2.17.50 3264715c31eSEd Maste.It mips64elhf Ta GCC 4.2.1 Ta GNU ld 2.17.50 3274715c31eSEd Maste.It mips64hf Ta GCC 4.2.1 Ta GNU ld 2.17.50 3284715c31eSEd Maste.It powerpc Ta GCC 4.2.1 Ta GNU ld 2.17.50 3294715c31eSEd Maste.It powerpcspe Ta GCC 4.2.1 Ta GNU ld 2.17.50 3304715c31eSEd Maste.It powerpc64 Ta GCC 4.2.1 Ta GNU ld 2.17.50 3314715c31eSEd Maste.It riscv64 Ta GCC(1) Ta GNU ld(1) 3324715c31eSEd Maste.It riscv64sf Ta GCC(1) Ta GNU ld(1) 3334715c31eSEd Maste.It sparc64 Ta GCC 4.2.1 Ta GNU ld 2.17.50 3344715c31eSEd Maste.El 3354715c31eSEd Maste.Pp 3364715c31eSEd Maste(1) External toolchain provided by ports/packages. 337ff03c712SEd Maste.Pp 338ff03c712SEd MasteNote that GCC 4.2.1 is deprecated, and scheduled for removal on 2020-03-31. 339ff03c712SEd MasteCPU architectures not migrated to either base system Clang or external 340ff03c712SEd Mastetoolchain by then will be desupported. 341df9330b5SEd Maste.Ss Predefined Macros 342df9330b5SEd MasteThe compiler provides a number of predefined macros. 343df9330b5SEd MasteSome of these provide architecture-specific details and are explained below. 344df9330b5SEd MasteOther macros, including those required by the language standard, are not 345df9330b5SEd Masteincluded here. 346df9330b5SEd Maste.Pp 347df9330b5SEd MasteThe full set of predefined macros can be obtained with this command: 348df9330b5SEd Maste.Bd -literal -offset indent 3498e71e112SEd Mastecc -x c -dM -E /dev/null 350df9330b5SEd Maste.Ed 351df9330b5SEd Maste.Pp 352df9330b5SEd MasteCommon type size and endianness macros: 3531859c867SKonstantin Belousov.Bl -column -offset indent "BYTE_ORDER" "Sy Meaning" 354df9330b5SEd Maste.It Sy Macro Ta Sy Meaning 355df9330b5SEd Maste.It Dv __LP64__ Ta 64-bit (8-byte) long and pointer, 32-bit (4-byte) int 356df9330b5SEd Maste.It Dv __ILP32__ Ta 32-bit (4-byte) int, long and pointer 357df9330b5SEd Maste.It Dv BYTE_ORDER Ta Either Dv BIG_ENDIAN or Dv LITTLE_ENDIAN . 3581859c867SKonstantin Belousov.Dv PDP11_ENDIAN 3591859c867SKonstantin Belousovis not used on 3601859c867SKonstantin Belousov.Fx . 361df9330b5SEd Maste.El 362df9330b5SEd Maste.Pp 363df9330b5SEd MasteArchitecture-specific macros: 3641859c867SKonstantin Belousov.Bl -column -offset indent "Sy Architecture" "Sy Predefined macros" 365df9330b5SEd Maste.It Sy Architecture Ta Sy Predefined macros 366f38b2297SIan Lepore.It aarch64 Ta Dv __aarch64__ 367df9330b5SEd Maste.It amd64 Ta Dv __amd64__, Dv __x86_64__ 368df9330b5SEd Maste.It arm Ta Dv __arm__ 369df9330b5SEd Maste.It armv6 Ta Dv __arm__, Dv __ARM_ARCH >= 6 37013368c38SWarner Losh.It armv7 Ta Dv __arm__, Dv __ARM_ARCH >= 7 371df9330b5SEd Maste.It i386 Ta Dv __i386__ 372df9330b5SEd Maste.It mips Ta Dv __mips__, Dv __MIPSEB__, Dv __mips_o32 373df9330b5SEd Maste.It mipsel Ta Dv __mips__, Dv __mips_o32 3745bca2215SRuslan Bukin.It mipselhf Ta Dv __mips__, Dv __mips_o32 3755bca2215SRuslan Bukin.It mipshf Ta Dv __mips__, Dv __MIPSEB__, Dv __mips_o32 376df9330b5SEd Maste.It mipsn32 Ta Dv __mips__, Dv __MIPSEB__, Dv __mips_n32 377df9330b5SEd Maste.It mips64 Ta Dv __mips__, Dv __MIPSEB__, Dv __mips_n64 378df9330b5SEd Maste.It mips64el Ta Dv __mips__, Dv __mips_n64 3795bca2215SRuslan Bukin.It mips64elhf Ta Dv __mips__, Dv __mips_n64 3805bca2215SRuslan Bukin.It mips64hf Ta Dv __mips__, Dv __MIPSEB__, Dv __mips_n64 381df9330b5SEd Maste.It powerpc Ta Dv __powerpc__ 382002cc1f9SJustin Hibbits.It powerpcspe Ta Dv __powerpc__, Dv __SPE__ 383df9330b5SEd Maste.It powerpc64 Ta Dv __powerpc__, Dv __powerpc64__ 384ca20f8ecSRuslan Bukin.It riscv64 Ta Dv __riscv, Dv __riscv_xlen == 64 385ca20f8ecSRuslan Bukin.It riscv64sf Ta Dv __riscv, Dv __riscv_xlen == 64 386df9330b5SEd Maste.It sparc64 Ta Dv __sparc64__ 387df9330b5SEd Maste.El 388f84d8f0cSEd Maste.Pp 389f84d8f0cSEd MasteCompilers may define additional variants of architecture-specific macros. 390f84d8f0cSEd MasteThe macros above are preferred for use in 391f84d8f0cSEd Maste.Fx . 392691e6ea8SWarner Losh.Ss Important Xr make 1 variables 393691e6ea8SWarner LoshMost of the externally settable variables are defined in the 394691e6ea8SWarner Losh.Xr build 7 395691e6ea8SWarner Loshman page. 396691e6ea8SWarner LoshThese variables are not otherwise documented and are used extensively 397691e6ea8SWarner Loshin the build system. 398691e6ea8SWarner Losh.Bl -column -offset indent "Sy Variable" "Sy Meaning and usage" 399691e6ea8SWarner Losh.It Dv MACHINE Represent the hardware platform. 400691e6ea8SWarner LoshThis is the same as the native platform's 401691e6ea8SWarner Losh.Xr uname 1 402691e6ea8SWarner Losh.Fl m 403691e6ea8SWarner Loshoutput. 404691e6ea8SWarner LoshIt defines both the userland / kernel interface, as well as the 405691e6ea8SWarner Loshbootloader / kernel interface. 406691e6ea8SWarner LoshIt should only be used in these contexts. 407691e6ea8SWarner LoshEach CPU architecture may have multiple hardware platforms it supports 408691e6ea8SWarner Loshwhere 409691e6ea8SWarner Losh.Dv MACHINE 410691e6ea8SWarner Loshdiffers among them. 411691e6ea8SWarner LoshIt is used to collect together all the files from 412691e6ea8SWarner Losh.Xr config 8 413691e6ea8SWarner Loshto build the kernel. 414691e6ea8SWarner LoshIt is often the same as 415691e6ea8SWarner Losh.Dv MACHINE_ARCH 416691e6ea8SWarner Loshjust as one CPU architecture can be implemented by many different 417691e6ea8SWarner Loshhardware platforms, one hardware platform may support multiple CPU 418691e6ea8SWarner Losharchitecture family members, though with different binaries. 419691e6ea8SWarner LoshFor example, 420691e6ea8SWarner Losh.Dv MACHINE 421691e6ea8SWarner Loshof i386 supported the IBM-AT hardware platform while the 422691e6ea8SWarner Losh.Dv MACHINE 423691e6ea8SWarner Loshof pc98 supported the Japanese company NEC's PC-9801 and PC-9821 424691e6ea8SWarner Loshhardware platforms. 425691e6ea8SWarner LoshBoth of these hardware platforms supported only the 426691e6ea8SWarner Losh.Dv MACHINE_ARCH 427691e6ea8SWarner Loshof i386 where they shared a common ABI, except for certain kernel / 428691e6ea8SWarner Loshuserland interfaces relating to underlying hardware platform 429691e6ea8SWarner Loshdifferences in bus architecture, device enumeration and boot interface. 430ffab3cb6SWarner LoshGenerally, 431ffab3cb6SWarner Losh.Dv MACHINE 432ffab3cb6SWarner Loshshould only be used in src/sys and src/stand or in system imagers or 433ffab3cb6SWarner Loshinstallers. 434691e6ea8SWarner Losh.It Dv MACHINE_ARCH Represents the CPU processor architecture. 435691e6ea8SWarner LoshThis is the same as the native platforms 436691e6ea8SWarner Losh.Xr uname 1 437691e6ea8SWarner Losh.Fl p 438691e6ea8SWarner Loshoutput. 439691e6ea8SWarner LoshIt defines the CPU instruction family supported. 440691e6ea8SWarner LoshIt may also encode a variation in the byte ordering of multi-byte 441691e6ea8SWarner Loshintegers (endian). 442691e6ea8SWarner LoshIt may also encode a variation in the size of the integer or pointer. 443691e6ea8SWarner LoshIt may also encode a ISA revision. 444691e6ea8SWarner LoshIt may also encode hard versus soft floating point ABI and usage. 445320bd864SWarner LoshIt may also encode a variant ABI when the other factors do not 446320bd864SWarner Loshuniquely define the ABI (e.g., MIPS' n32 ABI). 447691e6ea8SWarner LoshIt, along with 448320bd864SWarner Losh.Dv MACHINE , 449320bd864SWarner Loshdefines the ABI used by the system. 450691e6ea8SWarner LoshFor example, the MIPS CPU processor family supports 9 different 451098150fbSWarner Loshcombinations encoding pointer size, endian and hard versus soft float (for 452691e6ea8SWarner Losh8 combinations) as well as N32 (which only ever had one variation of 453691e6ea8SWarner Loshall these). 454691e6ea8SWarner LoshGenerally, the plain CPU name specifies the most common (or at least 455691e6ea8SWarner Loshfirst) variant of the CPU. 456691e6ea8SWarner LoshThis is why mips and mips64 imply 'big endian' while 'arm' and 'armv7' 457691e6ea8SWarner Loshimply little endian. 458691e6ea8SWarner LoshIf we ever were to support the so-called x32 ABI (using 32-bit 459691e6ea8SWarner Loshpointers on the amd64 architecture), it would most likely be encoded 460691e6ea8SWarner Loshas amd64-x32. 461d56b465cSJohn BaldwinIt is unfortunate that amd64 specifies the 64-bit evolution of the x86 462691e6ea8SWarner Loshplatform (it matches the 'first rule') as everybody else uses x86_64. 463691e6ea8SWarner LoshThere is no standard name for the processor: each OS selects its own 464691e6ea8SWarner Loshconventions. 465ffab3cb6SWarner Losh.It Dv MACHINE_CPUARCH Represents the source location for a given 466ffab3cb6SWarner Losh.Dv MACHINE_ARCH . 467ffab3cb6SWarner LoshFor example, 468ffab3cb6SWarner Losh.Dv MACHINE_CPUARCH 469ffab3cb6SWarner Loshis defined to be mips for all the flavors of mips that we support 470ffab3cb6SWarner Loshsince we support them all with a shared set of sources. 471bf1dea9bSWarner LoshWhile amd64 and i386 are closely related, MACHINE_CPUARCH is not x86 472bf1dea9bSWarner Loshfor them. 473bf1dea9bSWarner LoshThe FreeBSD source base supports amd64 and i386 with two 474bf1dea9bSWarner Loshdistinct source bases living in subdirectories named amd64 and i386 475bf1dea9bSWarner Losh(though behind the scenes there's some sharing that fits into this 476bf1dea9bSWarner Loshframework). 477691e6ea8SWarner Losh.It Dv CPUTYPE Sets the flavor of 478691e6ea8SWarner Losh.Dv MACHINE_ARCH 479691e6ea8SWarner Loshto build. 480691e6ea8SWarner LoshIt is used to optimize the build for a specific CPU / core that the 481691e6ea8SWarner Loshbinaries run on. 482098150fbSWarner LoshGenerally, this does not change the ABI, though it can be a fine line 483691e6ea8SWarner Loshbetween optimization for specific cases. 484098150fbSWarner Losh.It Dv TARGET Used to set 485098150fbSWarner Losh.Dv MACHINE 486098150fbSWarner Loshin the top level Makefile for cross building. 487691e6ea8SWarner LoshUnused outside of that scope. 488691e6ea8SWarner LoshIt is not passed down to the rest of the build. 489098150fbSWarner LoshMakefiles outside of the top level should not use it at all (though 490691e6ea8SWarner Loshsome have their own private copy for hysterical raisons). 491bf1dea9bSWarner Losh.It Dv TARGET_ARCH Used to set 492098150fbSWarner Losh.Dv MACHINE_ARCH 493098150fbSWarner Loshby the top level Makefile for cross building. 494691e6ea8SWarner LoshLike 495691e6ea8SWarner Losh.Dv TARGET , it is unused outside of that scope. 496691e6ea8SWarner Losh.El 497df9330b5SEd Maste.Sh SEE ALSO 498df9330b5SEd Maste.Xr src.conf 5 , 499df9330b5SEd Maste.Xr build 7 500df9330b5SEd Maste.Sh HISTORY 501df9330b5SEd MasteAn 502df9330b5SEd Maste.Nm 503df9330b5SEd Mastemanual page appeared in 5042af3ea6bSEd Maste.Fx 11.1 . 505