aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Shienkov <denis.shienkov@gmail.com>2021-01-28 12:15:22 +0300
committerDenis Shienkov <denis.shienkov@gmail.com>2021-01-29 07:27:38 +0000
commita10cb7f9e999268e1c798420df9554f82a04454b (patch)
tree6d1ad3d59808ec620c40bf87295dfe8d01e73ab9
parent9a45ce1b66cddbf09801527c05457bcc994ee96e (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.js436
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.