Jonathan A. Kollasch | fb6f78e | 2015-07-06 08:22:45 -0500 | [diff] [blame] | 1 | #!/usr/bin/env bash |
Patrick Georgi | e82f475 | 2010-02-10 20:31:38 +0000 | [diff] [blame] | 2 | # |
| 3 | # This file is part of the coreboot project. |
| 4 | # |
| 5 | # Copyright (C) 2007-2010 coresystems GmbH |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 6 | # Copyright (C) 2012 Google Inc |
Timothy Pearson | 82657ca | 2016-03-09 17:20:26 -0600 | [diff] [blame] | 7 | # Copyright (C) 2016 Raptor Engineering, LLC |
Patrick Georgi | e82f475 | 2010-02-10 20:31:38 +0000 | [diff] [blame] | 8 | # |
| 9 | # This program is free software; you can redistribute it and/or modify |
Patrick Georgi | 23d89cc | 2010-03-16 01:17:19 +0000 | [diff] [blame] | 10 | # it under the terms of the GNU General Public License as published by |
| 11 | # the Free Software Foundation; version 2 of the License. |
Patrick Georgi | e82f475 | 2010-02-10 20:31:38 +0000 | [diff] [blame] | 12 | # |
| 13 | # This program is distributed in the hope that it will be useful, |
| 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 16 | # GNU General Public License for more details. |
| 17 | # |
Patrick Georgi | e82f475 | 2010-02-10 20:31:38 +0000 | [diff] [blame] | 18 | |
Martin Roth | d08eb06 | 2016-01-19 08:50:23 -0700 | [diff] [blame] | 19 | # Usage: [--debug] [path to xgcc/bin directory] |
| 20 | |
| 21 | # Enable debug output |
| 22 | if [ "$1" = "--debug" ]; then |
| 23 | shift |
| 24 | set -x |
| 25 | fi |
| 26 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 27 | TMPFILE="" |
Paul Kocialkowski | 15dd6c2 | 2015-08-03 16:46:29 +0200 | [diff] [blame] | 28 | XGCCPATH=$1 |
| 29 | |
Stefan Reinauer | e0383d2 | 2016-04-15 15:27:05 -0700 | [diff] [blame] | 30 | # payloads under payloads/external crossgcc path |
| 31 | if [ -d "$(pwd)/../../../../util/crossgcc/xgcc/bin/" ] |
| 32 | then |
| 33 | XGCCPATH=${XGCCPATH:-"$(pwd)/../../../../util/crossgcc/xgcc/bin/"} |
| 34 | fi |
| 35 | |
Paul Kocialkowski | 15dd6c2 | 2015-08-03 16:46:29 +0200 | [diff] [blame] | 36 | # libpayload crossgcc path |
Martin Roth | 033abe5 | 2016-01-05 15:44:02 -0700 | [diff] [blame] | 37 | if [ -d "$(pwd)/../../util/crossgcc/xgcc/bin/" ] |
Paul Kocialkowski | 15dd6c2 | 2015-08-03 16:46:29 +0200 | [diff] [blame] | 38 | then |
Martin Roth | 033abe5 | 2016-01-05 15:44:02 -0700 | [diff] [blame] | 39 | XGCCPATH=${XGCCPATH:-"$(pwd)/../../util/crossgcc/xgcc/bin/"} |
Paul Kocialkowski | 15dd6c2 | 2015-08-03 16:46:29 +0200 | [diff] [blame] | 40 | fi |
| 41 | |
| 42 | # coreboot crossgcc path |
Martin Roth | 033abe5 | 2016-01-05 15:44:02 -0700 | [diff] [blame] | 43 | if [ -d "$(pwd)/util/crossgcc/xgcc/bin/" ] |
Paul Kocialkowski | 15dd6c2 | 2015-08-03 16:46:29 +0200 | [diff] [blame] | 44 | then |
Martin Roth | 033abe5 | 2016-01-05 15:44:02 -0700 | [diff] [blame] | 45 | XGCCPATH=${XGCCPATH:-"$(pwd)/util/crossgcc/xgcc/bin/"} |
Paul Kocialkowski | 15dd6c2 | 2015-08-03 16:46:29 +0200 | [diff] [blame] | 46 | fi |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 47 | |
| 48 | die() { |
| 49 | echo "ERROR: $*" >&2 |
| 50 | exit 1 |
Patrick Georgi | e82f475 | 2010-02-10 20:31:38 +0000 | [diff] [blame] | 51 | } |
Patrick Georgi | 0588d19 | 2009-08-12 15:00:51 +0000 | [diff] [blame] | 52 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 53 | clean_up() { |
| 54 | if [ -n "$TMPFILE" ]; then |
| 55 | rm -f "$TMPFILE" "$TMPFILE.c" "$TMPFILE.o" |
Patrick Georgi | 0588d19 | 2009-08-12 15:00:51 +0000 | [diff] [blame] | 56 | fi |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 57 | } |
Patrick Georgi | 0588d19 | 2009-08-12 15:00:51 +0000 | [diff] [blame] | 58 | |
Patrick Georgi | adc2413 | 2014-05-14 14:30:08 +0200 | [diff] [blame] | 59 | trap clean_up EXIT |
| 60 | |
| 61 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 62 | program_exists() { |
| 63 | type "$1" >/dev/null 2>&1 |
| 64 | } |
Patrick Georgi | e82f475 | 2010-02-10 20:31:38 +0000 | [diff] [blame] | 65 | |
Patrick Georgi | 004295d | 2014-05-14 14:26:07 +0200 | [diff] [blame] | 66 | |
Martin Roth | 2ba837d | 2016-01-05 15:55:44 -0700 | [diff] [blame] | 67 | if [ "$("${XGCCPATH}/iasl" 2>/dev/null | grep -c ACPI)" -gt 0 ]; then |
Patrick Georgi | 004295d | 2014-05-14 14:26:07 +0200 | [diff] [blame] | 68 | IASL=${XGCCPATH}iasl |
| 69 | elif [ "$(iasl 2>/dev/null | grep -c ACPI)" -gt 0 ]; then |
| 70 | IASL=iasl |
Patrick Georgi | 004295d | 2014-05-14 14:26:07 +0200 | [diff] [blame] | 71 | fi |
| 72 | |
| 73 | if program_exists gcc; then |
| 74 | HOSTCC=gcc |
| 75 | elif program_exists cc; then |
| 76 | HOSTCC=cc |
| 77 | else |
Daniele Forsi | 3bb0b72 | 2014-07-14 15:35:42 +0200 | [diff] [blame] | 78 | die "no host compiler found" |
Patrick Georgi | 004295d | 2014-05-14 14:26:07 +0200 | [diff] [blame] | 79 | fi |
| 80 | |
Martin Roth | 517d4a6 | 2016-01-13 20:52:44 -0700 | [diff] [blame] | 81 | # try to find the core count using various methods |
| 82 | CORES="$(getconf _NPROCESSORS_ONLN 2>/dev/null)" |
| 83 | if [ -z "$CORES" ]; then |
| 84 | NPROC=$(command -v nproc) |
| 85 | if [ -n "$NPROC" ]; then |
| 86 | CORES="$($NPROC)" |
| 87 | fi |
| 88 | fi |
| 89 | if [ -z "$CORES" ]; then |
| 90 | SYSCTL=$(command -v sysctl) |
| 91 | if [ -n "$SYSCTL" ]; then |
| 92 | CORES="$(${SYSCTL} -n hw.ncpu 2>/dev/null)" |
| 93 | fi |
| 94 | fi |
| 95 | if [ -z "$CORES" ] && [ -f /proc/cpuinfo ]; then |
| 96 | CORES="$(grep 'processor' /proc/cpuinfo 2>/dev/null | wc -l)" |
| 97 | fi |
| 98 | |
Patrick Georgi | 004295d | 2014-05-14 14:26:07 +0200 | [diff] [blame] | 99 | cat <<EOF |
| 100 | # platform agnostic and host tools |
| 101 | IASL:=${IASL} |
Paul Menzel | e9b7e25 | 2015-04-09 18:15:09 +0200 | [diff] [blame] | 102 | HOSTCC?=${HOSTCC} |
Martin Roth | 517d4a6 | 2016-01-13 20:52:44 -0700 | [diff] [blame] | 103 | CPUS?=${CORES} |
Patrick Georgi | 004295d | 2014-05-14 14:26:07 +0200 | [diff] [blame] | 104 | |
| 105 | EOF |
| 106 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 107 | testcc() { |
Martin Roth | 7051dea | 2016-01-05 15:49:32 -0700 | [diff] [blame] | 108 | local cc="$1" |
| 109 | local cflags="$2" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 110 | local tmp_c="$TMPFILE.c" |
| 111 | local tmp_o="$TMPFILE.o" |
| 112 | rm -f "$tmp_c" "$tmp_o" |
David Hendricks | ceb82da | 2012-12-20 14:24:08 -0800 | [diff] [blame] | 113 | echo "void _start(void) {}" >"$tmp_c" |
Martin Roth | 7051dea | 2016-01-05 15:49:32 -0700 | [diff] [blame] | 114 | "$cc" -nostdlib -Werror $cflags -c "$tmp_c" -o "$tmp_o" >/dev/null 2>&1 |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 115 | } |
Marc Jones | 087b24d | 2012-02-22 11:46:17 -0700 | [diff] [blame] | 116 | |
Julius Werner | 4bfa29e | 2015-08-20 14:36:34 -0700 | [diff] [blame] | 117 | testld() { |
| 118 | local gcc="$1" |
| 119 | local cflags="$2" |
| 120 | local ld="$3" |
| 121 | local ldflags="$4" |
| 122 | local tmp_o="$TMPFILE.o" |
| 123 | local tmp_elf="$TMPFILE.elf" |
| 124 | rm -f "$tmp_elf" |
Martin Roth | 7051dea | 2016-01-05 15:49:32 -0700 | [diff] [blame] | 125 | testcc "$gcc" "$cflags" && |
| 126 | $ld -nostdlib -static $ldflags -o "$tmp_elf" "$tmp_o" >/dev/null 2>&1 |
Julius Werner | 4bfa29e | 2015-08-20 14:36:34 -0700 | [diff] [blame] | 127 | } |
| 128 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 129 | testas() { |
Vadim Bendebury | d2cb1f9 | 2015-04-25 13:15:58 -0700 | [diff] [blame] | 130 | local gccprefix="$1" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 131 | local twidth="$2" |
| 132 | local arch="$3" |
| 133 | local use_dash_twidth="$4" |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 134 | local endian="$5" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 135 | local obj_file="$TMPFILE.o" |
| 136 | local full_arch="elf$twidth-$arch" |
| 137 | |
| 138 | rm -f "$obj_file" |
| 139 | [ -n "$use_dash_twidth" ] && use_dash_twidth="--$twidth" |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 140 | [ -n "$endian" ] && endian="-$endian" |
Martin Roth | 2ba837d | 2016-01-05 15:55:44 -0700 | [diff] [blame] | 141 | "${gccprefix}as" $use_dash_twidth $endian -o "$obj_file" "$TMPFILE" \ |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 142 | 2>/dev/null || return 1 |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 143 | |
| 144 | # Check output content type. |
Martin Roth | 2ba837d | 2016-01-05 15:55:44 -0700 | [diff] [blame] | 145 | local obj_type="$(LANG=C LC_ALL='' "${gccprefix}"objdump -p "$obj_file" 2>/dev/null)" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 146 | local obj_arch="$(expr "$obj_type" : '.*format \(.[a-z0-9-]*\)')" |
| 147 | [ "$obj_arch" = "$full_arch" ] || return 1 |
| 148 | |
Patrick Georgi | 34de29a | 2015-06-04 13:45:40 +0200 | [diff] [blame] | 149 | unset ASFLAGS LDFLAGS |
| 150 | unset CFLAGS_GCC CFLAGS_CLANG |
| 151 | |
| 152 | if [ -n "$use_dash_twidth" ]; then |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 153 | ASFLAGS="--$twidth" |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 154 | CFLAGS_GCC="-m$twidth" |
Patrick Georgi | 34de29a | 2015-06-04 13:45:40 +0200 | [diff] [blame] | 155 | CFLAGS_CLANG="-m$twidth" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 156 | LDFLAGS="-b $full_arch" |
| 157 | |
| 158 | fi |
| 159 | |
| 160 | # Special parameters only available in dash_twidth mode. |
| 161 | [ -n "$use_dash_twidth" ] && case "$full_arch" in |
| 162 | "elf32-i386" ) |
| 163 | LDFLAGS="$LDFLAGS -melf_i386" |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 164 | CFLAGS_GCC="$CFLAGS_GCC -Wl,-b,elf32-i386 -Wl,-melf_i386" |
Patrick Georgi | 34de29a | 2015-06-04 13:45:40 +0200 | [diff] [blame] | 165 | CFLAGS_CLANG="$CFLAGS_GCC -Wl,-b,elf32-i386 -Wl,-melf_i386" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 166 | ;; |
| 167 | esac |
| 168 | |
| 169 | return 0 |
| 170 | } |
| 171 | |
| 172 | detect_special_flags() { |
| 173 | local architecture="$1" |
Stefan Reinauer | ae9f87f | 2015-03-13 22:52:47 +0100 | [diff] [blame] | 174 | # Check for an operational -m32/-m64 |
| 175 | testcc "$GCC" "$CFLAGS_GCC -m$TWIDTH " && |
| 176 | CFLAGS_GCC="$CFLAGS_GCC -m$TWIDTH " |
| 177 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 178 | # Use bfd linker instead of gold if available: |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 179 | testcc "$GCC" "$CFLAGS_GCC -fuse-ld=bfd" && |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 180 | CFLAGS_GCC="$CFLAGS_GCC -fuse-ld=bfd" && LINKER_SUFFIX='.bfd' |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 181 | |
Paul Menzel | 246051c | 2016-10-27 08:28:55 +0200 | [diff] [blame] | 182 | testcc "$GCC" "$CFLAGS_GCC -fno-stack-protector" && |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 183 | CFLAGS_GCC="$CFLAGS_GCC -fno-stack-protector" |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 184 | testcc "$GCC" "$CFLAGS_GCC -Wl,--build-id=none" && |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 185 | CFLAGS_GCC="$CFLAGS_GCC -Wl,--build-id=none" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 186 | |
| 187 | case "$architecture" in |
Patrick Georgi | ee46712 | 2014-05-14 14:28:21 +0200 | [diff] [blame] | 188 | x86) |
Patrick Georgi | ee46712 | 2014-05-14 14:28:21 +0200 | [diff] [blame] | 189 | ;; |
Stefan Reinauer | 7979dc0 | 2015-06-17 16:07:38 -0700 | [diff] [blame] | 190 | x64) |
Stefan Reinauer | 7979dc0 | 2015-06-17 16:07:38 -0700 | [diff] [blame] | 191 | ;; |
Julius Werner | 4bfa29e | 2015-08-20 14:36:34 -0700 | [diff] [blame] | 192 | arm64) |
| 193 | testld "$GCC" "$CFLAGS_GCC" "${GCCPREFIX}ld${LINKER_SUFFIX}" \ |
| 194 | "$LDFLAGS --fix-cortex-a53-843419" && \ |
| 195 | LDFLAGS_ARM64_A53_ERRATUM_843419+=" --fix-cortex-a53-843419" |
| 196 | ;; |
Vadim Bendebury | fddf75e | 2014-08-29 16:00:37 -0700 | [diff] [blame] | 197 | mipsel) |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 198 | testcc "$GCC" "$CFLAGS_GCC -mno-abicalls -fno-pic" && \ |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 199 | CFLAGS_GCC+=" -mno-abicalls -fno-pic" |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 200 | |
Martin Roth | c2054f3 | 2016-01-05 14:16:57 -0700 | [diff] [blame] | 201 | # Enforce little endian mode. |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 202 | testcc "$GCC" "$CFLAGS_GCC -EL" && \ |
Patrick Georgi | 532df29 | 2015-06-04 13:20:24 +0200 | [diff] [blame] | 203 | CFLAGS_GCC+=" -EL" |
Vadim Bendebury | fddf75e | 2014-08-29 16:00:37 -0700 | [diff] [blame] | 204 | ;; |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 205 | esac |
| 206 | } |
| 207 | |
Patrick Georgi | 527f392 | 2015-06-04 13:31:38 +0200 | [diff] [blame] | 208 | detect_compiler_runtime() { |
Stefan Reinauer | 6404dff | 2015-06-08 19:54:01 +0200 | [diff] [blame] | 209 | test -z "$GCC" || \ |
Martin Roth | 033abe5 | 2016-01-05 15:44:02 -0700 | [diff] [blame] | 210 | CC_RT_GCC="$(${GCC} ${CFLAGS_GCC} -print-libgcc-file-name)" |
Stefan Reinauer | 72dc21c | 2017-06-21 16:28:46 -0700 | [diff] [blame] | 211 | if [ ${CLANG_RUNTIME} = "libgcc" ]; then |
| 212 | CC_RT_CLANG=${CC_RT_GCC} |
| 213 | else |
| 214 | test -z "$CLANG" || \ |
| 215 | CC_RT_CLANG="$(${CLANG} ${CFLAGS_CLANG} -print-libgcc-file-name 2>/dev/null)" |
| 216 | fi |
Patrick Georgi | 527f392 | 2015-06-04 13:31:38 +0200 | [diff] [blame] | 217 | } |
| 218 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 219 | report_arch_toolchain() { |
| 220 | cat <<EOF |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 221 | # elf${TWIDTH}-${TBFDARCH} toolchain (${GCC}) |
Patrick Georgi | d11ff6b | 2014-07-10 20:38:21 +0200 | [diff] [blame] | 222 | ARCH_SUPPORTED+=${TARCH} |
Patrick Georgi | 511f823 | 2014-10-31 16:48:00 +0100 | [diff] [blame] | 223 | SUBARCH_SUPPORTED+=${TSUPP-${TARCH}} |
Martin Roth | c4b684e | 2016-01-05 14:47:59 -0700 | [diff] [blame] | 224 | |
| 225 | # GCC |
| 226 | GCC_CC_${TARCH}:=${GCC} |
| 227 | GCC_CFLAGS_${TARCH}:=${CFLAGS_GCC} |
| 228 | GCC_COMPILER_RT_${TARCH}:=${CC_RT_GCC} |
| 229 | GCC_COMPILER_RT_FLAGS_${TARCH}:=${CC_RT_EXTRA_GCC} |
Martin Roth | 0cd9ff8 | 2016-02-01 17:33:37 -0700 | [diff] [blame] | 230 | EOF |
| 231 | |
| 232 | # Generally the x86 should build for i686 -- no sse/mmx |
| 233 | # instructions since SMM modules are compiled using these |
| 234 | # flags. Note that this doesn't prevent a project using |
| 235 | # xcompile to explicitly specify -mmsse, etc flags. |
| 236 | # The Quark processor doesn't support the instructions |
| 237 | # introduced with the Pentium 6 architecture, so allow it |
| 238 | # to use i586 instead. |
| 239 | if [ "${TARCH}" = "x86_64" ] || [ "${TARCH}" = "x86_32" ]; then |
| 240 | cat <<EOF |
| 241 | |
Lee Leahy | 6796d78 | 2017-06-20 14:33:28 -0700 | [diff] [blame] | 242 | ifneq (\$(CONFIG_USE_MARCH_586)\$(CONFIG_LP_USE_MARCH_586),) |
Martin Roth | 0cd9ff8 | 2016-02-01 17:33:37 -0700 | [diff] [blame] | 243 | GCC_CFLAGS_${TARCH} += -march=i586 |
| 244 | else |
| 245 | GCC_CFLAGS_${TARCH} += -march=i686 |
| 246 | endif |
| 247 | EOF |
| 248 | fi |
| 249 | |
| 250 | cat <<EOF |
Martin Roth | c4b684e | 2016-01-05 14:47:59 -0700 | [diff] [blame] | 251 | |
| 252 | # Clang |
| 253 | CLANG_CC_${TARCH}:=${CLANG} |
| 254 | CLANG_CFLAGS_${TARCH}:=${CFLAGS_CLANG} |
Damien Zammit | adb026f | 2017-08-27 17:03:28 +1000 | [diff] [blame] | 255 | CLANG_CFLAGS_${TARCH}+=-Qunused-arguments -m${TWIDTH} |
Martin Roth | c4b684e | 2016-01-05 14:47:59 -0700 | [diff] [blame] | 256 | # tone down clang compiler warnings |
Stefan Reinauer | 42b37f5 | 2017-06-27 00:27:32 +0200 | [diff] [blame] | 257 | CLANG_CFLAGS_${TARCH}+=-Wno-unused-variable -Wno-unused-function -Wno-tautological-compare |
| 258 | CLANG_CFLAGS_${TARCH}+=-Wno-shift-overflow -Wno-address-of-packed-member -Wno-initializer-overrides |
Martin Roth | c4b684e | 2016-01-05 14:47:59 -0700 | [diff] [blame] | 259 | CLANG_COMPILER_RT_${TARCH}:=${CC_RT_CLANG} |
| 260 | CLANG_COMPILER_RT_FLAGS_${TARCH}:=${CC_RT_EXTRA_CLANG} |
| 261 | |
Stefan Reinauer | f53dbfa | 2015-07-09 00:26:49 +0200 | [diff] [blame] | 262 | ifeq (\$(CONFIG_COMPILER_GCC)\$(CONFIG_LP_COMPILER_GCC),y) |
Martin Roth | c4b684e | 2016-01-05 14:47:59 -0700 | [diff] [blame] | 263 | CC_${TARCH}:=\$(GCC_CC_${TARCH}) |
| 264 | CFLAGS_${TARCH}:=\$(GCC_CFLAGS_${TARCH}) |
| 265 | COMPILER_RT_${TARCH}:=\$(GCC_COMPILER_RT_${TARCH}) |
| 266 | COMPILER_RT_FLAGS_${TARCH}:=\$(GCC_COMPILER_RT_FLAGS_${TARCH}) |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 267 | else |
Martin Roth | c4b684e | 2016-01-05 14:47:59 -0700 | [diff] [blame] | 268 | CC_${TARCH}:=\$(CLANG_CC_${TARCH}) |
| 269 | CFLAGS_${TARCH}:=\$(CLANG_CFLAGS_${TARCH}) |
| 270 | COMPILER_RT_${TARCH}:=\$(CLANG_COMPILER_RT_${TARCH}) |
| 271 | COMPILER_RT_FLAGS_${TARCH}:=\$(CLANG_COMPILER_RT_FLAGS_${TARCH}) |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 272 | endif |
Martin Roth | 0cd9ff8 | 2016-02-01 17:33:37 -0700 | [diff] [blame] | 273 | |
Andrew Wu | cd9abf9 | 2013-09-03 20:39:48 +0800 | [diff] [blame] | 274 | CPP_${TARCH}:=${GCCPREFIX}cpp |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 275 | AS_${TARCH}:=${GCCPREFIX}as ${ASFLAGS} |
Aaron Durbin | 73982c3 | 2013-03-22 19:35:56 -0500 | [diff] [blame] | 276 | LD_${TARCH}:=${GCCPREFIX}ld${LINKER_SUFFIX} ${LDFLAGS} |
Martin Roth | af0216f | 2016-01-05 14:56:13 -0700 | [diff] [blame] | 277 | EOF |
| 278 | |
Martin Roth | a6e7702 | 2016-01-07 14:57:26 -0700 | [diff] [blame] | 279 | if [ "${TARCH}" = "arm64" ] && \ |
| 280 | [ -n "${LDFLAGS_ARM64_A53_ERRATUM_843419}" ]; then |
| 281 | cat <<EOF |
Martin Roth | af0216f | 2016-01-05 14:56:13 -0700 | [diff] [blame] | 282 | |
Martin Roth | a6e7702 | 2016-01-07 14:57:26 -0700 | [diff] [blame] | 283 | ifeq (\$(CONFIG_ARM64_A53_ERRATUM_843419),y) |
Martin Roth | af0216f | 2016-01-05 14:56:13 -0700 | [diff] [blame] | 284 | LD_${TARCH}+=${LDFLAGS_ARM64_A53_ERRATUM_843419} |
Julius Werner | 4bfa29e | 2015-08-20 14:36:34 -0700 | [diff] [blame] | 285 | endif |
Martin Roth | af0216f | 2016-01-05 14:56:13 -0700 | [diff] [blame] | 286 | |
| 287 | EOF |
Martin Roth | a6e7702 | 2016-01-07 14:57:26 -0700 | [diff] [blame] | 288 | fi # if [ "${TARCH}" = "arm64" ]... |
Martin Roth | af0216f | 2016-01-05 14:56:13 -0700 | [diff] [blame] | 289 | |
| 290 | cat <<EOF |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 291 | NM_${TARCH}:=${GCCPREFIX}nm |
| 292 | OBJCOPY_${TARCH}:=${GCCPREFIX}objcopy |
| 293 | OBJDUMP_${TARCH}:=${GCCPREFIX}objdump |
| 294 | READELF_${TARCH}:=${GCCPREFIX}readelf |
| 295 | STRIP_${TARCH}:=${GCCPREFIX}strip |
| 296 | AR_${TARCH}:=${GCCPREFIX}ar |
Nico Huber | 4408409 | 2016-01-15 00:11:57 +0100 | [diff] [blame] | 297 | GNATBIND_${TARCH}:=${GCCPREFIX}gnatbind |
Furquan Shaikh | 3c3a0fa | 2015-05-20 10:09:45 -0700 | [diff] [blame] | 298 | CROSS_COMPILE_${TARCH}:=${GCCPREFIX} |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 299 | |
Martin Roth | 03f7a49 | 2016-01-05 14:21:02 -0700 | [diff] [blame] | 300 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 301 | EOF |
Martin Roth | 03f7a49 | 2016-01-05 14:21:02 -0700 | [diff] [blame] | 302 | #The two blank lines above are intentional separators |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 303 | } |
| 304 | |
Vadim Bendebury | d2cb1f9 | 2015-04-25 13:15:58 -0700 | [diff] [blame] | 305 | # Architecture definitions |
Ronald G. Minnich | b135baa | 2015-12-02 20:24:15 +0000 | [diff] [blame] | 306 | SUPPORTED_ARCHITECTURES="arm arm64 mipsel riscv x64 x86 power8" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 307 | |
Patrick Georgi | 74c8645 | 2016-01-25 18:15:08 +0100 | [diff] [blame] | 308 | # TARCH: local name for the architecture |
| 309 | # (used as CC_${TARCH} in the build system) |
| 310 | # TBFDARCHS: architecture name in binutils (eg elf32-${TBFDARCH}) |
| 311 | # TCLIST: first part of the compiler triplet (eg i386 in i386-elf) |
| 312 | # TWIDTH: numerical argument for cpu mode: gcc -m${TWIDTH} |
| 313 | # TSUPP: supported subarchs (for -mcpu=...) |
| 314 | # TABI: typically elf, eabi or linux |
| 315 | |
Gabe Black | 51edd54 | 2013-09-30 23:00:33 -0700 | [diff] [blame] | 316 | arch_config_arm() { |
| 317 | TARCH="arm" |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 318 | TBFDARCHS="littlearm" |
Stefan Reinauer | 27522ad | 2016-01-29 17:31:34 -0800 | [diff] [blame] | 319 | TCLIST="armv7-a armv7a arm" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 320 | TWIDTH="32" |
Hakim Giydan | 43e5b57 | 2016-09-08 10:13:59 -0700 | [diff] [blame] | 321 | TSUPP="arm armv4 armv7 armv7_m armv7_r" |
Patrick Georgi | 0890a82 | 2014-05-14 14:48:31 +0200 | [diff] [blame] | 322 | TABI="eabi" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 323 | } |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 324 | |
Marc Jones | c4dbdaf | 2015-01-16 13:19:04 -0700 | [diff] [blame] | 325 | arch_config_arm64() { |
| 326 | TARCH="arm64" |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 327 | TBFDARCHS="littleaarch64" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 328 | TCLIST="aarch64" |
| 329 | TWIDTH="64" |
Patrick Georgi | f3d8b9a | 2015-02-17 11:11:55 +0100 | [diff] [blame] | 330 | TSUPP="arm64 armv8_64" |
Patrick Georgi | 3bff5d9 | 2014-11-19 18:36:37 +0100 | [diff] [blame] | 331 | TABI="elf" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 332 | } |
Ronald G. Minnich | 12785d9 | 2013-11-08 10:13:50 -0800 | [diff] [blame] | 333 | |
Ronald G. Minnich | b9a0809 | 2014-10-07 05:18:51 +0000 | [diff] [blame] | 334 | arch_config_riscv() { |
| 335 | TARCH="riscv" |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 336 | TBFDARCHS="littleriscv" |
Iru Cai | 9cc8cb2 | 2016-04-05 23:43:59 +0800 | [diff] [blame] | 337 | TCLIST="riscv riscv64" |
Ronald G. Minnich | b9a0809 | 2014-10-07 05:18:51 +0000 | [diff] [blame] | 338 | TWIDTH="64" |
| 339 | TABI="elf" |
| 340 | } |
| 341 | |
Stefan Reinauer | ae9f87f | 2015-03-13 22:52:47 +0100 | [diff] [blame] | 342 | arch_config_x64() { |
| 343 | TARCH="x86_64" |
| 344 | TBFDARCHS="x86-64" |
| 345 | TCLIST="x86_64" |
| 346 | TWIDTH="64" |
| 347 | TABI="elf" |
| 348 | } |
| 349 | |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 350 | arch_config_x86() { |
Patrick Georgi | b83f7de | 2014-05-17 14:20:11 +0200 | [diff] [blame] | 351 | TARCH="x86_32" |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 352 | TBFDARCHS="i386" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 353 | TCLIST="i386 x86_64" |
| 354 | TWIDTH="32" |
Patrick Georgi | 0890a82 | 2014-05-14 14:48:31 +0200 | [diff] [blame] | 355 | TABI="elf" |
Patrick Georgi | 527f392 | 2015-06-04 13:31:38 +0200 | [diff] [blame] | 356 | CC_RT_EXTRA_GCC="--wrap __divdi3 --wrap __udivdi3 --wrap __moddi3 --wrap __umoddi3" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 357 | } |
| 358 | |
Paul Burton | 6529c33 | 2014-05-27 15:18:42 +0100 | [diff] [blame] | 359 | arch_config_mipsel() { |
Patrick Georgi | e0935bb | 2015-03-28 15:49:46 +0100 | [diff] [blame] | 360 | TARCH="mips" |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 361 | TBFDARCHS="tradlittlemips littlemips" |
Paul Burton | 6529c33 | 2014-05-27 15:18:42 +0100 | [diff] [blame] | 362 | TCLIST="mipsel" |
| 363 | TWIDTH="32" |
Patrick Georgi | e0935bb | 2015-03-28 15:49:46 +0100 | [diff] [blame] | 364 | TSUPP="mips mipsel" |
Paul Burton | 6529c33 | 2014-05-27 15:18:42 +0100 | [diff] [blame] | 365 | TABI="elf" |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 366 | TENDIAN="EL" |
Paul Burton | 6529c33 | 2014-05-27 15:18:42 +0100 | [diff] [blame] | 367 | } |
| 368 | |
Ronald G. Minnich | b135baa | 2015-12-02 20:24:15 +0000 | [diff] [blame] | 369 | arch_config_power8() { |
Patrick Georgi | d6577e1 | 2016-01-25 18:16:14 +0100 | [diff] [blame] | 370 | TARCH="power8" |
Timothy Pearson | 82657ca | 2016-03-09 17:20:26 -0600 | [diff] [blame] | 371 | TBFDARCHS="powerpc" |
| 372 | TCLIST="powerpc64" |
Ronald G. Minnich | b135baa | 2015-12-02 20:24:15 +0000 | [diff] [blame] | 373 | TWIDTH="64" |
| 374 | TSUPP="power8" |
Timothy Pearson | 82657ca | 2016-03-09 17:20:26 -0600 | [diff] [blame] | 375 | TABI="linux-gnu" # there is no generic ABI on ppc64 |
| 376 | CC_RT_EXTRA_GCC="-mcpu=power8 -mbig-endian" |
Ronald G. Minnich | b135baa | 2015-12-02 20:24:15 +0000 | [diff] [blame] | 377 | } |
| 378 | |
Stefan Reinauer | 72dc21c | 2017-06-21 16:28:46 -0700 | [diff] [blame] | 379 | # Right now, the clang reference toolchain is not building compiler-rt builtins |
| 380 | # for any of the cross compile architectures. Hence we use libgcc for now, |
| 381 | # because that is available and lets us proceed with getting coreboot clang |
| 382 | # ready. Toggle CLANG_RUNTIME if you want to experiment with compiler-rt. |
| 383 | |
| 384 | CLANG_RUNTIME="libgcc" |
| 385 | # CLANG_RUNTIME="compiler-rt" |
| 386 | |
Patrick Georgi | e0187df | 2014-05-14 14:32:11 +0200 | [diff] [blame] | 387 | test_architecture() { |
Vadim Bendebury | d2cb1f9 | 2015-04-25 13:15:58 -0700 | [diff] [blame] | 388 | local architecture=$1 |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 389 | local endian gccprefix search |
Patrick Georgi | e0187df | 2014-05-14 14:32:11 +0200 | [diff] [blame] | 390 | |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 391 | GCCPREFIX="invalid" |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 392 | unset TABI TARCH TBFDARCH TCLIST TENDIAN TSUPP TWIDTH |
Patrick Georgi | 527f392 | 2015-06-04 13:31:38 +0200 | [diff] [blame] | 393 | unset CC_RT_EXTRA_GCC CC_RT_EXTRA_CLANG |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 394 | unset GCC CLANG |
Martin Roth | 2ba837d | 2016-01-05 15:55:44 -0700 | [diff] [blame] | 395 | if type "arch_config_$architecture" > /dev/null; then |
| 396 | "arch_config_$architecture" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 397 | else |
Daniele Forsi | 3bb0b72 | 2014-07-14 15:35:42 +0200 | [diff] [blame] | 398 | die "no architecture definition for $architecture" |
Patrick Georgi | d387c63 | 2014-05-14 14:23:28 +0200 | [diff] [blame] | 399 | fi |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 400 | |
| 401 | # To override toolchain, define CROSS_COMPILE_$arch or CROSS_COMPILE as |
| 402 | # environment variable. |
| 403 | # Ex: CROSS_COMPILE_arm="armv7a-cros-linux-gnueabi-" |
| 404 | # CROSS_COMPILE_x86="i686-pc-linux-gnu-" |
Martin Roth | 2ba837d | 2016-01-05 15:55:44 -0700 | [diff] [blame] | 405 | search="$(eval echo "\$CROSS_COMPILE_$architecture" 2>/dev/null)" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 406 | search="$search $CROSS_COMPILE" |
| 407 | for toolchain in $TCLIST; do |
Patrick Georgi | 0890a82 | 2014-05-14 14:48:31 +0200 | [diff] [blame] | 408 | search="$search $XGCCPATH$toolchain-$TABI-" |
| 409 | search="$search $toolchain-$TABI-" |
Ronald G. Minnich | 12785d9 | 2013-11-08 10:13:50 -0800 | [diff] [blame] | 410 | search="$search $toolchain-linux-gnu-" |
Patrick Georgi | a1a6f75 | 2016-01-25 18:15:45 +0100 | [diff] [blame] | 411 | search="$search $toolchain-linux-" |
Ronald G. Minnich | b9a0809 | 2014-10-07 05:18:51 +0000 | [diff] [blame] | 412 | search="$search $toolchain-" |
Vladimir Serbinenko | 63cf7cd | 2016-02-18 15:30:53 +0100 | [diff] [blame] | 413 | search="$search $toolchain-linux-gnueabi-" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 414 | done |
Martin Roth | 03f7a49 | 2016-01-05 14:21:02 -0700 | [diff] [blame] | 415 | echo "###########################################################################" |
| 416 | echo "# $architecture" |
| 417 | echo "# TARCH_SEARCH=$search" |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 418 | |
| 419 | # Search toolchain by checking assembler capability. |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 420 | for TBFDARCH in $TBFDARCHS; do |
Vadim Bendebury | d2cb1f9 | 2015-04-25 13:15:58 -0700 | [diff] [blame] | 421 | for gccprefix in $search ""; do |
| 422 | program_exists "${gccprefix}as" || continue |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 423 | for endian in $TENDIAN ""; do |
Stefan Tauner | 98ab227 | 2016-05-01 19:41:28 +0200 | [diff] [blame] | 424 | { testas "$gccprefix" "$TWIDTH" "$TBFDARCH" \ |
| 425 | "" "$endian" || |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 426 | testas "$gccprefix" "$TWIDTH" "$TBFDARCH" \ |
Stefan Tauner | 98ab227 | 2016-05-01 19:41:28 +0200 | [diff] [blame] | 427 | "TRUE" "$endian" ; } && \ |
| 428 | testcc "${gccprefix}gcc" "$CFLAGS_GCC" && \ |
| 429 | GCCPREFIX="$gccprefix" && \ |
| 430 | break 3 |
Vadim Bendebury | 05a8472 | 2015-04-25 13:05:10 -0700 | [diff] [blame] | 431 | done |
Vadim Bendebury | a6b220d | 2014-08-27 15:30:19 -0700 | [diff] [blame] | 432 | done |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 433 | done |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 434 | if [ "invalid" != "$GCCPREFIX" ]; then |
| 435 | GCC="${GCCPREFIX}gcc" |
| 436 | fi |
Ronald G. Minnich | e820e5c | 2012-11-26 14:33:09 -0800 | [diff] [blame] | 437 | |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 438 | for clang_arch in $TCLIST invalid; do |
Patrick Georgi | f138320 | 2017-05-10 22:06:31 +0200 | [diff] [blame] | 439 | for clang_prefix in $search $XGCCPATH ""; do |
| 440 | testcc "${clang_prefix}clang" "-target ${clang_arch}-$TABI -c" && break 2 |
| 441 | done |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 442 | done |
| 443 | |
| 444 | if [ "invalid" != "$clang_arch" ]; then |
| 445 | # FIXME: this may break in a clang && !gcc configuration, |
| 446 | # but that's more of a clang limitation. Let's be optimistic |
| 447 | # that this will change in the future. |
Patrick Georgi | f138320 | 2017-05-10 22:06:31 +0200 | [diff] [blame] | 448 | CLANG="${clang_prefix}clang" |
Stefan Reinauer | 72dc21c | 2017-06-21 16:28:46 -0700 | [diff] [blame] | 449 | CFLAGS_CLANG="-target ${clang_arch}-${TABI} --rtlib=${CLANG_RUNTIME} $CFLAGS_CLANG -ccc-gcc-name ${GCC}" |
Patrick Georgi | 8b5a051c | 2015-06-04 13:44:41 +0200 | [diff] [blame] | 450 | fi |
Patrick Georgi | e0187df | 2014-05-14 14:32:11 +0200 | [diff] [blame] | 451 | } |
| 452 | |
Patrick Georgi | be182ad | 2017-01-30 15:27:35 +0100 | [diff] [blame] | 453 | OUT="$(mktemp /tmp/temp.XXXXXX 2>/dev/null || echo /tmp/temp.coreboot.$RANDOM)" |
| 454 | rm -f $OUT |
| 455 | |
Vadim Bendebury | d2cb1f9 | 2015-04-25 13:15:58 -0700 | [diff] [blame] | 456 | for architecture in $SUPPORTED_ARCHITECTURES; do |
Patrick Georgi | be182ad | 2017-01-30 15:27:35 +0100 | [diff] [blame] | 457 | ( |
| 458 | TMPFILE="$(mktemp /tmp/temp.XXXXXX 2>/dev/null || echo /tmp/temp.coreboot.$RANDOM)" |
| 459 | touch $TMPFILE |
Martin Roth | 2ba837d | 2016-01-05 15:55:44 -0700 | [diff] [blame] | 460 | test_architecture "$architecture" |
Martin Roth | 31c4b64 | 2015-12-07 14:34:46 -0700 | [diff] [blame] | 461 | detect_special_flags "$architecture" |
| 462 | detect_compiler_runtime "$architecture" |
| 463 | report_arch_toolchain |
Patrick Georgi | be182ad | 2017-01-30 15:27:35 +0100 | [diff] [blame] | 464 | clean_up |
| 465 | ) > $OUT.$architecture & |
| 466 | done |
| 467 | wait |
| 468 | |
| 469 | for architecture in $SUPPORTED_ARCHITECTURES; do |
| 470 | cat $OUT.$architecture |
| 471 | rm -f $OUT.$architecture |
Patrick Georgi | 0588d19 | 2009-08-12 15:00:51 +0000 | [diff] [blame] | 472 | done |
Patrick Georgi | 6dda31d | 2015-11-19 15:15:33 +0100 | [diff] [blame] | 473 | echo XCOMPILE_COMPLETE:=1 |