Index: include/clang/Driver/Options.td =================================================================== --- include/clang/Driver/Options.td +++ include/clang/Driver/Options.td @@ -509,6 +509,12 @@ HelpText<"Enable sample-based profile guided optimizations">; def fauto_profile_EQ : Joined<["-"], "fauto-profile=">, Alias; +def femit_accurate_debug_info : Flag<["-"], "femit-accurate-debug-info">, + Group, Flags<[CC1Option]>, + HelpText<"Emit accurate debug info to make sample profile more accurate.">; +def fno_emit_accurate_debug_info : Flag<["-"], "fno-emit-accurate-debug-info">, + Group, Flags<[DriverOption]>, + HelpText<"Do not emit accurate debug info.">; def fprofile_instr_generate : Flag<["-"], "fprofile-instr-generate">, Group, Flags<[DriverOption]>, HelpText<"Generate instrumented code to collect execution counts into default.profraw file (overriden by '=' form of option or LLVM_PROFILE_FILE env var)">; Index: include/clang/Frontend/CodeGenOptions.def =================================================================== --- include/clang/Frontend/CodeGenOptions.def +++ include/clang/Frontend/CodeGenOptions.def @@ -256,6 +256,9 @@ /// Whether copy relocations support is available when building as PIE. CODEGENOPT(PIECopyRelocations, 1, 0) +/// Whether emit more accurate debug info for sample pgo profile collection. +CODEGENOPT(EmitAccurateDebugInfo, 1, 0) + #undef CODEGENOPT #undef ENUM_CODEGENOPT #undef VALUE_CODEGENOPT Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -2739,9 +2739,11 @@ } // No need to replicate the linkage name if it isn't different from the // subprogram name, no need to have it at all unless coverage is enabled or - // debug is set to more than just line tables. + // debug is set to more than just line tables or accurate debug info is + // needed. if (LinkageName == Name || (!CGM.getCodeGenOpts().EmitGcovArcs && !CGM.getCodeGenOpts().EmitGcovNotes && + !CGM.getCodeGenOpts().EmitAccurateDebugInfo && DebugKind <= codegenoptions::DebugLineTablesOnly)) LinkageName = StringRef(); Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -5508,6 +5508,10 @@ A->render(Args, CmdArgs); } + if (Args.hasFlag(options::OPT_femit_accurate_debug_info, + options::OPT_fno_emit_accurate_debug_info, false)) + CmdArgs.push_back("-femit-accurate-debug-info"); + // -fbuiltin is default unless -mkernel is used. bool UseBuiltins = Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin, Index: lib/Frontend/CompilerInvocation.cpp =================================================================== --- lib/Frontend/CompilerInvocation.cpp +++ lib/Frontend/CompilerInvocation.cpp @@ -538,6 +538,8 @@ Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as); Opts.Autolink = !Args.hasArg(OPT_fno_autolink); Opts.SampleProfileFile = Args.getLastArgValue(OPT_fprofile_sample_use_EQ); + Opts.EmitAccurateDebugInfo = Args.hasFlag( + OPT_femit_accurate_debug_info, OPT_fno_emit_accurate_debug_info, false); setPGOInstrumentor(Opts, Args, Diags); Opts.InstrProfileOutput = Index: test/Driver/clang_f_opts.c =================================================================== --- test/Driver/clang_f_opts.c +++ test/Driver/clang_f_opts.c @@ -469,3 +469,8 @@ // CHECK-WCHAR2: -fshort-wchar // CHECK-WCHAR2-NOT: -fno-short-wchar // DELIMITERS: {{^ *"}} + +// RUN: %clang -### -S -fno-emit-accurate-debug-info -femit-accurate-debug-info %s 2>&1 | FileCheck -check-prefix=CHECK-EMIT-ACCURATE-DEBUG-INFO %s +// RUN: %clang -### -S -femit-accurate-debug-info -fno-emit-accurate-debug-info %s 2>&1 | FileCheck -check-prefix=CHECK-NO-EMIT-ACCURATE-DEBUG-INFO %s +// CHECK-EMIT-ACCURATE-DEBUG-INFO: -femit-accurate-debug-info +// CHECK-NO-EMIT-ACCURATE-DEBUG-INFO-NOT: -femit-accurate-debug-info