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": {
 | 
			
		||||
        "common": ["-c", "-Wall", "-Wextra",
 | 
			
		||||
        "common": ["-Wall", "-Wextra",
 | 
			
		||||
                   "-Wno-unused-parameter", "-Wno-missing-field-initializers",
 | 
			
		||||
                   "-fmessage-length=0", "-fno-exceptions",
 | 
			
		||||
                   "-ffunction-sections", "-fdata-sections", "-funsigned-char",
 | 
			
		||||
                   "-MMD",
 | 
			
		||||
                   "-fomit-frame-pointer", "-Og", "-g3", "-DMBED_DEBUG",
 | 
			
		||||
                   "-fomit-frame-pointer", "-Og", "-DMBED_DEBUG",
 | 
			
		||||
                   "-DMBED_TRAP_ERRORS_ENABLED=1"],
 | 
			
		||||
        "asm": ["-x", "assembler-with-cpp"],
 | 
			
		||||
        "c": ["-std=gnu11"],
 | 
			
		||||
        "cxx": ["-std=gnu++14", "-fno-rtti", "-Wvla"],
 | 
			
		||||
        "asm": ["-c", "-g3", "-x", "assembler-with-cpp"],
 | 
			
		||||
        "c": ["-c", "-g3", "-std=gnu11"],
 | 
			
		||||
        "cxx": ["-c", "-g3", "-std=gnu++14", "-fno-rtti", "-Wvla"],
 | 
			
		||||
        "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,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
{
 | 
			
		||||
    "GCC_ARM": {
 | 
			
		||||
        "common": ["-c", "-Wall", "-Wextra",
 | 
			
		||||
        "common": ["-Wall", "-Wextra",
 | 
			
		||||
                   "-Wno-unused-parameter", "-Wno-missing-field-initializers",
 | 
			
		||||
                   "-fmessage-length=0", "-fno-exceptions",
 | 
			
		||||
                   "-ffunction-sections", "-fdata-sections", "-funsigned-char",
 | 
			
		||||
                   "-MMD",
 | 
			
		||||
                   "-fomit-frame-pointer", "-Os", "-g", "-DMBED_TRAP_ERRORS_ENABLED=1"],
 | 
			
		||||
        "asm": ["-x", "assembler-with-cpp"],
 | 
			
		||||
        "c": ["-std=gnu11"],
 | 
			
		||||
        "cxx": ["-std=gnu++14", "-fno-rtti", "-Wvla"],
 | 
			
		||||
        "asm": ["-c", "-x", "assembler-with-cpp"],
 | 
			
		||||
        "c": ["-c", "-std=gnu11"],
 | 
			
		||||
        "cxx": ["-c", "-std=gnu++14", "-fno-rtti", "-Wvla"],
 | 
			
		||||
        "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,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,5 +2,9 @@
 | 
			
		|||
    "ARMC6": {
 | 
			
		||||
        "common": ["-flto"],
 | 
			
		||||
        "ld": ["--lto", "--lto_level=Oz"]
 | 
			
		||||
    },
 | 
			
		||||
    "GCC_ARM": {
 | 
			
		||||
        "common": ["-flto"],
 | 
			
		||||
        "ld": ["-u main"]
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
{
 | 
			
		||||
    "GCC_ARM": {
 | 
			
		||||
        "common": ["-c", "-Wall", "-Wextra",
 | 
			
		||||
        "common": ["-Wall", "-Wextra",
 | 
			
		||||
                   "-Wno-unused-parameter", "-Wno-missing-field-initializers",
 | 
			
		||||
                   "-fmessage-length=0", "-fno-exceptions",
 | 
			
		||||
                   "-ffunction-sections", "-fdata-sections", "-funsigned-char",
 | 
			
		||||
                   "-MMD",
 | 
			
		||||
                   "-fomit-frame-pointer", "-Os", "-DNDEBUG", "-g"],
 | 
			
		||||
        "asm": ["-x", "assembler-with-cpp"],
 | 
			
		||||
        "c": ["-std=gnu11"],
 | 
			
		||||
        "cxx": ["-std=gnu++14", "-fno-rtti", "-Wvla"],
 | 
			
		||||
        "asm": ["-c", "-x", "assembler-with-cpp"],
 | 
			
		||||
        "c": ["-c", "-std=gnu11"],
 | 
			
		||||
        "cxx": ["-c", "-std=gnu++14", "-fno-rtti", "-Wvla"],
 | 
			
		||||
        "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,_calloc_r", "-Wl,--wrap,exit", "-Wl,--wrap,atexit",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -17,7 +17,7 @@ limitations under the License.
 | 
			
		|||
import re
 | 
			
		||||
import fnmatch
 | 
			
		||||
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.version import LooseVersion
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +35,7 @@ class GCC(mbedToolchain):
 | 
			
		|||
 | 
			
		||||
    GCC_RANGE = (LooseVersion("9.0.0"), LooseVersion("10.0.0"))
 | 
			
		||||
    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,
 | 
			
		||||
                 build_dir=None, coverage_patterns=None):
 | 
			
		||||
| 
						 | 
				
			
			@ -149,12 +150,14 @@ class GCC(mbedToolchain):
 | 
			
		|||
        self.cppc += self.flags['cxx'] + self.flags['common']
 | 
			
		||||
 | 
			
		||||
        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.preproc = [join(tool_path, "arm-none-eabi-cpp"), "-E", "-P"]
 | 
			
		||||
 | 
			
		||||
        self.ar = join(tool_path, "arm-none-eabi-ar")
 | 
			
		||||
        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))
 | 
			
		||||
                           and not getenv("MBED_DISABLE_DISTCC", False))
 | 
			
		||||
| 
						 | 
				
			
			@ -305,12 +308,31 @@ class GCC(mbedToolchain):
 | 
			
		|||
            self.default_cmd(cmd)
 | 
			
		||||
            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
 | 
			
		||||
        map_file = splitext(output)[0] + ".map"
 | 
			
		||||
        cmd = (
 | 
			
		||||
            (self.coverage_ld if self.coverage_patterns else self.ld) +
 | 
			
		||||
            ["-o", output, "-Wl,-Map=%s" % map_file] +
 | 
			
		||||
            objects +
 | 
			
		||||
            reorg_objects +
 | 
			
		||||
            ["-Wl,--start-group"] +
 | 
			
		||||
            libs +
 | 
			
		||||
            ["-Wl,--end-group"]
 | 
			
		||||
| 
						 | 
				
			
			@ -382,6 +404,21 @@ class GCC(mbedToolchain):
 | 
			
		|||
            exec_name = join(TOOLCHAIN_PATHS['GCC_ARM'], 'arm-none-eabi-gcc')
 | 
			
		||||
            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):
 | 
			
		||||
    pass
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue