diff options
author | Jonathon Penix <jpenix@quicinc.com> | 2022-07-19 11:47:25 -0700 |
---|---|---|
committer | Jonathon Penix <jpenix@quicinc.com> | 2022-10-12 16:57:37 -0700 |
commit | 0ec3ac9b7fbd15698af7289e1214e8ff3d82ec14 (patch) | |
tree | cc10f920b280aefa9913369c46c4f3b758a2b421 /flang/lib/Frontend/CompilerInvocation.cpp | |
parent | 74fea6bffeb1724e761ece6b74561fbe4efc8d6d (diff) | |
download | llvm-0ec3ac9b7fbd15698af7289e1214e8ff3d82ec14.zip llvm-0ec3ac9b7fbd15698af7289e1214e8ff3d82ec14.tar.gz llvm-0ec3ac9b7fbd15698af7289e1214e8ff3d82ec14.tar.bz2 |
[Flang] Add -fconvert option to swap endianness for unformatted files.
To accomplish this, this patch creates an optional list of environment
variable default values to be set by the runtime to allow directly using
the existing runtime implementation of FORT_CONVERT for I/O conversions.
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, |