diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3746,6 +3746,12 @@ ArgStringList &CmdArgs, codegenoptions::DebugInfoKind &DebugInfoKind, DwarfFissionKind &DwarfFission) { + // These two forms of profiling info can't be used together. + if (const Arg *A1 = Args.getLastArg(options::OPT_fpseudo_probe_for_profiling)) + if (const Arg *A2 = Args.getLastArg(options::OPT_fdebug_info_for_profiling)) + D.Diag(diag::err_drv_argument_not_allowed_with) + << A1->getAsString(Args) << A2->getAsString(Args); + if (Args.hasFlag(options::OPT_fdebug_info_for_profiling, options::OPT_fno_debug_info_for_profiling, false) && checkDebugInfoOption( diff --git a/clang/test/CodeGen/pseudo-probe-emit.c b/clang/test/CodeGen/pseudo-probe-emit.c --- a/clang/test/CodeGen/pseudo-probe-emit.c +++ b/clang/test/CodeGen/pseudo-probe-emit.c @@ -1,4 +1,4 @@ -// RUN: %clang -O2 -fexperimental-new-pass-manager -fpseudo-probe-for-profiling -g -emit-llvm -S -o - %s | FileCheck %s +// RUN: %clang_cc1 -O2 -fno-legacy-pass-manager -fpseudo-probe-for-profiling -debug-info-kind=limited -emit-llvm -o - %s | FileCheck %s // Check the generation of pseudoprobe intrinsic call diff --git a/clang/test/Driver/pseudo-probe.c b/clang/test/Driver/pseudo-probe.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/pseudo-probe.c @@ -0,0 +1,7 @@ +// RUN: %clang -### -fpseudo-probe-for-profiling %s 2>&1 | FileCheck %s --check-prefix=YESPROBE +// RUN: %clang -### -fno-pseudo-probe-for-profiling %s 2>&1 | FileCheck %s --check-prefix=NOPROBE +// RUN: %clang -### -fpseudo-probe-for-profiling -fdebug-info-for-profiling %s 2>&1 | FileCheck %s --check-prefix=CONFLICT + +// YESPROBE: -fpseudo-probe-for-profiling +// NOPROBE-NOT: -fpseudo-probe-for-profiling +// CONFLICT: invalid argument