Alessandro Angelino / mbed-tools

Fork of mbed-tools by Morpheus

Committer:
Alessandro Angelino
Date:
Tue Apr 05 17:23:39 2016 +0100
Revision:
12:fd03da96c01a
Parent:
2:5f044fef8f98
Disable the FPU only if UVISOR_PRESENT=1 is defined

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:4a2e5f0422d6 1 """
screamer 0:4a2e5f0422d6 2 mbed SDK
screamer 0:4a2e5f0422d6 3 Copyright (c) 2011-2013 ARM Limited
screamer 0:4a2e5f0422d6 4
screamer 0:4a2e5f0422d6 5 Licensed under the Apache License, Version 2.0 (the "License");
screamer 0:4a2e5f0422d6 6 you may not use this file except in compliance with the License.
screamer 0:4a2e5f0422d6 7 You may obtain a copy of the License at
screamer 0:4a2e5f0422d6 8
screamer 0:4a2e5f0422d6 9 http://www.apache.org/licenses/LICENSE-2.0
screamer 0:4a2e5f0422d6 10
screamer 0:4a2e5f0422d6 11 Unless required by applicable law or agreed to in writing, software
screamer 0:4a2e5f0422d6 12 distributed under the License is distributed on an "AS IS" BASIS,
screamer 0:4a2e5f0422d6 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
screamer 0:4a2e5f0422d6 14 See the License for the specific language governing permissions and
screamer 0:4a2e5f0422d6 15 limitations under the License.
screamer 0:4a2e5f0422d6 16 """
screamer 0:4a2e5f0422d6 17 import re
screamer 0:4a2e5f0422d6 18 from os import remove
screamer 0:4a2e5f0422d6 19 from os.path import join, exists
screamer 0:4a2e5f0422d6 20
screamer 2:5f044fef8f98 21 from tools.toolchains import mbedToolchain
screamer 2:5f044fef8f98 22 from tools.settings import IAR_PATH
screamer 2:5f044fef8f98 23 from tools.settings import GOANNA_PATH
screamer 2:5f044fef8f98 24 from tools.hooks import hook_tool
screamer 0:4a2e5f0422d6 25
screamer 0:4a2e5f0422d6 26 class IAR(mbedToolchain):
screamer 0:4a2e5f0422d6 27 LIBRARY_EXT = '.a'
screamer 0:4a2e5f0422d6 28 LINKER_EXT = '.icf'
screamer 0:4a2e5f0422d6 29 STD_LIB_NAME = "%s.a"
screamer 0:4a2e5f0422d6 30
screamer 0:4a2e5f0422d6 31 DIAGNOSTIC_PATTERN = re.compile('"(?P<file>[^"]+)",(?P<line>[\d]+)\s+(?P<severity>Warning|Error)(?P<message>.+)')
screamer 0:4a2e5f0422d6 32
screamer 0:4a2e5f0422d6 33 def __init__(self, target, options=None, notify=None, macros=None, silent=False, extra_verbose=False):
screamer 0:4a2e5f0422d6 34 mbedToolchain.__init__(self, target, options, notify, macros, silent, extra_verbose=extra_verbose)
screamer 0:4a2e5f0422d6 35 if target.core == "Cortex-M7F":
screamer 0:4a2e5f0422d6 36 cpuchoice = "Cortex-M7"
screamer 0:4a2e5f0422d6 37 else:
screamer 0:4a2e5f0422d6 38 cpuchoice = target.core
screamer 0:4a2e5f0422d6 39 c_flags = [
screamer 0:4a2e5f0422d6 40 "--cpu=%s" % cpuchoice, "--thumb",
screamer 0:4a2e5f0422d6 41 "--dlib_config", join(IAR_PATH, "inc", "c", "DLib_Config_Full.h"),
screamer 0:4a2e5f0422d6 42 "-e", # Enable IAR language extension
screamer 0:4a2e5f0422d6 43 "--no_wrap_diagnostics",
screamer 0:4a2e5f0422d6 44 # Pa050: No need to be notified about "non-native end of line sequence"
screamer 0:4a2e5f0422d6 45 # Pa084: Pointless integer comparison -> checks for the values of an enum, but we use values outside of the enum to notify errors (ie: NC).
screamer 0:4a2e5f0422d6 46 # Pa093: Implicit conversion from float to integer (ie: wait_ms(85.4) -> wait_ms(85))
screamer 0:4a2e5f0422d6 47 # Pa082: Operation involving two values from two registers (ie: (float)(*obj->MR)/(float)(LPC_PWM1->MR0))
screamer 0:4a2e5f0422d6 48 "--diag_suppress=Pa050,Pa084,Pa093,Pa082",
screamer 0:4a2e5f0422d6 49 ]
screamer 0:4a2e5f0422d6 50
screamer 0:4a2e5f0422d6 51 if target.core == "Cortex-M7F":
screamer 0:4a2e5f0422d6 52 c_flags.append("--fpu=VFPv5_sp")
screamer 0:4a2e5f0422d6 53
screamer 0:4a2e5f0422d6 54
screamer 0:4a2e5f0422d6 55 if "debug-info" in self.options:
screamer 0:4a2e5f0422d6 56 c_flags.append("-r")
screamer 0:4a2e5f0422d6 57 c_flags.append("-On")
screamer 0:4a2e5f0422d6 58 else:
screamer 0:4a2e5f0422d6 59 c_flags.append("-Oh")
screamer 0:4a2e5f0422d6 60
screamer 0:4a2e5f0422d6 61 IAR_BIN = join(IAR_PATH, "bin")
screamer 0:4a2e5f0422d6 62 main_cc = join(IAR_BIN, "iccarm")
screamer 0:4a2e5f0422d6 63 self.asm = [join(IAR_BIN, "iasmarm")] + ["--cpu", cpuchoice]
screamer 0:4a2e5f0422d6 64 if not "analyze" in self.options:
screamer 0:4a2e5f0422d6 65 self.cc = [main_cc] + c_flags
screamer 0:4a2e5f0422d6 66 self.cppc = [main_cc, "--c++", "--no_rtti", "--no_exceptions"] + c_flags
screamer 0:4a2e5f0422d6 67 else:
screamer 0:4a2e5f0422d6 68 self.cc = [join(GOANNA_PATH, "goannacc"), '--with-cc="%s"' % main_cc.replace('\\', '/'), "--dialect=iar-arm", '--output-format="%s"' % self.GOANNA_FORMAT] + c_flags
screamer 0:4a2e5f0422d6 69 self.cppc = [join(GOANNA_PATH, "goannac++"), '--with-cxx="%s"' % main_cc.replace('\\', '/'), "--dialect=iar-arm", '--output-format="%s"' % self.GOANNA_FORMAT] + ["--c++", "--no_rtti", "--no_exceptions"] + c_flags
screamer 0:4a2e5f0422d6 70 self.ld = join(IAR_BIN, "ilinkarm")
screamer 0:4a2e5f0422d6 71 self.ar = join(IAR_BIN, "iarchive")
screamer 0:4a2e5f0422d6 72 self.elf2bin = join(IAR_BIN, "ielftool")
screamer 0:4a2e5f0422d6 73
screamer 0:4a2e5f0422d6 74 def parse_output(self, output):
screamer 0:4a2e5f0422d6 75 for line in output.splitlines():
screamer 0:4a2e5f0422d6 76 match = IAR.DIAGNOSTIC_PATTERN.match(line)
screamer 0:4a2e5f0422d6 77 if match is not None:
screamer 0:4a2e5f0422d6 78 self.cc_info(
screamer 0:4a2e5f0422d6 79 match.group('severity').lower(),
screamer 0:4a2e5f0422d6 80 match.group('file'),
screamer 0:4a2e5f0422d6 81 match.group('line'),
screamer 0:4a2e5f0422d6 82 match.group('message'),
screamer 0:4a2e5f0422d6 83 target_name=self.target.name,
screamer 0:4a2e5f0422d6 84 toolchain_name=self.name
screamer 0:4a2e5f0422d6 85 )
screamer 0:4a2e5f0422d6 86 match = self.goanna_parse_line(line)
screamer 0:4a2e5f0422d6 87 if match is not None:
screamer 0:4a2e5f0422d6 88 self.cc_info(
screamer 0:4a2e5f0422d6 89 match.group('severity').lower(),
screamer 0:4a2e5f0422d6 90 match.group('file'),
screamer 0:4a2e5f0422d6 91 match.group('line'),
screamer 0:4a2e5f0422d6 92 match.group('message')
screamer 0:4a2e5f0422d6 93 )
screamer 0:4a2e5f0422d6 94
screamer 0:4a2e5f0422d6 95 def get_dep_opt(self, dep_path):
screamer 0:4a2e5f0422d6 96 return ["--dependencies", dep_path]
screamer 0:4a2e5f0422d6 97
screamer 0:4a2e5f0422d6 98 def cc_extra(self, base):
screamer 0:4a2e5f0422d6 99 return ["-l", base + '.s']
screamer 0:4a2e5f0422d6 100
screamer 0:4a2e5f0422d6 101 def parse_dependencies(self, dep_path):
screamer 0:4a2e5f0422d6 102 return [path.strip() for path in open(dep_path).readlines()
screamer 0:4a2e5f0422d6 103 if (path and not path.isspace())]
screamer 0:4a2e5f0422d6 104
screamer 0:4a2e5f0422d6 105 def assemble(self, source, object, includes):
screamer 0:4a2e5f0422d6 106 return [self.hook.get_cmdline_assembler(self.asm + ['-D%s' % s for s in self.get_symbols() + self.macros] + ["-I%s" % i for i in includes] + ["-o", object, source])]
screamer 0:4a2e5f0422d6 107
screamer 0:4a2e5f0422d6 108 def archive(self, objects, lib_path):
screamer 0:4a2e5f0422d6 109 if exists(lib_path):
screamer 0:4a2e5f0422d6 110 remove(lib_path)
screamer 0:4a2e5f0422d6 111 self.default_cmd([self.ar, lib_path] + objects)
screamer 0:4a2e5f0422d6 112
screamer 0:4a2e5f0422d6 113 def link(self, output, objects, libraries, lib_dirs, mem_map):
screamer 0:4a2e5f0422d6 114 args = [self.ld, "-o", output, "--config", mem_map, "--skip_dynamic_initialization"]
screamer 0:4a2e5f0422d6 115 self.default_cmd(self.hook.get_cmdline_linker(args + objects + libraries))
screamer 0:4a2e5f0422d6 116
screamer 0:4a2e5f0422d6 117 @hook_tool
screamer 0:4a2e5f0422d6 118 def binary(self, resources, elf, bin):
screamer 0:4a2e5f0422d6 119 self.default_cmd(self.hook.get_cmdline_binary([self.elf2bin, '--bin', elf, bin]))