diff options
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 88 |
1 files changed, 64 insertions, 24 deletions
diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index 042a0ff2668..6947219e914 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -2487,6 +2487,20 @@ static bool UseRelaxAll(Compilation &C, const ArgList &Args) { RelaxDefault); } +// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases +// to the corresponding DebugInfoKind. +static CodeGenOptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) { + assert(A.getOption().matches(options::OPT_gN_Group) && + "Not a -g option that specifies a debug-info level"); + if (A.getOption().matches(options::OPT_g0) || + A.getOption().matches(options::OPT_ggdb0)) + return CodeGenOptions::NoDebugInfo; + if (A.getOption().matches(options::OPT_gline_tables_only) || + A.getOption().matches(options::OPT_ggdb1)) + return CodeGenOptions::DebugLineTablesOnly; + return CodeGenOptions::LimitedDebugInfo; +} + // Extract the integer N from a string spelled "-dwarf-N", returning 0 // on mismatch. The StringRef input (rather than an Arg) allows // for use by the "-Xassembler" option parser. @@ -2500,7 +2514,8 @@ static unsigned DwarfVersionNum(StringRef ArgValue) { static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs, CodeGenOptions::DebugInfoKind DebugInfoKind, - unsigned DwarfVersion) { + unsigned DwarfVersion, + llvm::DebuggerKind DebuggerTuning) { switch (DebugInfoKind) { case CodeGenOptions::DebugLineTablesOnly: CmdArgs.push_back("-debug-info-kind=line-tables-only"); @@ -2517,6 +2532,19 @@ static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs, if (DwarfVersion > 0) CmdArgs.push_back( Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion))); + switch (DebuggerTuning) { + case llvm::DebuggerKind::GDB: + CmdArgs.push_back("-debugger-tuning=gdb"); + break; + case llvm::DebuggerKind::LLDB: + CmdArgs.push_back("-debugger-tuning=lldb"); + break; + case llvm::DebuggerKind::SCE: + CmdArgs.push_back("-debugger-tuning=sce"); + break; + default: + break; + } } static void CollectArgsForIntegratedAssembler(Compilation &C, @@ -2604,7 +2632,8 @@ static void CollectArgsForIntegratedAssembler(Compilation &C, CmdArgs.push_back(Value.data()); } else { RenderDebugEnablingArgs( - Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion); + Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion, + llvm::DebuggerKind::Default); } } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") || Value.startswith("-mhwdiv") || Value.startswith("-march")) { @@ -3977,16 +4006,18 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, // The 'g' groups options involve a somewhat intricate sequence of decisions // about what to pass from the driver to the frontend, but by the time they - // reach cc1 they've been factored into two well-defined orthogonal choices: + // reach cc1 they've been factored into three well-defined orthogonal choices: // * what level of debug info to generate // * what dwarf version to write + // * what debugger tuning to use // This avoids having to monkey around further in cc1 other than to disable // codeview if not running in a Windows environment. Perhaps even that // decision should be made in the driver as well though. + unsigned DwarfVersion = 0; + llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning(); + // These two are potentially updated by AddClangCLArgs. enum CodeGenOptions::DebugInfoKind DebugInfoKind = CodeGenOptions::NoDebugInfo; - // These two are potentially updated by AddClangCLArgs. - unsigned DwarfVersion = 0; bool EmitCodeView = false; // Add clang-cl arguments. @@ -4035,25 +4066,32 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.ClaimAllArgs(options::OPT_g_Group); Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf); if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { - // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins, - // which mandates turning on "-g". But -split-dwarf is not a g_group option, - // hence it takes a nontrivial test to decide about line-tables-only. - if (A->getOption().matches(options::OPT_gline_tables_only) && - (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) { - DebugInfoKind = CodeGenOptions::DebugLineTablesOnly; - SplitDwarfArg = nullptr; - } else if (!A->getOption().matches(options::OPT_g0)) { - // Some 'g' group option other than one expressly disabling debug info - // must have been the final (winning) one. They're all equivalent. + // If the last option explicitly specified a debug-info level, use it. + if (A->getOption().matches(options::OPT_gN_Group)) { + DebugInfoKind = DebugLevelToInfoKind(*A); + // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses. + // But -gsplit-dwarf is not a g_group option, hence we have to check the + // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.) + if (SplitDwarfArg && DebugInfoKind < CodeGenOptions::LimitedDebugInfo && + A->getIndex() > SplitDwarfArg->getIndex()) + SplitDwarfArg = nullptr; + } else + // For any other 'g' option, use Limited. DebugInfoKind = CodeGenOptions::LimitedDebugInfo; - } } - // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None - // (because that would mean that "-g0" was the rightmost 'g' group option). - // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works, - // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix" - // exists of removing the gdwarf options from the g_group. + // If a debugger tuning argument appeared, remember it. + if (Arg *A = Args.getLastArg(options::OPT_gTune_Group, + options::OPT_ggdbN_Group)) { + if (A->getOption().matches(options::OPT_glldb)) + DebuggerTuning = llvm::DebuggerKind::LLDB; + else if (A->getOption().matches(options::OPT_gsce)) + DebuggerTuning = llvm::DebuggerKind::SCE; + else + DebuggerTuning = llvm::DebuggerKind::GDB; + } + + // If a -gdwarf argument appeared, remember it. if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3, options::OPT_gdwarf_4)) DwarfVersion = DwarfVersionNum(A->getSpelling()); @@ -4102,7 +4140,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, getToolChain().GetDefaultStandaloneDebug()); if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug) DebugInfoKind = CodeGenOptions::FullDebugInfo; - RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion); + RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion, + DebuggerTuning); // -ggnu-pubnames turns on gnu style pubnames in the backend. if (Args.hasArg(options::OPT_ggnu_pubnames)) { @@ -5888,7 +5927,8 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, unsigned DwarfVersion = 0; Args.ClaimAllArgs(options::OPT_g_Group); if (Arg *A = Args.getLastArg(options::OPT_g_Group)) { - WantDebug = !A->getOption().matches(options::OPT_g0); + WantDebug = !A->getOption().matches(options::OPT_g0) && + !A->getOption().matches(options::OPT_ggdb0); if (WantDebug) DwarfVersion = DwarfVersionNum(A->getSpelling()); } @@ -5897,7 +5937,7 @@ void ClangAs::ConstructJob(Compilation &C, const JobAction &JA, RenderDebugEnablingArgs(Args, CmdArgs, (WantDebug ? CodeGenOptions::LimitedDebugInfo : CodeGenOptions::NoDebugInfo), - DwarfVersion); + DwarfVersion, llvm::DebuggerKind::Default); // Add the -fdebug-compilation-dir flag if needed. addDebugCompDirArg(Args, CmdArgs); |

