diff options
Diffstat (limited to 'flang/lib/Frontend/CompilerInvocation.cpp')
-rw-r--r-- | flang/lib/Frontend/CompilerInvocation.cpp | 41 |
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; } |