mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #11856 from fkjagodzinski/gcc_build-enable_lto_for_release
GCC: Add a build profile extension with the link-time optimizer enabledpull/12473/head
commit
d9becd449a
|
@ -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",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue