aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Frontend/CompilerInvocation.cpp
diff options
context:
space:
mode:
authorJonathon Penix <jpenix@quicinc.com>2022-07-19 11:47:25 -0700
committerJonathon Penix <jpenix@quicinc.com>2022-10-12 16:57:37 -0700
commit0ec3ac9b7fbd15698af7289e1214e8ff3d82ec14 (patch)
treecc10f920b280aefa9913369c46c4f3b758a2b421 /flang/lib/Frontend/CompilerInvocation.cpp
parent74fea6bffeb1724e761ece6b74561fbe4efc8d6d (diff)
downloadllvm-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.cpp22
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,