diff options
Diffstat (limited to 'clang/lib/Driver')
-rw-r--r-- | clang/lib/Driver/Driver.cpp | 21 | ||||
-rw-r--r-- | clang/lib/Driver/Tools.cpp | 12 |
2 files changed, 24 insertions, 9 deletions
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 111614f3a53..1f2c64eaf73 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -507,14 +507,23 @@ Compilation *Driver::BuildCompilation(ArrayRef<const char *> ArgList) { // Ignore -fembed-bitcode options with LTO // since the output will be bitcode anyway. if (!Args.hasFlag(options::OPT_flto, options::OPT_fno_lto, false)) { - if (Args.hasArg(options::OPT_fembed_bitcode)) - BitcodeEmbed = EmbedBitcode; - else if (Args.hasArg(options::OPT_fembed_bitcode_marker)) - BitcodeEmbed = EmbedMarker; + if (Arg *A = Args.getLastArg(options::OPT_fembed_bitcode_EQ)) { + StringRef Name = A->getValue(); + unsigned Model = llvm::StringSwitch<unsigned>(Name) + .Case("off", EmbedNone) + .Case("all", EmbedBitcode) + .Case("bitcode", EmbedBitcode) + .Case("marker", EmbedMarker) + .Default(~0U); + if (Model == ~0U) { + Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) + << Name; + } else + BitcodeEmbed = static_cast<BitcodeEmbedMode>(Model); + } } else { // claim the bitcode option under LTO so no warning is issued. - Args.ClaimAllArgs(options::OPT_fembed_bitcode); - Args.ClaimAllArgs(options::OPT_fembed_bitcode_marker); + Args.ClaimAllArgs(options::OPT_fembed_bitcode_EQ); } setLTOMode(Args); diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index e45c5c55626..25f8880af65 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -3773,12 +3773,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, if (C.getDriver().embedBitcodeEnabled() && (isa<BackendJobAction>(JA) || isa<AssembleJobAction>(JA))) { // Add flags implied by -fembed-bitcode. - CmdArgs.push_back("-fembed-bitcode"); + Args.AddLastArg(CmdArgs, options::OPT_fembed_bitcode_EQ); // Disable all llvm IR level optimizations. CmdArgs.push_back("-disable-llvm-optzns"); } if (C.getDriver().embedBitcodeMarkerOnly()) - CmdArgs.push_back("-fembed-bitcode-marker"); + CmdArgs.push_back("-fembed-bitcode=marker"); // We normally speed up the clang process a bit by skipping destructors at // exit, but when we're generating diagnostics we can rely on some of the @@ -5709,7 +5709,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // With -save-temps, we want to save the unoptimized bitcode output from the // CompileJobAction, use -disable-llvm-passes to get pristine IR generated // by the frontend. - if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA)) + // When -fembed-bitcode is enabled, optimized bitcode is emitted because it + // has slightly different breakdown between stages. + // FIXME: -fembed-bitcode -save-temps will save optimized bitcode instead of + // pristine IR generated by the frontend. Ideally, a new compile action should + // be added so both IR can be captured. + if (C.getDriver().isSaveTempsEnabled() && + !C.getDriver().embedBitcodeEnabled() && isa<CompileJobAction>(JA)) CmdArgs.push_back("-disable-llvm-passes"); if (Output.getType() == types::TY_Dependencies) { |