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.cpp41
1 files changed, 29 insertions, 12 deletions
diff --git a/flang/lib/Frontend/CompilerInvocation.cpp b/flang/lib/Frontend/CompilerInvocation.cpp
index 4729f8a..09b5173 100644
--- a/flang/lib/Frontend/CompilerInvocation.cpp
+++ b/flang/lib/Frontend/CompilerInvocation.cpp
@@ -332,17 +332,6 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
if (args.hasArg(clang::driver::options::OPT_finstrument_functions))
opts.InstrumentFunctions = 1;
- // -flto=full/thin option.
- if (const llvm::opt::Arg *a =
- args.getLastArg(clang::driver::options::OPT_flto_EQ)) {
- llvm::StringRef s = a->getValue();
- assert((s == "full" || s == "thin") && "Unknown LTO mode.");
- if (s == "full")
- opts.PrepareForFullLTO = true;
- else
- opts.PrepareForThinLTO = true;
- }
-
if (const llvm::opt::Arg *a = args.getLastArg(
clang::driver::options::OPT_mcode_object_version_EQ)) {
llvm::StringRef s = a->getValue();
@@ -1489,6 +1478,7 @@ static bool parseLinkerOptionsArgs(CompilerInvocation &invoc,
llvm::opt::ArgList &args,
clang::DiagnosticsEngine &diags) {
llvm::Triple triple = llvm::Triple(invoc.getTargetOpts().triple);
+ CodeGenOptions &opts = invoc.getCodeGenOpts();
// TODO: support --dependent-lib on other platforms when MLIR supports
// !llvm.dependent.lib
@@ -1501,8 +1491,35 @@ static bool parseLinkerOptionsArgs(CompilerInvocation &invoc,
return false;
}
- invoc.getCodeGenOpts().DependentLibs =
+ opts.DependentLibs =
args.getAllArgValues(clang::driver::options::OPT_dependent_lib);
+
+ // -flto=full/thin option.
+ if (const llvm::opt::Arg *a =
+ args.getLastArg(clang::driver::options::OPT_flto_EQ)) {
+ llvm::StringRef s = a->getValue();
+ assert((s == "full" || s == "thin") && "Unknown LTO mode.");
+ if (s == "full")
+ opts.PrepareForFullLTO = true;
+ else
+ opts.PrepareForThinLTO = true;
+ }
+
+ // -ffat-lto-objects
+ if (const llvm::opt::Arg *arg =
+ args.getLastArg(clang::driver::options::OPT_ffat_lto_objects,
+ clang::driver::options::OPT_fno_fat_lto_objects)) {
+ opts.PrepareForFatLTO =
+ arg->getOption().matches(clang::driver::options::OPT_ffat_lto_objects);
+ if (opts.PrepareForFatLTO) {
+ assert((opts.PrepareForFullLTO || opts.PrepareForThinLTO) &&
+ "Unknown LTO mode");
+
+ if (!triple.isOSBinFormatELF())
+ diags.Report(clang::diag::err_drv_unsupported_opt_for_target)
+ << arg->getAsString(args) << triple.getTriple();
+ }
+ }
return true;
}