summaryrefslogtreecommitdiffstats
path: root/clang/lib/Driver/Tools.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/Driver/Tools.cpp')
-rw-r--r--clang/lib/Driver/Tools.cpp88
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);
OpenPOWER on IntegriCloud