diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2021-01-28 12:15:22 +0300 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2021-01-29 07:27:38 +0000 |
commit | a10cb7f9e999268e1c798420df9554f82a04454b (patch) | |
tree | 6d1ad3d59808ec620c40bf87295dfe8d01e73ab9 | |
parent | 9a45ce1b66cddbf09801527c05457bcc994ee96e (diff) |
baremetal: Improve JS code in IAR toolchain module
This patch is a small refactoring in the cpp module for IAR,
containing the following changes:
1. Alphabetical sorting by architectures and compiler names
has been performed.
2. Some common logical parts are divided into separate functions.
3. Improved logic for checking compilers for supported options
depending on the architecture.
Also, the command line options of toolchains have been rechecked
for all supported architectures.
Change-Id: I5d274240682cb16c073d146ce47541d10783738f
Reviewed-by: Ivan Komissarov <ABBAPOH@gmail.com>
-rw-r--r-- | share/qbs/modules/cpp/iar.js | 436 |
1 files changed, 265 insertions, 171 deletions
diff --git a/share/qbs/modules/cpp/iar.js b/share/qbs/modules/cpp/iar.js index 2e44a2514..6d79a1ee3 100644 --- a/share/qbs/modules/cpp/iar.js +++ b/share/qbs/modules/cpp/iar.js @@ -38,37 +38,138 @@ var TemporaryDir = require("qbs.TemporaryDir"); var TextFile = require("qbs.TextFile"); function supportXLinker(architecture) { - return architecture === "78k" || architecture === "avr" - || architecture === "avr32" || architecture === "mcs51" - || architecture === "msp430" || architecture === "v850" - || architecture === "m68k" || architecture === "m32c" - || architecture === "r32c" || architecture === "m16c" - || architecture === "cr16" || architecture === "hcs12" - || architecture === "hcs8"; + return architecture === "78k" + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs12" + || architecture === "hcs8" + || architecture === "m16c" + || architecture === "m32c" + || architecture === "m68k" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "r32c" + || architecture === "v850"; } function supportILinker(architecture) { return architecture.startsWith("arm") - || architecture === "rh850" || architecture === "rl78" - || architecture === "rx" || architecture === "stm8" - || architecture === "sh" || architecture === "riscv"; + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8"; } function supportXArchiver(architecture) { - return architecture === "mcs51" || architecture === "avr" - || architecture === "msp430" || architecture === "v850" - || architecture === "78k" || architecture === "avr32" - || architecture === "m68k" || architecture === "m32c" - || architecture === "r32c" || architecture === "m16c" - || architecture === "cr16" || architecture === "hcs12" - || architecture === "hcs8"; + return architecture === "78k" + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs12" + || architecture === "hcs8" + || architecture === "m16c" + || architecture === "m32c" + || architecture === "m68k" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "r32c" + || architecture === "v850"; } function supportIArchiver(architecture) { return architecture.startsWith("arm") - || architecture === "stm8" || architecture === "rl78" - || architecture === "rx" || architecture === "rh850" - || architecture === "sh" || architecture === "riscv"; + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8"; +} + +function supportXAssembler(architecture) { + return architecture.startsWith("arm") + || architecture === "78k" + || architecture === "avr" + || architecture === "hcs12" + || architecture === "m16c" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "m32c" + || architecture === "v850"; +} + +function supportIAssembler(architecture) { + return architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs8" + || architecture === "r32c" + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8" + || architecture === "m68k"; +} + +function supportEndianness(architecture) { + return architecture.startsWith("arm") + || architecture === "rx"; +} + +function supportCppExceptions(architecture) { + return architecture.startsWith("arm") + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx"; +} + +function supportCppRtti(architecture) { + return architecture.startsWith("arm") + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx"; +} + +function supportCppWarningAboutCStyleCast(architecture) { + return architecture.startsWith("arm") + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "rh850" + || architecture === "rl78" + || architecture === "rx" + || architecture === "stm8" + || architecture === "v850"; +} + +function supportDeprecatedFeatureWarnings(architecture) { + return architecture.startsWith("arm") + || architecture === "avr" + || architecture === "cr16" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "rh850" + || architecture === "rl78" + || architecture === "rx" + || architecture === "stm8" + || architecture === "v850"; +} + +function supportCLanguageVersion(architecture) { + return architecture !== "78k"; +} + +function supportCppLanguage(compilerFilePath) { + var baseName = FileInfo.baseName(compilerFilePath); + return baseName !== "iccs08"; } // It is a 'magic' IAR-specific target architecture code. @@ -100,7 +201,7 @@ function architectureCode(architecture) { return "12"; case "hcs8": return "78"; - case "rh850": case "rl78": case "rx": case "stm8": case "sh": case "riscv": + case "rh850": case "riscv": case "rl78": case "rx": case "sh": case "stm8": return ""; default: if (architecture.startsWith("arm")) @@ -113,44 +214,44 @@ function compilerName(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return "iccarm"; - else if (architecture === "mcs51") - return "icc8051"; - else if (architecture === "avr") - return "iccavr"; - else if (architecture === "stm8") - return "iccstm8"; - else if (architecture === "msp430") - return "icc430"; - else if (architecture === "v850") - return "iccv850"; else if (architecture === "78k") return "icc78k"; - else if (architecture === "rl78") - return "iccrl78"; - else if (architecture === "rx") - return "iccrx"; - else if (architecture === "rh850") - return "iccrh850"; + else if (architecture === "avr") + return "iccavr"; else if (architecture === "avr32") return "iccavr32"; - else if (architecture === "sh") - return "iccsh"; - else if (architecture === "riscv") - return "iccriscv"; - else if (architecture === "m68k") - return "icccf"; - else if (architecture === "m32c") - return "iccm32c"; - else if (architecture === "r32c") - return "iccr32c"; - else if (architecture === "m16c") - return "iccm16c"; else if (architecture === "cr16") return "icccr16c"; else if (architecture === "hcs12") return "icchcs12"; else if (architecture === "hcs8") return "iccs08"; + else if (architecture === "m16c") + return "iccm16c"; + else if (architecture === "m32c") + return "iccm32c"; + else if (architecture === "m68k") + return "icccf"; + else if (architecture === "mcs51") + return "icc8051"; + else if (architecture === "msp430") + return "icc430"; + else if (architecture === "r32c") + return "iccr32c"; + else if (architecture === "rh850") + return "iccrh850"; + else if (architecture === "riscv") + return "iccriscv"; + else if (architecture === "rl78") + return "iccrl78"; + else if (architecture === "rx") + return "iccrx"; + else if (architecture === "sh") + return "iccsh"; + else if (architecture === "stm8") + return "iccstm8"; + else if (architecture === "v850") + return "iccv850"; throw "Unable to deduce compiler name for unsupported architecture: '" + architecture + "'"; } @@ -159,44 +260,44 @@ function assemblerName(qbs) { var architecture = qbs.architecture; if (architecture.startsWith("arm")) return "iasmarm"; - else if (architecture === "rl78") - return "iasmrl78"; - else if (architecture === "rx") - return "iasmrx"; - else if (architecture === "rh850") - return "iasmrh850"; - else if (architecture === "mcs51") - return "a8051"; - else if (architecture === "avr") - return "aavr"; - else if (architecture === "stm8") - return "iasmstm8"; - else if (architecture === "msp430") - return "a430"; - else if (architecture === "v850") - return "av850"; else if (architecture === "78k") return "a78k"; + else if (architecture === "avr") + return "aavr"; else if (architecture === "avr32") return "aavr32"; - else if (architecture === "sh") - return "iasmsh"; - else if (architecture === "riscv") - return "iasmriscv"; - else if (architecture === "m68k") - return "acf"; - else if (architecture === "m32c") - return "am32c"; - else if (architecture === "r32c") - return "ar32c"; - else if (architecture === "m16c") - return "am16c"; else if (architecture === "cr16") return "acr16c"; else if (architecture === "hcs12") return "ahcs12"; else if (architecture === "hcs8") return "as08"; + else if (architecture === "m16c") + return "am16c"; + else if (architecture === "m32c") + return "am32c"; + else if (architecture === "m68k") + return "acf"; + else if (architecture === "mcs51") + return "a8051"; + else if (architecture === "msp430") + return "a430"; + else if (architecture === "r32c") + return "ar32c"; + else if (architecture === "rh850") + return "iasmrh850"; + else if (architecture === "riscv") + return "iasmriscv"; + else if (architecture === "rl78") + return "iasmrl78"; + else if (architecture === "rx") + return "iasmrx"; + else if (architecture === "sh") + return "iasmsh"; + else if (architecture === "stm8") + return "iasmstm8"; + else if (architecture === "v850") + return "av850"; throw "Unable to deduce assembler name for unsupported architecture: '" + architecture + "'"; } @@ -267,16 +368,16 @@ function guessArmArchitecture(core) { arch += "v4m"; else if (core === "__ARM4TM__") arch += "v4tm"; - else if (core === "__ARM5__") - arch += "v5"; else if (core === "__ARM5E__") arch += "v5e"; - else if (core === "__ARM6__") - arch += "v6"; + else if (core === "__ARM5__") + arch += "v5"; else if (core === "__ARM6M__") arch += "v6m"; else if (core === "__ARM6SM__") arch += "v6sm"; + else if (core === "__ARM6__") + arch += "v6"; else if (core === "__ARM7M__") arch += "v7m"; else if (core === "__ARM7R__") @@ -285,46 +386,46 @@ function guessArmArchitecture(core) { } function guessArchitecture(macros) { - if (macros["__ICCARM__"] === "1") - return guessArmArchitecture(macros["__CORE__"]); - else if (macros["__ICC8051__"] === "1") - return "mcs51"; - else if (macros["__ICCAVR__"] === "1") - return "avr"; - else if (macros["__ICCSTM8__"] === "1") - return "stm8"; - else if (macros["__ICC430__"] === "1") + if (macros["__ICC430__"] === "1") return "msp430"; - else if (macros["__ICCRL78__"] === "1") - return "rl78"; - else if (macros["__ICCRX__"] === "1") - return "rx"; - else if (macros["__ICCRH850__"] === "1") - return "rh850"; - else if (macros["__ICCV850__"] === "1") - return "v850"; else if (macros["__ICC78K__"] === "1") return "78k"; + else if (macros["__ICC8051__"] === "1") + return "mcs51"; + else if (macros["__ICCARM__"] === "1") + return guessArmArchitecture(macros["__CORE__"]); else if (macros["__ICCAVR32__"] === "1") return "avr32"; - else if (macros["__ICCSH__"] === "1") - return "sh"; - else if (macros["__ICCRISCV__"] === "1") - return "riscv"; + else if (macros["__ICCAVR__"] === "1") + return "avr"; else if (macros["__ICCCF__"] === "1") return "m68k"; - else if (macros["__ICCM32C__"] === "1") - return "m32c"; - else if (macros["__ICCR32C__"] === "1") - return "r32c"; - else if (macros["__ICCM16C__"] === "1") - return "m16c"; else if (macros["__ICCCR16C__"] === "1") return "cr16"; else if (macros["__ICCHCS12__"] === "1") return "hcs12"; + else if (macros["__ICCM16C__"] === "1") + return "m16c"; + else if (macros["__ICCM32C__"] === "1") + return "m32c"; + else if (macros["__ICCR32C__"] === "1") + return "r32c"; + else if (macros["__ICCRH850__"] === "1") + return "rh850"; + else if (macros["__ICCRISCV__"] === "1") + return "riscv"; + else if (macros["__ICCRL78__"] === "1") + return "rl78"; + else if (macros["__ICCRX__"] === "1") + return "rx"; else if (macros["__ICCS08__"] === "1") return "hcs8"; + else if (macros["__ICCSH__"] === "1") + return "sh"; + else if (macros["__ICCSTM8__"] === "1") + return "stm8"; + else if (macros["__ICCV850__"] === "1") + return "v850"; } function guessEndianness(macros) { @@ -333,20 +434,31 @@ function guessEndianness(macros) { return "big" } -function guessVersion(macros, architecture) -{ +function guessVersion(macros, architecture) { var version = parseInt(macros["__VER__"], 10); if (architecture.startsWith("arm")) { return { major: parseInt(version / 1000000), minor: parseInt(version / 1000) % 1000, patch: parseInt(version) % 1000 } - } else if (architecture === "mcs51" || architecture === "avr" || architecture === "stm8" - || architecture === "msp430" || architecture === "rl78" || architecture === "rx" - || architecture === "rh850" || architecture === "v850" || architecture === "78k" - || architecture === "avr32" || architecture === "sh" || architecture === "riscv" - || architecture === "m68k" || architecture === "m32c" || architecture === "r32c" - || architecture === "m16c" || architecture === "cr16" || architecture === "hcs12" - || architecture === "hcs8") { + } else if (architecture === "78k" + || architecture === "avr" + || architecture === "avr32" + || architecture === "cr16" + || architecture === "hcs12" + || architecture === "hcs8" + || architecture === "m16c" + || architecture === "m32c" + || architecture === "m68k" + || architecture === "mcs51" + || architecture === "msp430" + || architecture === "r32c" + || architecture === "rh850" + || architecture === "riscv" + || architecture === "rl78" + || architecture === "rx" + || architecture === "sh" + || architecture === "stm8" + || architecture === "v850") { return { major: parseInt(version / 100), minor: parseInt(version % 100), patch: 0 } @@ -357,25 +469,25 @@ function cppLanguageOption(compilerFilePath) { var baseName = FileInfo.baseName(compilerFilePath); switch (baseName) { case "iccarm": - case "iccrl78": - case "iccrx": case "iccrh850": case "iccriscv": + case "iccrl78": + case "iccrx": return "--c++"; - case "icc8051": - case "iccavr": - case "iccstm8": case "icc430": - case "iccv850": case "icc78k": + case "icc8051": + case "iccavr": case "iccavr32": - case "iccsh": case "icccf": - case "iccm32c": - case "iccr32c": - case "iccm16c": case "icccr16c": case "icchcs12": + case "iccm16c": + case "iccm32c": + case "iccr32c": + case "iccsh": + case "iccstm8": + case "iccv850": return "--ec++"; } throw "Unable to deduce C++ language option for unsupported compiler: '" @@ -389,7 +501,7 @@ function dumpMacros(compilerFilePath, tag) { var outFilePath = FileInfo.fromNativeSeparators(tempDir.path() + "/iar-macros.predef"); var args = [ inFilePath, "--predef_macros", outFilePath ]; - if (tag && tag === "cpp") + if (tag === "cpp" && supportCppLanguage(compilerFilePath)) args.push(cppLanguageOption(compilerFilePath)); var p = new Process(); @@ -404,7 +516,7 @@ function dumpDefaultPaths(compilerFilePath, tag) { var inFile = new TextFile(inFilePath, TextFile.WriteOnly); var args = [ inFilePath, "--preinclude", "." ]; - if (tag === "cpp") + if (tag === "cpp" && supportCppLanguage(compilerFilePath)) args.push(cppLanguageOption(compilerFilePath)); var p = new Process(); @@ -541,9 +653,6 @@ function staticLibraryLinkerOutputArtifacts(product) { } function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { - // Determine which C-language we're compiling. - var tag = ModUtils.fileTagForTargetLanguage(input.fileTags.concat(outputs.obj[0].fileTags)); - var args = []; // Input. @@ -600,6 +709,7 @@ function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { } var architecture = input.qbs.architecture; + var tag = ModUtils.fileTagForTargetLanguage(input.fileTags.concat(outputs.obj[0].fileTags)); // Warning level flags. switch (input.cpp.warningLevel) { @@ -607,24 +717,21 @@ function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { args.push("--no_warnings"); break; case "all": - if (architecture !== "78k" && architecture !== "hcs12" && architecture !== "hcs8") { - if (architecture !== "avr32" && architecture !== "r32c" - && architecture !== "sh" && architecture !== "m16c") { + if (supportDeprecatedFeatureWarnings(architecture)) { args.push("--deprecated_feature_warnings=" +"+attribute_syntax," +"+preprocessor_extensions," +"+segment_pragmas"); } - if (tag === "cpp") + if (tag === "cpp" && supportCppWarningAboutCStyleCast(architecture)) args.push("--warn_about_c_style_casts"); - } break; } if (input.cpp.treatWarningsAsErrors) args.push("--warnings_are_errors"); // C language version flags. - if (tag === "c" && (architecture !== "78k")) { + if (tag === "c" && supportCLanguageVersion(architecture)) { var knownValues = ["c89"]; var cLanguageVersion = Cpp.languageVersion( input.cpp.cLanguageVersion, knownValues, "C"); @@ -640,35 +747,27 @@ function compilerFlags(project, product, input, outputs, explicitlyDependsOn) { } // C++ language version flags. - if (tag === "cpp") { - if (architecture.startsWith("arm") - || architecture === "rl78" || architecture === "rx" - || architecture === "rh850" || architecture === "riscv") { - // Enable C++ language flags. - args.push("--c++"); - // Exceptions flags. - if (!input.cpp.enableExceptions) - args.push("--no_exceptions"); - // RTTI flags. - if (!input.cpp.enableRtti) - args.push("--no_rtti"); - } else if (architecture === "stm8" || architecture === "mcs51" - || architecture === "avr" || architecture === "msp430" - || architecture === "v850" || architecture === "78k" - || architecture === "avr32" || architecture === "sh" - || architecture === "m68k" || architecture === "m32c" - || architecture === "r32c" || architecture === "m16c" - || architecture === "cr16" || architecture === "hcs12") { - args.push("--ec++"); - } + var compilerFilePath = input.cpp.compilerPath; + if (tag === "cpp" && supportCppLanguage(compilerFilePath)) { + // C++ language flag. + var cppOption = cppLanguageOption(compilerFilePath); + args.push(cppOption); + + // Exceptions flag. + var enableExceptions = input.cpp.enableExceptions; + if (!enableExceptions && supportCppExceptions(architecture)) + args.push("--no_exceptions"); + + // RTTI flag. + var enableRtti = input.cpp.enableRtti; + if (!enableRtti && supportCppRtti(architecture)) + args.push("--no_rtti"); } // Byte order flags. - if (architecture.startsWith("arm") || architecture === "rx") { - var endianness = input.cpp.endianness; - if (endianness) - args.push("--endian=" + endianness); - } + var endianness = input.cpp.endianness; + if (endianness && supportEndianness(architecture)) + args.push("--endian=" + endianness); // Listing files generation flag. if (input.cpp.generateCompilerListingFiles) @@ -711,12 +810,7 @@ function assemblerFlags(project, product, input, outputs, explicitlyDependsOn) { // Architecture specific flags. var architecture = input.qbs.architecture; - if (architecture === "stm8" || architecture === "rl78" - || architecture === "rx" || architecture === "rh850" - || architecture === "avr32" || architecture === "sh" - || architecture === "riscv" || architecture === "m68k" - || architecture === "r32c" || architecture === "cr16" - || architecture === "hcs8") { + if (supportIAssembler(architecture)) { // Silent output generation flag. args.push("--silent"); // Warning level flags. @@ -724,7 +818,7 @@ function assemblerFlags(project, product, input, outputs, explicitlyDependsOn) { args.push("--no_warnings"); if (input.cpp.treatWarningsAsErrors) args.push("--warnings_are_errors"); - } else { + } else if (supportXAssembler(architecture)){ // Silent output generation flag. args.push("-S"); // Warning level flags. |