diff options
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp index 0ad63b0..c182418 100644 --- a/flang/lib/Frontend/CompilerInvocation.cpp +++ b/flang/lib/Frontend/CompilerInvocation.cpp @@ -180,6 +180,17 @@ static void setUpFrontendBasedOnAction(FrontendOptions &opts) { opts.needProvenanceRangeToCharBlockMappings = true; } +/// Parse the argument specified for the -fconvert=<value> option +static std::optional<const char *> parseConvertArg(const char *s) { + return llvm::StringSwitch<std::optional<const char *>>(s) + .Case("unknown", "UNKNOWN") + .Case("native", "NATIVE") + .Case("little-endian", "LITTLE_ENDIAN") + .Case("big-endian", "BIG_ENDIAN") + .Case("swap", "SWAP") + .Default(std::nullopt); +} + static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args, clang::DiagnosticsEngine &diags) { unsigned numErrorsBefore = diags.getNumErrors(); @@ -399,6 +410,17 @@ static bool parseFrontendArgs(FrontendOptions &opts, llvm::opt::ArgList &args, } } + // Set conversion based on -fconvert=<value> + if (const auto *arg = + args.getLastArg(clang::driver::options::OPT_fconvert_EQ)) { + const char *argValue = arg->getValue(); + if (auto convert = parseConvertArg(argValue)) + opts.envDefaults.push_back({"FORT_CONVERT", *convert}); + else + diags.Report(clang::diag::err_drv_invalid_value) + << arg->getAsString(args) << argValue; + } + // -f{no-}implicit-none opts.features.Enable( Fortran::common::LanguageFeature::ImplicitNoneTypeAlways, |