aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r--flang/lib/Frontend/CompilerInvocation.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 3fef377..334da3a 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -153,6 +153,34 @@ static bool parseDebugArgs(Fortran::frontend::CodeGenOptions &opts,
return true;
}
+static bool parseVectorLibArg(Fortran::frontend::CodeGenOptions &opts,
+ llvm::opt::ArgList &args,
+ clang::DiagnosticsEngine &diags) {
+ llvm::opt::Arg *arg = args.getLastArg(clang::driver::options::OPT_fveclib);
+ if (!arg)
+ return true;
+
+ using VectorLibrary = llvm::driver::VectorLibrary;
+ std::optional<VectorLibrary> val =
+ llvm::StringSwitch<std::optional<VectorLibrary>>(arg->getValue())
+ .Case("Accelerate", VectorLibrary::Accelerate)
+ .Case("LIBMVEC", VectorLibrary::LIBMVEC)
+ .Case("MASSV", VectorLibrary::MASSV)
+ .Case("SVML", VectorLibrary::SVML)
+ .Case("SLEEF", VectorLibrary::SLEEF)
+ .Case("Darwin_libsystem_m", VectorLibrary::Darwin_libsystem_m)
+ .Case("ArmPL", VectorLibrary::ArmPL)
+ .Case("NoLibrary", VectorLibrary::NoLibrary)
+ .Default(std::nullopt);
+ if (!val.has_value()) {
+ diags.Report(clang::diag::err_drv_invalid_value)
+ << arg->getAsString(args) << arg->getValue();
+ return false;
+ }
+ opts.setVecLib(val.value());
+ return true;
+}
+
// Generate an OptRemark object containing info on if the -Rgroup
// specified is enabled or not.
static CodeGenOptions::OptRemark
@@ -1116,6 +1144,7 @@ bool CompilerInvocation::createFromArgs(
parsePreprocessorArgs(res.getPreprocessorOpts(), args);
parseCodeGenArgs(res.getCodeGenOpts(), args, diags);
success &= parseDebugArgs(res.getCodeGenOpts(), args, diags);
+ success &= parseVectorLibArg(res.getCodeGenOpts(), args, diags);
success &= parseSemaArgs(res, args, diags);
success &= parseDialectArgs(res, args, diags);
success &= parseDiagArgs(res, args, diags);