Use latest GCC toolchain for all other than kernel

When selecting the GCC toolchain, use the latest version available to us except
for the kernel. U-boot and kvm-unit-tests require more recent versions of GCC,
and the purpose of the test with older toolchains is to test the kernel.

Change-Id: I8f85ad4f8ec09be46d68c238f3c5ccbc88431178
diff --git a/Makefile b/Makefile
index 556eb4a..b131054 100644
--- a/Makefile
+++ b/Makefile
@@ -65,6 +65,8 @@
 
 # Specifies which toolchain of the prebuilt toolchains to use.
 # Can be either clang, gcc-4.9 (deprecated), gcc-5.1, or gcc-9.2.
+# GCC will always use the latest version for building everything else other
+# than the kernel.
 TOOLCHAIN ?= clang
 
 # Find the toolchain path for the current OS.
@@ -93,24 +95,30 @@
 LD := $(TOOLCHAIN_BIN)/ld.lld
 OBJCOPY := $(TOOLCHAIN_BIN)/llvm-objcopy
 OBJDUMP := $(TOOLCHAIN_BIN)/llvm-objdump
-# The GCC toolchain is needed when building kvm-unit-tests as well as Linux
-# with Clang, because of lack of support for the LLVM integrated assembler.
+# The GCC toolchain is needed when building kvm-unit-tests and Linux with Clang.
 GCC_TOOLCHAIN_DIR = $(TOOLCHAIN_GCC_49)
 GCC_TOOLCHAIN_BIN = $(GCC_TOOLCHAIN_DIR)/bin/
-LLVM = LLVM=1 LLVM_IAS=1
+LINUX_EXTRA = LLVM=1 LLVM_IAS=1 GCC_TOOLCHAIN_DIR="$(GCC_TOOLCHAIN_BIN)"
 # Some targets require additional flags to build with Clang.
 COMMON_CFLAGS := -Qunused-arguments --target=$(TARGET) -fno-integrated-as -Wno-asm-operand-widths -fpic --gcc-toolchain=$(GCC_TOOLCHAIN_DIR) --sysroot=$(GCC_TOOLCHAIN_DIR)/$(TARGET)/libc --prefix=$(GCC_TOOLCHAIN_BIN)/$(TARGET)-
 else
 $(error Unrecognized toolchain: TOOLCHAIN=$(TOOLCHAIN))
 endif
 
-# common to all GCC versions
+LINUX_TOOLCHAIN_BIN := $(TOOLCHAIN_BIN)
+LINUX_TARGET := $(TARGET)
+
+# Common to all GCC versions:
+# Use the latest GCC toolchain to build everything other than the kernel
+# because kvm-unit-tests as well as u-boot require recent versions.
 ifneq ($(TOOLCHAIN), clang)
+TARGET = $(TARGET_GCC_92)
+TOOLCHAIN_BIN := $(TOOLCHAIN_GCC_92)/bin
+GCC_TOOLCHAIN_BIN := $(TOOLCHAIN_BIN)
 CC := $(TOOLCHAIN_BIN)/$(TARGET)-gcc
 LD := $(TOOLCHAIN_BIN)/$(TARGET)-ld
 OBJCOPY := $(TOOLCHAIN_BIN)/$(TARGET)-objcopy
 OBJDUMP := $(TOOLCHAIN_BIN)/$(TARGET)-objdump
-GCC_TOOLCHAIN_BIN := $(TOOLCHAIN_BIN)
 endif
 
 ##
@@ -219,12 +227,11 @@
 LINUX_DIST_FILES = $(LINUX_CONFIG) $(LINUX_VMLINUX) $(KERNEL_IMAGE)
 
 LINUX_MAKE := \
-	PATH=$(TOOLCHAIN_BIN):$(PATH) \
+	PATH=$(LINUX_TOOLCHAIN_BIN):$(PATH) \
 	ARCH=$(ARCH) \
-	CROSS_COMPILE="$(TARGET)-" \
+	CROSS_COMPILE="$(LINUX_TARGET)-" \
 	$(MAKE) \
-	$(LLVM) \
-	GCC_TOOLCHAIN_DIR="$(GCC_TOOLCHAIN_BIN)" \
+	$(LINUX_EXTRA) \
 	-C $(LINUX_SRC) \
 	V=$(LINUX_VERBOSE) \
 	O=$(LINUX_OUT)
@@ -265,32 +272,14 @@
 UBOOT_DEFCONFIG ?= pvmfw_arm64_defconfig
 UBOOT_VERBOSE ?= $(VERBOSE)
 UBOOT_SRC ?= $(ROOT_DIR)/u-boot
-
-# U-boot doesn't support gcc < 6.0. To avoid compilation failure,
-# we upgrade the active toolchain version for the u-boot build.
-ifeq ($(TOOLCHAIN), gcc-5.1)
-$(warning "gcc below 6.0 is not supported by u-boot, switching to 9.2")
-UBOOT_TOOLCHAIN_BIN := $(TOOLCHAIN_GCC_92)/bin
-UBOOT_TARGET = $(TARGET_GCC_92)
-UBOOT_CC := $(UBOOT_TOOLCHAIN_BIN)/$(UBOOT_TARGET)-gcc
-UBOOT_LD := $(UBOOT_TOOLCHAIN_BIN)/$(UBOOT_TARGET)-ld
-UBOOT_GCC_TOOLCHAIN_BIN := $(UBOOT_TOOLCHAIN_BIN)
-else
-UBOOT_TOOLCHAIN_BIN := $(TOOLCHAIN_BIN)
-UBOOT_TARGET = $(TARGET)
-UBOOT_CC := $(CC)
-UBOOT_LD := $(LD)
-UBOOT_GCC_TOOLCHAIN_BIN := $(GCC_TOOLCHAIN_BIN)
-endif
-
 UBOOT_OUT := $(OUT_DIR)/u-boot
 UBOOT_MAKE := \
-	PATH=$(UBOOT_TOOLCHAIN_BIN):$(UBOOT_GCC_TOOLCHAIN_BIN):$(PATH) \
+	PATH=$(TOOLCHAIN_BIN):$(GCC_TOOLCHAIN_BIN):$(PATH) \
 	ARCH=$(ARCH) \
-	CROSS_COMPILE="$(UBOOT_TARGET)-" \
+	CROSS_COMPILE="$(TARGET)-" \
 	$(MAKE) \
-	CC=$(UBOOT_CC) \
-	LD=$(UBOOT_LD) \
+	CC=$(CC) \
+	LD=$(LD) \
 	-C $(UBOOT_SRC) \
 	V=$(UBOOT_VERBOSE) \
 	O=$(UBOOT_OUT)