diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 0952262c36018..2eca2e377c0ff 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -595,6 +595,16 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C, << PGOGenerateArg->getSpelling() << ProfileGenerateArg->getSpelling(); auto *ProfileUseArg = getLastProfileUseArg(Args); + auto *ProfileSampleUseArg = Args.getLastArg( + options::OPT_fprofile_sample_use, options::OPT_fprofile_sample_use_EQ, + options::OPT_fauto_profile, options::OPT_fauto_profile_EQ, + options::OPT_fno_profile_sample_use, options::OPT_fno_auto_profile); + + if (ProfileSampleUseArg && + (ProfileSampleUseArg->getOption().matches( + options::OPT_fno_profile_sample_use) || + ProfileSampleUseArg->getOption().matches(options::OPT_fno_auto_profile))) + ProfileSampleUseArg = nullptr; if (PGOGenerateArg && ProfileUseArg) D.Diag(diag::err_drv_argument_not_allowed_with) @@ -700,6 +710,25 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C, } } + if (ProfileSampleUseArg) { + if ((ProfileSampleUseArg->getOption().matches( + options::OPT_fprofile_sample_use) || + ProfileSampleUseArg->getOption().matches( + options::OPT_fprofile_sample_use_EQ))) { + SmallString<128> Path(ProfileSampleUseArg->getNumValues() == 0 + ? "" + : ProfileSampleUseArg->getValue()); + if (Path.empty() || llvm::sys::fs::is_directory(Path)) + llvm::sys::path::append(Path, "default.profdata"); + + if (!llvm::sys::fs::exists(Path)) + D.Diag(diag::err_drv_no_such_file) << Path; + + CmdArgs.push_back( + Args.MakeArgString(Twine("-fprofile-sample-use=") + Path)); + } + } + bool EmitCovNotes = Args.hasFlag(options::OPT_ftest_coverage, options::OPT_fno_test_coverage, false) || Args.hasArg(options::OPT_coverage); diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c index 2cfbe256bc745..ae633774bd31d 100644 --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -71,8 +71,9 @@ // RUN: %clang -### -S -fauto-profile=%S/Inputs/file.prof -fno-auto-profile %s 2>&1 | FileCheck -check-prefix=CHECK-NO-AUTO-PROFILE %s // CHECK-NO-AUTO-PROFILE-NOT: "-fprofile-sample-use={{.*}}/file.prof" -// RUN: %clang -### -S -fauto-profile=%S/Inputs/file.prof -fno-profile-sample-use -fauto-profile %s 2>&1 | FileCheck -check-prefix=CHECK-AUTO-PROFILE %s -// RUN: %clang -### -S -fauto-profile=%S/Inputs/file.prof -fno-auto-profile -fprofile-sample-use %s 2>&1 | FileCheck -check-prefix=CHECK-AUTO-PROFILE %s +// RUN: not %clang -### -S -fauto-profile=%S/Inputs/file.prof -fno-profile-sample-use -fauto-profile %s 2>&1 | FileCheck -check-prefix=CHECK-AUTO-PROFILE-NO-DEFAULT %s +// RUN: not %clang -### -S -fauto-profile=%S/Inputs/file.prof -fno-auto-profile -fprofile-sample-use %s 2>&1 | FileCheck -check-prefix=CHECK-AUTO-PROFILE-NO-DEFAULT %s +// CHECK-AUTO-PROFILE-NO-DEFAULT: error: no such file or directory: 'default.profdata' // RUN: %clang -### -S -fprofile-generate %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE-LLVM %s // RUN: %clang -### -S -fprofile-instr-generate %s 2>&1 | FileCheck -check-prefix=CHECK-PROFILE-GENERATE %s