aboutsummaryrefslogtreecommitdiff
path: root/lib/compilers/argument-parsers.js
diff options
context:
space:
mode:
authorJohan Engelen <jbc.engelen@gmail.com>2022-07-26 01:40:55 +0200
committerGitHub <noreply@github.com>2022-07-26 01:40:55 +0200
commita0584bcc5e32a4ed37ea6c865943b7fd10b897f7 (patch)
treeb924559f3706b9b84dd8b5276f409ea594b0e196 /lib/compilers/argument-parsers.js
parent473f1fc1c4211c9f83b34762359d9b0953b61c3d (diff)
downloadcompiler-explorer-a0584bcc5e32a4ed37ea6c865943b7fd10b897f7.tar.gz
compiler-explorer-a0584bcc5e32a4ed37ea6c865943b7fd10b897f7.zip
Give LDC its own LDCParser for cmdline options. (#3907)gh-3767
LDC does not quite copy Clang cmdline options, so it's best to implement its own parser.
Diffstat (limited to 'lib/compilers/argument-parsers.js')
-rw-r--r--lib/compilers/argument-parsers.js45
1 files changed, 45 insertions, 0 deletions
diff --git a/lib/compilers/argument-parsers.js b/lib/compilers/argument-parsers.js
index caa1e4166..235d6b94a 100644
--- a/lib/compilers/argument-parsers.js
+++ b/lib/compilers/argument-parsers.js
@@ -199,6 +199,51 @@ export class ClangParser extends BaseParser {
}
}
+export class LDCParser extends BaseParser {
+ static setCompilerSettingsFromOptions(compiler, options) {
+ if (BaseParser.hasSupport(options, '--fsave-optimization-record')) {
+ compiler.compiler.optArg = '--fsave-optimization-record';
+ compiler.compiler.supportsOptOutput = true;
+ }
+
+ if (
+ BaseParser.hasSupport(options, '--print-before-all') &&
+ BaseParser.hasSupport(options, '--print-after-all')
+ ) {
+ compiler.compiler.supportsLLVMOptPipelineView = true;
+ compiler.compiler.llvmOptArg = ['--print-before-all', '--print-after-all'];
+ compiler.compiler.llvmOptModuleScopeArg = [];
+ compiler.compiler.llvmOptNoDiscardValueNamesArg = [];
+ if (BaseParser.hasSupport(options, '--print-module-scope')) {
+ compiler.compiler.llvmOptModuleScopeArg = ['--print-module-scope'];
+ }
+ if (BaseParser.hasSupport(options, '--fno-discard-value-names')) {
+ compiler.compiler.llvmOptNoDiscardValueNamesArg = ['--fno-discard-value-names'];
+ }
+ }
+
+ if (BaseParser.hasSupport(options, '--enable-color')) {
+ compiler.compiler.options += ' --enable-color';
+ }
+ }
+
+ static async parse(compiler) {
+ const options = await LDCParser.getOptions(compiler, '--help-hidden');
+ this.setCompilerSettingsFromOptions(compiler, options);
+ return compiler;
+ }
+
+ static async getOptions(compiler, helpArg, populate = true) {
+ const optionFinder = /^\s*(--?[\d+,<=>[\]a-z|-]*)\s*(.*)/i;
+ const result = await compiler.execCompilerCached(compiler.compiler.exe, helpArg.split(' '));
+ const options = result.code === 0 ? BaseParser.parseLines(result.stdout + result.stderr, optionFinder) : {};
+ if (populate) {
+ compiler.possibleArguments.populateOptions(options);
+ }
+ return options;
+ }
+}
+
export class ErlangParser extends BaseParser {
static async parse(compiler) {
await ErlangParser.getOptions(compiler, '-help');