From 3b487a2b1ecb2e6a6f247b1216f73feee40a7859 Mon Sep 17 00:00:00 2001
From: Olivier Martin <olivier.martin@arm.com>
Date: Thu, 2 May 2013 10:42:34 +0100
Subject: [PATCH] BaseTools: Added support for a CROSS_COMPILE ELFGCC

This change allows to use ELFGCC for any architecture (support Intel and ARM architecture).
---
 BaseTools/Conf/build_rule.template |    2 +-
 BaseTools/Conf/tools_def.template  |   96 +++++++++++++++++------------------
 2 files changed, 48 insertions(+), 50 deletions(-)

diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template
index 107e783..80d8261 100644
--- a/BaseTools/Conf/build_rule.template
+++ b/BaseTools/Conf/build_rule.template
@@ -214,7 +214,7 @@
         "$(SLINK)" $(SLINK_FLAGS) /OUT:${dst} @$(OBJECT_FILES_LIST)
 
     <Command.GCC>
-        "$(SLINK)" -cr ${dst} $(SLINK_FLAGS) @$(OBJECT_FILES_LIST)
+        "$(SLINK)" $(SLINK_FLAGS) ${dst} @$(OBJECT_FILES_LIST)
     
     <Command.RVCT>
         "$(SLINK)" $(SLINK_FLAGS) ${dst} --via $(OBJECT_FILES_LIST)
diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template
index a82404a..c5f291c 100644
--- a/BaseTools/Conf/tools_def.template
+++ b/BaseTools/Conf/tools_def.template
@@ -1,6 +1,7 @@
 #
 #  Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
 #  Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+#  Portions copyright (c) 2011-2013, ARM Ltd. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD License
@@ -105,8 +106,6 @@ DEFINE ICC11_BIN64x86     = C:\Program Files (x86)\Intel\Compiler\DEF(ICC11_VERS
 DEFINE EBC_BIN          = C:\Program Files\Intel\EBC\Bin
 DEFINE EBC_BINx86       = C:\Program Files (x86)\Intel\EBC\Bin
 
-DEFINE ELFGCC_BIN       = /usr/bin
-
 #
 # Option 1: Hard coded full path to compiler suite
 DEFINE UNIXGCC_IA32_PETOOLS_PREFIX = /opt/tiano/i386-tiano-pe/i386-tiano-pe/bin/
@@ -2541,7 +2540,8 @@ DEFINE GCC_ALL_CC_FLAGS            = -g -Os -fshort-wchar -fno-strict-aliasing -
 DEFINE GCC_IA32_CC_FLAGS           = DEF(GCC_ALL_CC_FLAGS) -m32 -malign-double -freorder-blocks -freorder-blocks-and-partition -O2 -mno-stack-arg-probe
 DEFINE GCC_X64_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mno-red-zone -Wno-address -mno-stack-arg-probe
 DEFINE GCC_IPF_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency
-DEFINE GCC_ARMGCC_CC_FLAGS         = DEF(GCC_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char  -ffunction-sections -fdata-sections -fomit-frame-pointer
+DEFINE GCC_IPF_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -minline-int-divide-min-latency
+DEFINE GCC_ARM_CC_FLAGS            = DEF(GCC_ALL_CC_FLAGS) -mword-relocations -mlittle-endian -mabi=aapcs -mapcs -fno-short-enums -save-temps -fsigned-char -ffunction-sections -fdata-sections -fomit-frame-pointer -Wno-address
 DEFINE GCC_DLINK_FLAGS_COMMON      = -nostdlib --pie
 DEFINE GCC_IA32_X64_DLINK_COMMON   = DEF(GCC_DLINK_FLAGS_COMMON) --gc-sections
 DEFINE GCC_IA32_X64_ASLDLINK_FLAGS = DEF(GCC_IA32_X64_DLINK_COMMON) --entry _ReferenceAcpiTable -u $(IMAGE_ENTRY_POINT)
@@ -3083,8 +3083,17 @@ DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
 *_ELFGCC_*_*_FAMILY                 = GCC
 *_ELFGCC_*_MAKE_PATH                = make
 
-*_ELFGCC_*_PP_FLAGS                     = -E -x assembler-with-cpp -include AutoGen.h
-*_ELFGCC_*_VFRPP_FLAGS                  = -x c -E -P -DVFRCOMPILE --include $(MODULE_NAME)StrDefs.h
+*_ELFGCC_*_OBJCOPY_PATH          = ENV(CROSS_COMPILE)objcopy
+*_ELFGCC_*_CC_PATH               = ENV(CROSS_COMPILE)gcc
+*_ELFGCC_*_SLINK_PATH            = ENV(CROSS_COMPILE)ar
+*_ELFGCC_*_DLINK_PATH            = ENV(CROSS_COMPILE)ld
+*_ELFGCC_*_ASM_PATH              = ENV(CROSS_COMPILE)as
+*_ELFGCC_*_PP_PATH               = ENV(CROSS_COMPILE)gcc
+*_ELFGCC_*_VFRPP_PATH            = ENV(CROSS_COMPILE)gcc
+*_ELFGCC32_*_ASLCC_PATH          = ENV(CROSS_COMPILE)gcc
+*_ELFGCC32_*_ASLPP_PATH          = ENV(CROSS_COMPILE)gcc
+*_ELFGCC32_*_ASLDLINK_PATH       = ENV(CROSS_COMPILE)ld
+*_ELFGCC_*_RC_PATH               = ENV(CROSS_COMPILE)objcopy
 
 ##################
 # ASL definitions
@@ -3099,22 +3108,10 @@ DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
 ##################
 # IA32 definitions
 ##################
-*_ELFGCC_IA32_OBJCOPY_PATH          = DEF(ELFGCC_BIN)/objcopy
-*_ELFGCC_IA32_CC_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IA32_SLINK_PATH            = DEF(ELFGCC_BIN)/ar
-*_ELFGCC_IA32_DLINK_PATH            = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IA32_ASM_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IA32_PP_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IA32_VFRPP_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC32_IA32_ASLCC_PATH          = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC32_IA32_ASLPP_PATH          = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC32_IA32_ASLDLINK_PATH       = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IA32_RC_PATH               = DEF(ELFGCC_BIN)/objcopy
-
-*_ELFGCC_IA32_CC_FLAGS              = -m32 -g -fshort-wchar -fno-strict-aliasing -Wall -malign-double -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings
-*_ELFGCC_IA32_SLINK_FLAGS           =
-*_ELFGCC_IA32_DLINK_FLAGS           = -melf_i386 -nostdlib --shared --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-#*_ELFGCC_IA32_DLINK_FLAGS          = -melf_i386 -nostdlib -n -q -Ttext 0x220 --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT)
+*_ELFGCC_IA32_ARCHCC_FLAGS          = -m32 -malign-double -c -include $(DEST_DIR_DEBUG)/AutoGen.h -DSTRING_ARRAY_NAME=$(BASE_NAME)Strings
+*_ELFGCC_IA32_SLINK_FLAGS           = -cr
+*_ELFGCC_IA32_ARCHDLINK_FLAGS       = -melf_i386 --shared
+#*_ELFGCC_IA32_DLINK_FLAGS          = -melf_i386 -n -q -Ttext 0x220
 *_ELFGCC_IA32_ASM_FLAGS             = -m32 -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
 *_ELFGCC_IA32_PP_FLAGS              = -m32 -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
 *_ELFGCC_IA32_VFRPP_FLAGS           = -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
@@ -3124,20 +3121,9 @@ DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
 ##################
 # X64 definitions
 ##################
-*_ELFGCC_X64_CC_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_ASLCC_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_SLINK_PATH            = DEF(ELFGCC_BIN)/ar
-*_ELFGCC_X64_DLINK_PATH            = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_X64_ASLDLINK_PATH         = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_X64_ASM_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_PP_PATH               = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_ASLPP_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_VFRPP_PATH            = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_X64_RC_PATH               = DEF(ELFGCC_BIN)/objcopy
-
-*_ELFGCC_X64_CC_FLAGS              = -Os -fshort-wchar -fno-strict-aliasing -Wall -Werror -Wno-missing-braces -Wno-address -Wno-array-bounds -c -include AutoGen.h -D_EFI_P64
-*_ELFGCC_X64_DLINK_FLAGS           = -nostdlib --shared --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-*_ELFGCC_X64_SLINK_FLAGS           =
+*_ELFGCC_X64_ARCHCC_FLAGS          = -Wno-address -c -include AutoGen.h -D_EFI_P64
+*_ELFGCC_X64_ARCHDLINK_FLAGS       = --shared
+*_ELFGCC_X64_SLINK_FLAGS           = -cr
 *_ELFGCC_X64_ASM_FLAGS             = -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
 *_ELFGCC_X64_PP_FLAGS              = -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
 *_ELFGCC_X64_VFRPP_FLAGS           = -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
@@ -3146,25 +3132,37 @@ DEFINE GCC46_ASM_FLAGS               = DEF(GCC45_ASM_FLAGS)
 ##################
 # IPF definitions
 ##################
-*_ELFGCC_IPF_CC_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_ASLCC_PATH           = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_SLINK_PATH           = DEF(ELFGCC_BIN)/ar
-*_ELFGCC_IPF_DLINK_PATH           = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IPF_ASLDLINK_PATH        = DEF(ELFGCC_BIN)/ld
-*_ELFGCC_IPF_ASM_PATH             = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_PP_PATH              = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_ASLPP_PATH           = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_VFRPP_PATH           = DEF(ELFGCC_BIN)/gcc
-*_ELFGCC_IPF_RC_PATH              = DEF(ELFGCC_BIN)/objcopy
-
-*_ELFGCC_IPF_CC_FLAGS             = -Os -fshort-wchar -Wall -Werror -c -include AutoGen.h -D_EFI_P64
-*_ELFGCC_IPF_DLINK_FLAGS          = -nostdlib --shared --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
-*_ELFGCC_IPF_SLINK_FLAGS          =
+*_ELFGCC_IPF_ARCHCC_FLAGS         = -c -include AutoGen.h -D_EFI_P64
+*_ELFGCC_IPF_ARCHDLINK_FLAGS      = --shared
+*_ELFGCC_IPF_SLINK_FLAGS          = -cr
 *_ELFGCC_IPF_ASM_FLAGS            = -c -x assembler -imacros $(DEST_DIR_DEBUG)/AutoGen.h
 *_ELFGCC_IPF_PP_FLAGS             = -E -x assembler-with-cpp -include $(DEST_DIR_DEBUG)/AutoGen.h
 *_ELFGCC_IPF_VFRPP_FLAGS          = -x c -E -P -DVFRCOMPILE --include $(DEST_DIR_DEBUG)/$(MODULE_NAME)StrDefs.h
 *_ELFGCC_IPF_RC_FLAGS             = DEF(GCC_IPF_RC_FLAGS)
 
+##################
+# ARM definitions
+##################
+*_ELFGCC_ARM_ARCHCC_FLAGS         = DEF(GCC_ARM_CC_FLAGS) -mthumb -fno-stack-protector
+*_ELFGCC_ARM_SLINK_FLAGS          = -rc
+*_ELFGCC_ARM_ARCHASM_FLAGS        = 
+*_ELFGCC_ARM_ASM_FLAGS            = $(ARCHASM_FLAGS) $(PLATFORM_FLAGS) -mlittle-endian
+*_ELFGCC_ARM_ARCHDLINK_FLAGS      = -Ttext=0x0 --oformat=elf32-littlearm --emit-relocs
+*_ELFGCC_ARM_RC_FLAGS             = -I binary -O elf32-littlearm -B arm --rename-section .data=.hii
+*_ELFGCC_ARM_PLATFORM_FLAGS       = -march=armv7-a
+*_ELFGCC_ARM_OBJCOPY_PATH         = echo
+
+##################
+# Common definitions
+##################
+*_ELFGCC_*_PP_FLAGS               = DEF(GCC_PP_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
+*_ELFGCC_*_VFRPP_FLAGS            = DEF(GCC_VFRPP_FLAGS) $(ARCHCC_FLAGS) $(PLATFORM_FLAGS)
+*_ELFGCC_*_DLINK_FLAGS            = $(ARCHDLINK_FLAGS) -nostdlib --entry $(IMAGE_ENTRY_POINT) -u $(IMAGE_ENTRY_POINT) -Map $(DEST_DIR_DEBUG)/$(BASE_NAME).map
+
+  DEBUG_ELFGCC_*_CC_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -O0
+RELEASE_ELFGCC_*_CC_FLAGS         = $(ARCHCC_FLAGS) $(PLATFORM_FLAGS) -Wno-unused-but-set-variable
+
+
 ####################################################################################
 #
 # Intel(R) C++ Compiler Version 9.1
-- 
1.7.0.4

