Merge pull request #11856 from fkjagodzinski/gcc_build-enable_lto_for_release

GCC: Add a build profile extension with the link-time optimizer enabled
pull/12473/head
Martin Kojtal 2020-02-19 12:51:30 +00:00 committed by GitHub
commit d9becd449a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 16 deletions

View File

@ -1,15 +1,15 @@
{ {
"GCC_ARM": { "GCC_ARM": {
"common": ["-c", "-Wall", "-Wextra", "common": ["-Wall", "-Wextra",
"-Wno-unused-parameter", "-Wno-missing-field-initializers", "-Wno-unused-parameter", "-Wno-missing-field-initializers",
"-fmessage-length=0", "-fno-exceptions", "-fmessage-length=0", "-fno-exceptions",
"-ffunction-sections", "-fdata-sections", "-funsigned-char", "-ffunction-sections", "-fdata-sections", "-funsigned-char",
"-MMD", "-MMD",
"-fomit-frame-pointer", "-Og", "-g3", "-DMBED_DEBUG", "-fomit-frame-pointer", "-Og", "-DMBED_DEBUG",
"-DMBED_TRAP_ERRORS_ENABLED=1"], "-DMBED_TRAP_ERRORS_ENABLED=1"],
"asm": ["-x", "assembler-with-cpp"], "asm": ["-c", "-g3", "-x", "assembler-with-cpp"],
"c": ["-std=gnu11"], "c": ["-c", "-g3", "-std=gnu11"],
"cxx": ["-std=gnu++14", "-fno-rtti", "-Wvla"], "cxx": ["-c", "-g3", "-std=gnu++14", "-fno-rtti", "-Wvla"],
"ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r", "ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r",
"-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r", "-Wl,--wrap,_memalign_r", "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r", "-Wl,--wrap,_memalign_r",
"-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit", "-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit",

View File

@ -1,14 +1,14 @@
{ {
"GCC_ARM": { "GCC_ARM": {
"common": ["-c", "-Wall", "-Wextra", "common": ["-Wall", "-Wextra",
"-Wno-unused-parameter", "-Wno-missing-field-initializers", "-Wno-unused-parameter", "-Wno-missing-field-initializers",
"-fmessage-length=0", "-fno-exceptions", "-fmessage-length=0", "-fno-exceptions",
"-ffunction-sections", "-fdata-sections", "-funsigned-char", "-ffunction-sections", "-fdata-sections", "-funsigned-char",
"-MMD", "-MMD",
"-fomit-frame-pointer", "-Os", "-g", "-DMBED_TRAP_ERRORS_ENABLED=1"], "-fomit-frame-pointer", "-Os", "-g", "-DMBED_TRAP_ERRORS_ENABLED=1"],
"asm": ["-x", "assembler-with-cpp"], "asm": ["-c", "-x", "assembler-with-cpp"],
"c": ["-std=gnu11"], "c": ["-c", "-std=gnu11"],
"cxx": ["-std=gnu++14", "-fno-rtti", "-Wvla"], "cxx": ["-c", "-std=gnu++14", "-fno-rtti", "-Wvla"],
"ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r", "ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r",
"-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r", "-Wl,--wrap,_memalign_r", "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r", "-Wl,--wrap,_memalign_r",
"-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit", "-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit",

View File

@ -2,5 +2,9 @@
"ARMC6": { "ARMC6": {
"common": ["-flto"], "common": ["-flto"],
"ld": ["--lto", "--lto_level=Oz"] "ld": ["--lto", "--lto_level=Oz"]
},
"GCC_ARM": {
"common": ["-flto"],
"ld": ["-u main"]
} }
} }

View File

@ -1,14 +1,14 @@
{ {
"GCC_ARM": { "GCC_ARM": {
"common": ["-c", "-Wall", "-Wextra", "common": ["-Wall", "-Wextra",
"-Wno-unused-parameter", "-Wno-missing-field-initializers", "-Wno-unused-parameter", "-Wno-missing-field-initializers",
"-fmessage-length=0", "-fno-exceptions", "-fmessage-length=0", "-fno-exceptions",
"-ffunction-sections", "-fdata-sections", "-funsigned-char", "-ffunction-sections", "-fdata-sections", "-funsigned-char",
"-MMD", "-MMD",
"-fomit-frame-pointer", "-Os", "-DNDEBUG", "-g"], "-fomit-frame-pointer", "-Os", "-DNDEBUG", "-g"],
"asm": ["-x", "assembler-with-cpp"], "asm": ["-c", "-x", "assembler-with-cpp"],
"c": ["-std=gnu11"], "c": ["-c", "-std=gnu11"],
"cxx": ["-std=gnu++14", "-fno-rtti", "-Wvla"], "cxx": ["-c", "-std=gnu++14", "-fno-rtti", "-Wvla"],
"ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r", "ld": ["-Wl,--gc-sections", "-Wl,--wrap,main", "-Wl,--wrap,_malloc_r",
"-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r", "-Wl,--wrap,_memalign_r", "-Wl,--wrap,_free_r", "-Wl,--wrap,_realloc_r", "-Wl,--wrap,_memalign_r",
"-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit", "-Wl,--wrap,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit",

View File

@ -17,7 +17,7 @@ limitations under the License.
import re import re
import fnmatch import fnmatch
from os.path import join, basename, splitext, dirname, exists from os.path import join, basename, splitext, dirname, exists
from os import getenv from os import getcwd, getenv
from distutils.spawn import find_executable from distutils.spawn import find_executable
from distutils.version import LooseVersion from distutils.version import LooseVersion
@ -35,6 +35,7 @@ class GCC(mbedToolchain):
GCC_RANGE = (LooseVersion("9.0.0"), LooseVersion("10.0.0")) GCC_RANGE = (LooseVersion("9.0.0"), LooseVersion("10.0.0"))
GCC_VERSION_RE = re.compile(b"\d+\.\d+\.\d+") GCC_VERSION_RE = re.compile(b"\d+\.\d+\.\d+")
DWARF_PRODUCER_RE = re.compile(r'(DW_AT_producer)(.*:\s*)(?P<producer>.*)')
def __init__(self, target, notify=None, macros=None, build_profile=None, def __init__(self, target, notify=None, macros=None, build_profile=None,
build_dir=None, coverage_patterns=None): build_dir=None, coverage_patterns=None):
@ -149,12 +150,14 @@ class GCC(mbedToolchain):
self.cppc += self.flags['cxx'] + self.flags['common'] self.cppc += self.flags['cxx'] + self.flags['common']
self.flags['ld'] += self.cpu self.flags['ld'] += self.cpu
self.ld = [join(tool_path, "arm-none-eabi-gcc")] + self.flags['ld'] self.ld = [join(tool_path, "arm-none-eabi-gcc")]
self.ld += self.flags['ld'] + self.flags['common']
self.sys_libs = ["stdc++", "supc++", "m", "c", "gcc", "nosys"] self.sys_libs = ["stdc++", "supc++", "m", "c", "gcc", "nosys"]
self.preproc = [join(tool_path, "arm-none-eabi-cpp"), "-E", "-P"] self.preproc = [join(tool_path, "arm-none-eabi-cpp"), "-E", "-P"]
self.ar = join(tool_path, "arm-none-eabi-ar") self.ar = join(tool_path, "arm-none-eabi-ar")
self.elf2bin = join(tool_path, "arm-none-eabi-objcopy") self.elf2bin = join(tool_path, "arm-none-eabi-objcopy")
self.objdump = join(tool_path, "arm-none-eabi-objdump")
self.use_distcc = (bool(getenv("DISTCC_POTENTIAL_HOSTS", False)) self.use_distcc = (bool(getenv("DISTCC_POTENTIAL_HOSTS", False))
and not getenv("MBED_DISABLE_DISTCC", False)) and not getenv("MBED_DISABLE_DISTCC", False))
@ -305,12 +308,31 @@ class GCC(mbedToolchain):
self.default_cmd(cmd) self.default_cmd(cmd)
mem_map = preproc_output mem_map = preproc_output
# NOTE: GCC_ARM_LTO_WORKAROUND
# This is a workaround for the GCC not using the strong symbols from
# C files to override the weak symbols from ASM files. This GCC bug is only
# present when building with the link-time optimizer (LTO) enabled. For
# more details please see:
# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83967
#
# This can be fixed by changing the order of object files in the linker
# command; objects providing the weak symbols and compiled from assembly
# must be listed before the objects providing the strong symbols.
# To keep things simple, ALL object files from ASM are listed before
# other object files.
asm_objects = []
if '-flto' in self.ld:
asm_objects = self.get_asm_objects(objects)
reorg_objects = (
[o for o in objects if o in asm_objects] +
[o for o in objects if o not in asm_objects]
)
# Build linker command # Build linker command
map_file = splitext(output)[0] + ".map" map_file = splitext(output)[0] + ".map"
cmd = ( cmd = (
(self.coverage_ld if self.coverage_patterns else self.ld) + (self.coverage_ld if self.coverage_patterns else self.ld) +
["-o", output, "-Wl,-Map=%s" % map_file] + ["-o", output, "-Wl,-Map=%s" % map_file] +
objects + reorg_objects +
["-Wl,--start-group"] + ["-Wl,--start-group"] +
libs + libs +
["-Wl,--end-group"] ["-Wl,--end-group"]
@ -382,6 +404,21 @@ class GCC(mbedToolchain):
exec_name = join(TOOLCHAIN_PATHS['GCC_ARM'], 'arm-none-eabi-gcc') exec_name = join(TOOLCHAIN_PATHS['GCC_ARM'], 'arm-none-eabi-gcc')
return exists(exec_name) or exists(exec_name + '.exe') return exists(exec_name) or exists(exec_name + '.exe')
def check_if_obj_from_asm(self, obj_file):
"""Check if obj_file was build by the GNU Assembler."""
dw_producer = ''
cmd = [self.objdump, '--dwarf=info', obj_file]
stdout, stderr, rc = run_cmd(cmd, work_dir=getcwd(), chroot=self.CHROOT)
if rc != 0:
return False
match = self.DWARF_PRODUCER_RE.search(stdout.encode('utf-8'))
if match:
dw_producer = match.group('producer')
return 'GNU AS' in dw_producer
def get_asm_objects(self, objects):
"""Return a list of object files built from ASM."""
return [o for o in objects if self.check_if_obj_from_asm(o)]
class GCC_ARM(GCC): class GCC_ARM(GCC):
pass pass