ST / ST_Events-old

Dependents:   HelloWorld_CCA01M1 HelloWorld_CCA02M1 CI-data-logger-server HelloWorld_CCA02M1 ... more

This is a fork of the events subdirectory of https://github.com/ARMmbed/mbed-os.

Note, you must import this library with import name: events!!!

Committer:
Jimmy Brisson
Date:
Wed Feb 01 16:22:06 2017 -0600
Revision:
9810:06c47a99234c
Parent:
9735:d72b98706fba
Child:
9811:1ab4a497e28d
Add redirect support to toolchains

We create an API for generating the linker flags needed to redirect
functions in an application

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Mihail Stoyanov 6350:fd14088de4ac 1 """
Mihail Stoyanov 6350:fd14088de4ac 2 mbed SDK
Mihail Stoyanov 6350:fd14088de4ac 3 Copyright (c) 2011-2013 ARM Limited
Mihail Stoyanov 6350:fd14088de4ac 4
Mihail Stoyanov 6350:fd14088de4ac 5 Licensed under the Apache License, Version 2.0 (the "License");
Mihail Stoyanov 6350:fd14088de4ac 6 you may not use this file except in compliance with the License.
Mihail Stoyanov 6350:fd14088de4ac 7 You may obtain a copy of the License at
Mihail Stoyanov 6350:fd14088de4ac 8
Mihail Stoyanov 6350:fd14088de4ac 9 http://www.apache.org/licenses/LICENSE-2.0
Mihail Stoyanov 6350:fd14088de4ac 10
Mihail Stoyanov 6350:fd14088de4ac 11 Unless required by applicable law or agreed to in writing, software
Mihail Stoyanov 6350:fd14088de4ac 12 distributed under the License is distributed on an "AS IS" BASIS,
Mihail Stoyanov 6350:fd14088de4ac 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Mihail Stoyanov 6350:fd14088de4ac 14 See the License for the specific language governing permissions and
Mihail Stoyanov 6350:fd14088de4ac 15 limitations under the License.
Mihail Stoyanov 6350:fd14088de4ac 16 """
Mihail Stoyanov 6350:fd14088de4ac 17 import re
Sarah Marsh 7909:8d21dcb647f6 18 from os.path import join, basename, splitext
Mihail Stoyanov 6350:fd14088de4ac 19
Mihail Stoyanov 6980:b26b840b75aa 20 from tools.toolchains import mbedToolchain, TOOLCHAIN_PATHS
Mihail Stoyanov 6350:fd14088de4ac 21 from tools.hooks import hook_tool
Mihail Stoyanov 6350:fd14088de4ac 22
Mihail Stoyanov 6350:fd14088de4ac 23 class GCC(mbedToolchain):
Mihail Stoyanov 6350:fd14088de4ac 24 LINKER_EXT = '.ld'
Mihail Stoyanov 6350:fd14088de4ac 25 LIBRARY_EXT = '.a'
Mihail Stoyanov 6350:fd14088de4ac 26
Mihail Stoyanov 6350:fd14088de4ac 27 STD_LIB_NAME = "lib%s.a"
Brian Daniels 9735:d72b98706fba 28 DIAGNOSTIC_PATTERN = re.compile('((?P<file>[^:]+):(?P<line>\d+):)(\d+:)? (?P<severity>warning|error|fatal error): (?P<message>.+)')
Mihail Stoyanov 6980:b26b840b75aa 29 INDEX_PATTERN = re.compile('(?P<col>\s*)\^')
Mihail Stoyanov 6350:fd14088de4ac 30
Jimmy Brisson 8266:b5ccac2d5e81 31 def __init__(self, target, notify=None, macros=None,
Jimmy Brisson 8264:05c56a5c7c69 32 silent=False, tool_path="", extra_verbose=False,
Jimmy Brisson 8264:05c56a5c7c69 33 build_profile=None):
Jimmy Brisson 8266:b5ccac2d5e81 34 mbedToolchain.__init__(self, target, notify, macros, silent,
Jimmy Brisson 8264:05c56a5c7c69 35 extra_verbose=extra_verbose,
Jimmy Brisson 8264:05c56a5c7c69 36 build_profile=build_profile)
Mihail Stoyanov 6350:fd14088de4ac 37
Russ Butler 8679:1471fcf83d61 38 # Add flags for current size setting
Russ Butler 8679:1471fcf83d61 39 default_lib = "std"
Russ Butler 8679:1471fcf83d61 40 if hasattr(target, "default_lib"):
Russ Butler 8679:1471fcf83d61 41 default_lib = target.default_lib
Russ Butler 8679:1471fcf83d61 42 elif hasattr(target, "default_build"): # Legacy
Russ Butler 8679:1471fcf83d61 43 default_lib = target.default_build
Russ Butler 8679:1471fcf83d61 44
Russ Butler 8679:1471fcf83d61 45 if default_lib == "small":
Russ Butler 8679:1471fcf83d61 46 self.flags["common"].append("-DMBED_RTOS_SINGLE_THREAD")
Russ Butler 8679:1471fcf83d61 47 self.flags["ld"].append("--specs=nano.specs")
Russ Butler 8679:1471fcf83d61 48
Mihail Stoyanov 6350:fd14088de4ac 49 if target.core == "Cortex-M0+":
Mihail Stoyanov 6350:fd14088de4ac 50 cpu = "cortex-m0plus"
0xc0170 6962:bf39d414c367 51 elif target.core == "Cortex-M4F":
0xc0170 6962:bf39d414c367 52 cpu = "cortex-m4"
0xc0170 6962:bf39d414c367 53 elif target.core == "Cortex-M7F":
0xc0170 6962:bf39d414c367 54 cpu = "cortex-m7"
0xc0170 6962:bf39d414c367 55 elif target.core == "Cortex-M7FD":
0xc0170 6962:bf39d414c367 56 cpu = "cortex-m7"
Mihail Stoyanov 6350:fd14088de4ac 57 else:
Mihail Stoyanov 6350:fd14088de4ac 58 cpu = target.core.lower()
Mihail Stoyanov 6350:fd14088de4ac 59
Mihail Stoyanov 6350:fd14088de4ac 60 self.cpu = ["-mcpu=%s" % cpu]
Mihail Stoyanov 6350:fd14088de4ac 61 if target.core.startswith("Cortex"):
Mihail Stoyanov 6350:fd14088de4ac 62 self.cpu.append("-mthumb")
Mihail Stoyanov 6350:fd14088de4ac 63
0xc0170 6962:bf39d414c367 64 # FPU handling, M7 possibly to have double FPU
0xc0170 6962:bf39d414c367 65 if target.core == "Cortex-M4F":
Mihail Stoyanov 6350:fd14088de4ac 66 self.cpu.append("-mfpu=fpv4-sp-d16")
Mihail Stoyanov 6350:fd14088de4ac 67 self.cpu.append("-mfloat-abi=softfp")
0xc0170 6962:bf39d414c367 68 elif target.core == "Cortex-M7F":
0xc0170 6962:bf39d414c367 69 self.cpu.append("-mfpu=fpv5-sp-d16")
0xc0170 6962:bf39d414c367 70 self.cpu.append("-mfloat-abi=softfp")
0xc0170 6962:bf39d414c367 71 elif target.core == "Cortex-M7FD":
0xc0170 6962:bf39d414c367 72 self.cpu.append("-mfpu=fpv5-d16")
0xc0170 6962:bf39d414c367 73 self.cpu.append("-mfloat-abi=softfp")
Olaf Hagendorf 6803:3ebc5419b948 74
Mihail Stoyanov 6350:fd14088de4ac 75 if target.core == "Cortex-A9":
Mihail Stoyanov 6350:fd14088de4ac 76 self.cpu.append("-mthumb-interwork")
Mihail Stoyanov 6350:fd14088de4ac 77 self.cpu.append("-marm")
Mihail Stoyanov 6350:fd14088de4ac 78 self.cpu.append("-march=armv7-a")
Mihail Stoyanov 6350:fd14088de4ac 79 self.cpu.append("-mfpu=vfpv3")
Mihail Stoyanov 6350:fd14088de4ac 80 self.cpu.append("-mfloat-abi=hard")
Mihail Stoyanov 6350:fd14088de4ac 81 self.cpu.append("-mno-unaligned-access")
Mihail Stoyanov 6350:fd14088de4ac 82
Jimmy Brisson 6401:0edea5185bb1 83 self.flags["common"] += self.cpu
Mihail Stoyanov 6350:fd14088de4ac 84
Mihail Stoyanov 6350:fd14088de4ac 85 main_cc = join(tool_path, "arm-none-eabi-gcc")
Mihail Stoyanov 6350:fd14088de4ac 86 main_cppc = join(tool_path, "arm-none-eabi-g++")
Jimmy Brisson 6401:0edea5185bb1 87 self.asm = [main_cc] + self.flags['asm'] + self.flags["common"]
Mihail Stoyanov 6980:b26b840b75aa 88 self.cc = [main_cc]
Mihail Stoyanov 6980:b26b840b75aa 89 self.cppc =[main_cppc]
Jimmy Brisson 6401:0edea5185bb1 90 self.cc += self.flags['c'] + self.flags['common']
Jimmy Brisson 6401:0edea5185bb1 91 self.cppc += self.flags['cxx'] + self.flags['common']
Mihail Stoyanov 6350:fd14088de4ac 92
Jimmy Brisson 6401:0edea5185bb1 93 self.flags['ld'] += self.cpu
Jimmy Brisson 6401:0edea5185bb1 94 self.ld = [join(tool_path, "arm-none-eabi-gcc")] + self.flags['ld']
Mihail Stoyanov 6350:fd14088de4ac 95 self.sys_libs = ["stdc++", "supc++", "m", "c", "gcc"]
Mihail Stoyanov 6350:fd14088de4ac 96
Mihail Stoyanov 6350:fd14088de4ac 97 self.ar = join(tool_path, "arm-none-eabi-ar")
Mihail Stoyanov 6350:fd14088de4ac 98 self.elf2bin = join(tool_path, "arm-none-eabi-objcopy")
Mihail Stoyanov 6350:fd14088de4ac 99
Mihail Stoyanov 6350:fd14088de4ac 100 def parse_dependencies(self, dep_path):
Mihail Stoyanov 6350:fd14088de4ac 101 dependencies = []
Mihail Stoyanov 6355:86cd49f38a3e 102 buff = open(dep_path).readlines()
Mihail Stoyanov 6355:86cd49f38a3e 103 buff[0] = re.sub('^(.*?)\: ', '', buff[0])
Mihail Stoyanov 6355:86cd49f38a3e 104 for line in buff:
Mihail Stoyanov 6350:fd14088de4ac 105 file = line.replace('\\\n', '').strip()
Mihail Stoyanov 6350:fd14088de4ac 106 if file:
Mihail Stoyanov 6350:fd14088de4ac 107 # GCC might list more than one dependency on a single line, in this case
Mihail Stoyanov 6350:fd14088de4ac 108 # the dependencies are separated by a space. However, a space might also
Mihail Stoyanov 6350:fd14088de4ac 109 # indicate an actual space character in a dependency path, but in this case
Mihail Stoyanov 6350:fd14088de4ac 110 # the space character is prefixed by a backslash.
Mihail Stoyanov 6350:fd14088de4ac 111 # Temporary replace all '\ ' with a special char that is not used (\a in this
Mihail Stoyanov 6350:fd14088de4ac 112 # case) to keep them from being interpreted by 'split' (they will be converted
Mihail Stoyanov 6350:fd14088de4ac 113 # back later to a space char)
Mihail Stoyanov 6350:fd14088de4ac 114 file = file.replace('\\ ', '\a')
Mihail Stoyanov 6350:fd14088de4ac 115 if file.find(" ") == -1:
Mihail Stoyanov 6980:b26b840b75aa 116 dependencies.append((self.CHROOT if self.CHROOT else '') + file.replace('\a', ' '))
Mihail Stoyanov 6350:fd14088de4ac 117 else:
Mihail Stoyanov 6980:b26b840b75aa 118 dependencies = dependencies + [(self.CHROOT if self.CHROOT else '') + f.replace('\a', ' ') for f in file.split(" ")]
Mihail Stoyanov 6350:fd14088de4ac 119 return dependencies
Mihail Stoyanov 6350:fd14088de4ac 120
Mihail Stoyanov 6350:fd14088de4ac 121 def is_not_supported_error(self, output):
Mihail Stoyanov 6350:fd14088de4ac 122 return "error: #error [NOT_SUPPORTED]" in output
Mihail Stoyanov 6350:fd14088de4ac 123
Mihail Stoyanov 6350:fd14088de4ac 124 def parse_output(self, output):
Mihail Stoyanov 6350:fd14088de4ac 125 # The warning/error notification is multiline
Mihail Stoyanov 6980:b26b840b75aa 126 msg = None
Mihail Stoyanov 6350:fd14088de4ac 127 for line in output.splitlines():
Brian Daniels 7510:0446c506f41a 128 match = GCC.DIAGNOSTIC_PATTERN.search(line)
Mihail Stoyanov 6359:00ee81ac1c20 129 if match is not None:
Mihail Stoyanov 6980:b26b840b75aa 130 if msg is not None:
Mihail Stoyanov 6980:b26b840b75aa 131 self.cc_info(msg)
Brian Daniels 8285:d88fab74071c 132 msg = None
Mihail Stoyanov 6980:b26b840b75aa 133 msg = {
Mihail Stoyanov 6980:b26b840b75aa 134 'severity': match.group('severity').lower(),
Mihail Stoyanov 6980:b26b840b75aa 135 'file': match.group('file'),
Mihail Stoyanov 6980:b26b840b75aa 136 'line': match.group('line'),
Mihail Stoyanov 6980:b26b840b75aa 137 'col': 0,
Mihail Stoyanov 6980:b26b840b75aa 138 'message': match.group('message'),
Mihail Stoyanov 6980:b26b840b75aa 139 'text': '',
Mihail Stoyanov 6980:b26b840b75aa 140 'target_name': self.target.name,
Mihail Stoyanov 6980:b26b840b75aa 141 'toolchain_name': self.name
Mihail Stoyanov 6980:b26b840b75aa 142 }
Mihail Stoyanov 6980:b26b840b75aa 143 elif msg is not None:
Mihail Stoyanov 6981:0381c344fb94 144 # Determine the warning/error column by calculating the ^ position
Mihail Stoyanov 6980:b26b840b75aa 145 match = GCC.INDEX_PATTERN.match(line)
Mihail Stoyanov 6980:b26b840b75aa 146 if match is not None:
Mihail Stoyanov 6980:b26b840b75aa 147 msg['col'] = len(match.group('col'))
Mihail Stoyanov 6980:b26b840b75aa 148 self.cc_info(msg)
Mihail Stoyanov 6980:b26b840b75aa 149 msg = None
Mihail Stoyanov 6980:b26b840b75aa 150 else:
Mihail Stoyanov 6980:b26b840b75aa 151 msg['text'] += line+"\n"
Mihail Stoyanov 6350:fd14088de4ac 152
Brian Daniels 8285:d88fab74071c 153 if msg is not None:
Brian Daniels 8285:d88fab74071c 154 self.cc_info(msg)
Brian Daniels 8285:d88fab74071c 155
Mihail Stoyanov 6355:86cd49f38a3e 156 def get_dep_option(self, object):
Mihail Stoyanov 6355:86cd49f38a3e 157 base, _ = splitext(object)
Mihail Stoyanov 6355:86cd49f38a3e 158 dep_path = base + '.d'
Mihail Stoyanov 6355:86cd49f38a3e 159 return ["-MD", "-MF", dep_path]
Mihail Stoyanov 6355:86cd49f38a3e 160
Jimmy Brisson 6639:7310555173f0 161 def get_config_option(self, config_header):
Jimmy Brisson 6639:7310555173f0 162 return ['-include', config_header]
Jimmy Brisson 6639:7310555173f0 163
Mihail Stoyanov 7371:4c352cc17ba8 164 def get_compile_options(self, defines, includes, for_asm=False):
Mihail Stoyanov 6980:b26b840b75aa 165 opts = ['-D%s' % d for d in defines]
Mihail Stoyanov 6980:b26b840b75aa 166 if self.RESPONSE_FILES:
Mihail Stoyanov 6980:b26b840b75aa 167 opts += ['@%s' % self.get_inc_file(includes)]
Mihail Stoyanov 6980:b26b840b75aa 168 else:
Mihail Stoyanov 6980:b26b840b75aa 169 opts += ["-I%s" % i for i in includes]
Mihail Stoyanov 6980:b26b840b75aa 170
Mihail Stoyanov 7371:4c352cc17ba8 171 if not for_asm:
Mihail Stoyanov 7371:4c352cc17ba8 172 config_header = self.get_config_header()
Mihail Stoyanov 7371:4c352cc17ba8 173 if config_header is not None:
Mihail Stoyanov 7371:4c352cc17ba8 174 opts = opts + self.get_config_option(config_header)
Bogdan Marinescu 6530:98ce08655513 175 return opts
Mihail Stoyanov 6355:86cd49f38a3e 176
Mihail Stoyanov 6355:86cd49f38a3e 177 @hook_tool
Mihail Stoyanov 6355:86cd49f38a3e 178 def assemble(self, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 179 # Build assemble command
Mihail Stoyanov 7371:4c352cc17ba8 180 cmd = self.asm + self.get_compile_options(self.get_symbols(True), includes) + ["-o", object, source]
Mihail Stoyanov 6355:86cd49f38a3e 181
Mihail Stoyanov 6355:86cd49f38a3e 182 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 183 cmd = self.hook.get_cmdline_assembler(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 184
Mihail Stoyanov 6355:86cd49f38a3e 185 # Return command array, don't execute
Mihail Stoyanov 6355:86cd49f38a3e 186 return [cmd]
Mihail Stoyanov 6350:fd14088de4ac 187
Mihail Stoyanov 6355:86cd49f38a3e 188 @hook_tool
Mihail Stoyanov 6355:86cd49f38a3e 189 def compile(self, cc, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 190 # Build compile command
Mihail Stoyanov 6355:86cd49f38a3e 191 cmd = cc + self.get_compile_options(self.get_symbols(), includes)
Mihail Stoyanov 6355:86cd49f38a3e 192
Mihail Stoyanov 6355:86cd49f38a3e 193 cmd.extend(self.get_dep_option(object))
Mihail Stoyanov 6355:86cd49f38a3e 194
Mihail Stoyanov 6355:86cd49f38a3e 195 cmd.extend(["-o", object, source])
Vincenzo Frascino 6393:b4fa50caddef 196
Mihail Stoyanov 6355:86cd49f38a3e 197 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 198 cmd = self.hook.get_cmdline_compiler(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 199
Mihail Stoyanov 6355:86cd49f38a3e 200 return [cmd]
Mihail Stoyanov 6355:86cd49f38a3e 201
Mihail Stoyanov 6355:86cd49f38a3e 202 def compile_c(self, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 203 return self.compile(self.cc, source, object, includes)
Mihail Stoyanov 6355:86cd49f38a3e 204
Mihail Stoyanov 6355:86cd49f38a3e 205 def compile_cpp(self, source, object, includes):
Mihail Stoyanov 6355:86cd49f38a3e 206 return self.compile(self.cppc, source, object, includes)
Mihail Stoyanov 6355:86cd49f38a3e 207
Mihail Stoyanov 6355:86cd49f38a3e 208 @hook_tool
Mihail Stoyanov 6350:fd14088de4ac 209 def link(self, output, objects, libraries, lib_dirs, mem_map):
Mihail Stoyanov 6350:fd14088de4ac 210 libs = []
Mihail Stoyanov 6350:fd14088de4ac 211 for l in libraries:
Mihail Stoyanov 6350:fd14088de4ac 212 name, _ = splitext(basename(l))
Mihail Stoyanov 6350:fd14088de4ac 213 libs.append("-l%s" % name[3:])
Mihail Stoyanov 6350:fd14088de4ac 214 libs.extend(["-l%s" % l for l in self.sys_libs])
Vincenzo Frascino 6393:b4fa50caddef 215
Mihail Stoyanov 6355:86cd49f38a3e 216 # Build linker command
Mihail Stoyanov 6355:86cd49f38a3e 217 map_file = splitext(output)[0] + ".map"
Mihail Stoyanov 6355:86cd49f38a3e 218 cmd = self.ld + ["-o", output, "-Wl,-Map=%s" % map_file] + objects + ["-Wl,--start-group"] + libs + ["-Wl,--end-group"]
Mihail Stoyanov 6355:86cd49f38a3e 219 if mem_map:
Mihail Stoyanov 6355:86cd49f38a3e 220 cmd.extend(['-T', mem_map])
Vincenzo Frascino 6393:b4fa50caddef 221
Mihail Stoyanov 6355:86cd49f38a3e 222 for L in lib_dirs:
Mihail Stoyanov 6355:86cd49f38a3e 223 cmd.extend(['-L', L])
Mihail Stoyanov 6355:86cd49f38a3e 224 cmd.extend(libs)
Mihail Stoyanov 6350:fd14088de4ac 225
Mihail Stoyanov 6355:86cd49f38a3e 226 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 227 cmd = self.hook.get_cmdline_linker(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 228
Mihail Stoyanov 6980:b26b840b75aa 229 if self.RESPONSE_FILES:
Mihail Stoyanov 6980:b26b840b75aa 230 # Split link command to linker executable + response file
Mihail Stoyanov 6355:86cd49f38a3e 231 cmd_linker = cmd[0]
Mihail Stoyanov 6980:b26b840b75aa 232 link_files = self.get_link_file(cmd[1:])
Mihail Stoyanov 6980:b26b840b75aa 233 cmd = [cmd_linker, "@%s" % link_files]
Mihail Stoyanov 6355:86cd49f38a3e 234
Mihail Stoyanov 6355:86cd49f38a3e 235 # Exec command
Mihail Stoyanov 6980:b26b840b75aa 236 self.cc_verbose("Link: %s" % ' '.join(cmd))
Mihail Stoyanov 6980:b26b840b75aa 237 self.default_cmd(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 238
Mihail Stoyanov 6355:86cd49f38a3e 239 @hook_tool
Mihail Stoyanov 6355:86cd49f38a3e 240 def archive(self, objects, lib_path):
Mihail Stoyanov 6980:b26b840b75aa 241 if self.RESPONSE_FILES:
Mihail Stoyanov 6980:b26b840b75aa 242 param = ["@%s" % self.get_arch_file(objects)]
Mihail Stoyanov 6980:b26b840b75aa 243 else:
Mihail Stoyanov 6980:b26b840b75aa 244 param = objects
Mihail Stoyanov 6355:86cd49f38a3e 245
Mihail Stoyanov 6355:86cd49f38a3e 246 # Exec command
Mihail Stoyanov 6980:b26b840b75aa 247 self.default_cmd([self.ar, 'rcs', lib_path] + param)
Mihail Stoyanov 6350:fd14088de4ac 248
Mihail Stoyanov 6350:fd14088de4ac 249 @hook_tool
Mihail Stoyanov 6350:fd14088de4ac 250 def binary(self, resources, elf, bin):
Mihail Stoyanov 6355:86cd49f38a3e 251 # Build binary command
Mihail Stoyanov 6355:86cd49f38a3e 252 cmd = [self.elf2bin, "-O", "binary", elf, bin]
Mihail Stoyanov 6355:86cd49f38a3e 253
Mihail Stoyanov 6355:86cd49f38a3e 254 # Call cmdline hook
Mihail Stoyanov 6355:86cd49f38a3e 255 cmd = self.hook.get_cmdline_binary(cmd)
Mihail Stoyanov 6355:86cd49f38a3e 256
Mihail Stoyanov 6355:86cd49f38a3e 257 # Exec command
Mihail Stoyanov 6980:b26b840b75aa 258 self.cc_verbose("FromELF: %s" % ' '.join(cmd))
Mihail Stoyanov 6355:86cd49f38a3e 259 self.default_cmd(cmd)
Mihail Stoyanov 6350:fd14088de4ac 260
Jimmy Brisson 9810:06c47a99234c 261 @staticmethod
Jimmy Brisson 9810:06c47a99234c 262 def name_mangle(name):
Jimmy Brisson 9810:06c47a99234c 263 return "_Z%i%sv" % (len(name), name)
Jimmy Brisson 9810:06c47a99234c 264
Jimmy Brisson 9810:06c47a99234c 265 @staticmethod
Jimmy Brisson 9810:06c47a99234c 266 def make_ld_define(name, value):
Jimmy Brisson 9810:06c47a99234c 267 return "-D%s=0x%x" % (name, value)
Jimmy Brisson 9810:06c47a99234c 268
Jimmy Brisson 9810:06c47a99234c 269 @staticmethod
Jimmy Brisson 9810:06c47a99234c 270 def redirect_symbol(source, sync, build_dir):
Jimmy Brisson 9810:06c47a99234c 271 return "-Wl,--defsym=%s=%s" % (source, sync)
Jimmy Brisson 9810:06c47a99234c 272
Mihail Stoyanov 6350:fd14088de4ac 273
Mihail Stoyanov 6350:fd14088de4ac 274 class GCC_ARM(GCC):
Sarah Marsh 7907:36a6ad9af387 275 @staticmethod
Sarah Marsh 7907:36a6ad9af387 276 def check_executable():
Sarah Marsh 7908:0f6ef9835afc 277 """Returns True if the executable (arm-none-eabi-gcc) location
Sarah Marsh 7908:0f6ef9835afc 278 specified by the user exists OR the executable can be found on the PATH.
Sarah Marsh 7908:0f6ef9835afc 279 Returns False otherwise."""
Sarah Marsh 7909:8d21dcb647f6 280 return mbedToolchain.generic_check_executable("GCC_ARM", 'arm-none-eabi-gcc', 1)
Sarah Marsh 7907:36a6ad9af387 281
Jimmy Brisson 8266:b5ccac2d5e81 282 def __init__(self, target, notify=None, macros=None,
Jimmy Brisson 8264:05c56a5c7c69 283 silent=False, extra_verbose=False, build_profile=None):
Jimmy Brisson 8266:b5ccac2d5e81 284 GCC.__init__(self, target, notify, macros, silent,
Jimmy Brisson 8264:05c56a5c7c69 285 TOOLCHAIN_PATHS['GCC_ARM'], extra_verbose=extra_verbose,
Jimmy Brisson 8264:05c56a5c7c69 286 build_profile=build_profile)
Mihail Stoyanov 6350:fd14088de4ac 287
Mihail Stoyanov 6350:fd14088de4ac 288 self.sys_libs.append("nosys")
Mihail Stoyanov 6350:fd14088de4ac 289
Mihail Stoyanov 6350:fd14088de4ac 290
Mihail Stoyanov 6350:fd14088de4ac 291 class GCC_CR(GCC):
Sarah Marsh 7907:36a6ad9af387 292 @staticmethod
Sarah Marsh 7907:36a6ad9af387 293 def check_executable():
Sarah Marsh 7908:0f6ef9835afc 294 """Returns True if the executable (arm-none-eabi-gcc) location
Sarah Marsh 7908:0f6ef9835afc 295 specified by the user exists OR the executable can be found on the PATH.
Sarah Marsh 7908:0f6ef9835afc 296 Returns False otherwise."""
Sarah Marsh 7909:8d21dcb647f6 297 return mbedToolchain.generic_check_executable("GCC_CR", 'arm-none-eabi-gcc', 1)
Sarah Marsh 7907:36a6ad9af387 298
Jimmy Brisson 8266:b5ccac2d5e81 299 def __init__(self, target, notify=None, macros=None,
Jimmy Brisson 8264:05c56a5c7c69 300 silent=False, extra_verbose=False, build_profile=None):
Jimmy Brisson 8266:b5ccac2d5e81 301 GCC.__init__(self, target, notify, macros, silent,
Jimmy Brisson 8264:05c56a5c7c69 302 TOOLCHAIN_PATHS['GCC_CR'], extra_verbose=extra_verbose,
Jimmy Brisson 8264:05c56a5c7c69 303 build_profile=build_profile)
Mihail Stoyanov 6350:fd14088de4ac 304
Mihail Stoyanov 6350:fd14088de4ac 305 additional_compiler_flags = [
Mihail Stoyanov 6350:fd14088de4ac 306 "-D__NEWLIB__", "-D__CODE_RED", "-D__USE_CMSIS", "-DCPP_USE_HEAP",
Mihail Stoyanov 6350:fd14088de4ac 307 ]
Mihail Stoyanov 6350:fd14088de4ac 308 self.cc += additional_compiler_flags
Mihail Stoyanov 6350:fd14088de4ac 309 self.cppc += additional_compiler_flags
Mihail Stoyanov 6350:fd14088de4ac 310
Mihail Stoyanov 6350:fd14088de4ac 311 # Use latest gcc nanolib
Mihail Stoyanov 6350:fd14088de4ac 312 self.ld.append("--specs=nano.specs")
Mihail Stoyanov 6350:fd14088de4ac 313 if target.name in ["LPC1768", "LPC4088", "LPC4088_DM", "LPC4330", "UBLOX_C027", "LPC2368"]:
Mihail Stoyanov 6350:fd14088de4ac 314 self.ld.extend(["-u _printf_float", "-u _scanf_float"])
Mihail Stoyanov 6350:fd14088de4ac 315 self.ld += ["-nostdlib"]