This is v2 of the series to enable compiler optimization under GCC for builds targetting X64. It includes a patch from Steven Shi, taken from his series to introduce support for GCC 5.x and Clang 3.8/X64 to EDK2.
The first patch fixes the issue that __builtin_unreachable() is not implemented by GCC 4.4 or earlier. Patch #2 is Steven's patch to switch to the flavor of VA_LIST that is explicitly modeled after the MS implementation. This by itself is an improvement, since the open coded implementation that performs arithmetic on the address of explicit arguments to obtain the variadic arguments is fragile and difficult to maintain, and should be best avoided. Patch #3 enables -Os optimization for X64/RELEASE and X86/DEBUG all the way back to GCC44. This aligns X64 with IA32, which is already built using -Os for both DEBUG and RELEASE. Note that the reported breakage regarding the use of -Os [0] is likely caused by the poor man's __builtin_ms_va_list (NO_BUILTIN_VA_FUNCS) that we used for GCC/X64 before Steven's patch above switches us to a properly defined builtin type. (The poor man's implementation uses pointer arithmetic involving the address of the last named argument to calculate pointers to the variadic arguments and dereferences them to obtain the argument values. I'm quite surprised it works as well as it does at -O0, to be honest) I tested this change with both Ovmf and EmulatorPkg built in various ways and with various versions, with the caveat that I did not always use a matching binutils (i.e., of the same era). Since the issues this series deal with are all code generation issues, I think this is reasonable, but more testing would be appreciated. (v2: this still applies, I have tested DEBUG and RELEASE builds using GCC44, GCC46, GCC47 and GCC48, but all on the same Ubuntu 14.04 system, which means they all use the same ld version 2.24.90) [0] http://thread.gmane.org/gmane.comp.bios.tianocore.devel/10963 Patch #4 applies the visibility 'hidden' GCC pragma globally. Please refer to the commit log for the motivation. Patch #5 switches GCC/X64 to the PIC small code model, which results in smaller code. Changes in v2: - Switch to -Os optimization, both for DEBUG and RELEASE builds. This turns out to work fine (as far as I could establish) and gives the best results in terms of code size. The following numbers were produced with the following invocation build -a X64 -t GCC44 -t GCC46 -t GCC47 -t GCC48 -p OvmfPkg/OvmfPkgX64.dsc \ -D SECURE_BOOT_ENABLE -b DEBUG -b RELEASE DEBUG_GCC44 SECFV [14%Full] 212992 total, 31632 used, 181360 free FVMAIN_COMPACT [74%Full] 1753088 total, 1300904 used, 452184 free DXEFV [50%Full] 10485760 total, 5272464 used, 5213296 free PEIFV [25%Full] 917504 total, 231496 used, 686008 free DEBUG_GCC46 SECFV [14%Full] 212992 total, 31728 used, 181264 free FVMAIN_COMPACT [73%Full] 1753088 total, 1291672 used, 461416 free DXEFV [50%Full] 10485760 total, 5263888 used, 5221872 free PEIFV [25%Full] 917504 total, 231656 used, 685848 free DEBUG_GCC47 SECFV [14%Full] 212992 total, 31440 used, 181552 free FVMAIN_COMPACT [73%Full] 1753088 total, 1290584 used, 462504 free DXEFV [49%Full] 10485760 total, 5234224 used, 5251536 free PEIFV [25%Full] 917504 total, 230152 used, 687352 free DEBUG_GCC48 SECFV [14%Full] 212992 total, 31280 used, 181712 free FVMAIN_COMPACT [73%Full] 1753088 total, 1296208 used, 456880 free DXEFV [49%Full] 10485760 total, 5229424 used, 5256336 free PEIFV [25%Full] 917504 total, 229512 used, 687992 free RELEASE_GCC44 SECFV [6%Full] 212992 total, 14320 used, 198672 free FVMAIN_COMPACT [56%Full] 1753088 total, 997184 used, 755904 free DXEFV [33%Full] 10485760 total, 3508336 used, 6977424 free PEIFV [11%Full] 917504 total, 109896 used, 807608 free RELEASE_GCC46 SECFV [6%Full] 212992 total, 13936 used, 199056 free FVMAIN_COMPACT [56%Full] 1753088 total, 987632 used, 765456 free DXEFV [33%Full] 10485760 total, 3468304 used, 7017456 free PEIFV [11%Full] 917504 total, 107784 used, 809720 free RELEASE_GCC47 SECFV [6%Full] 212992 total, 13808 used, 199184 free FVMAIN_COMPACT [56%Full] 1753088 total, 988072 used, 765016 free DXEFV [32%Full] 10485760 total, 3449936 used, 7035824 free PEIFV [11%Full] 917504 total, 106984 used, 810520 free RELEASE_GCC48 SECFV [6%Full] 212992 total, 13744 used, 199248 free FVMAIN_COMPACT [56%Full] 1753088 total, 992800 used, 760288 free DXEFV [32%Full] 10485760 total, 3453456 used, 7032304 free PEIFV [11%Full] 917504 total, 107464 used, 810040 free For comparison, the baseline RELEASE_GCC48 (i.e., using -0O and the large code model) is SECFV [11%Full] 212992 total, 25392 used, 187600 free FVMAIN_COMPACT [61%Full] 1753088 total, 1076488 used, 676600 free DXEFV [54%Full] 10485760 total, 5743440 used, 4742320 free PEIFV [21%Full] 917504 total, 200328 used, 717176 free Ard Biesheuvel (4): MdePkg: avoid __builtin_unreachable() on GCC v4.4 BaseTools/tools_def: enable Os optimization for GCC X64 builds MdePkg X64: force 'hidden' visibility when building with -fpic BaseTools/tools_def: switch GCC/X64 to the PIC small model Shi, Steven (1): MdePkg: Enable new MS VA intrinsics for GNUC x86 64bits build BaseTools/Conf/tools_def.template | 2 +- MdePkg/Include/Base.h | 29 +++++++++++++++++++- MdePkg/Include/X64/ProcessorBind.h | 10 +++++++ 3 files changed, 39 insertions(+), 2 deletions(-) -- 1.9.1 _______________________________________________ edk2-devel mailing list [email protected] https://lists.01.org/mailman/listinfo/edk2-devel

