[debug-info] support new tuning debugger type DBX for XCOFF DWARF

Based on this debugger type, for now, we plan to:
1: use inline string by default for XCOFF DWARF
2: generate no column info for debug line table.

Reviewed By: aprantl

Differential Revision: https://reviews.llvm.org/D99400
This commit is contained in:
Chen Zheng 2021-03-26 03:21:46 -04:00
parent dfc8da19c5
commit bfcd21876a
8 changed files with 34 additions and 13 deletions

View File

@ -2573,13 +2573,12 @@ While Clang generally emits standard DWARF debug info (http://dwarfstd.org),
different debuggers may know how to take advantage of different specific DWARF different debuggers may know how to take advantage of different specific DWARF
features. You can "tune" the debug info for one of several different debuggers. features. You can "tune" the debug info for one of several different debuggers.
.. option:: -ggdb, -glldb, -gsce .. option:: -ggdb, -glldb, -gsce, -gdbx
Tune the debug info for the ``gdb``, ``lldb``, or Sony PlayStation\ |reg|
debugger, respectively. Each of these options implies **-g**. (Therefore, if
you want both **-gline-tables-only** and debugger tuning, the tuning option
must come first.)
Tune the debug info for the ``gdb``, ``lldb``, Sony PlayStation\ |reg|
debugger, or ``dbx``, respectively. Each of these options implies **-g**.
(Therefore, if you want both **-gline-tables-only** and debugger tuning, the
tuning option must come first.)
Controlling LLVM IR Output Controlling LLVM IR Output
-------------------------- --------------------------

View File

@ -340,7 +340,7 @@ ENUM_CODEGENOPT(DebugInfo, codegenoptions::DebugInfoKind, 4, codegenoptions::NoD
CODEGENOPT(MacroDebugInfo, 1, 0) CODEGENOPT(MacroDebugInfo, 1, 0)
/// Tune the debug info for this debugger. /// Tune the debug info for this debugger.
ENUM_CODEGENOPT(DebuggerTuning, llvm::DebuggerKind, 2, ENUM_CODEGENOPT(DebuggerTuning, llvm::DebuggerKind, 3,
llvm::DebuggerKind::Default) llvm::DebuggerKind::Default)
/// Dwarf version. Version zero indicates to LLVM that no DWARF should be /// Dwarf version. Version zero indicates to LLVM that no DWARF should be

View File

@ -2722,6 +2722,7 @@ def ggdb2 : Flag<["-"], "ggdb2">, Group<ggdbN_Group>;
def ggdb3 : Flag<["-"], "ggdb3">, Group<ggdbN_Group>; def ggdb3 : Flag<["-"], "ggdb3">, Group<ggdbN_Group>;
def glldb : Flag<["-"], "glldb">, Group<gTune_Group>; def glldb : Flag<["-"], "glldb">, Group<gTune_Group>;
def gsce : Flag<["-"], "gsce">, Group<gTune_Group>; def gsce : Flag<["-"], "gsce">, Group<gTune_Group>;
def gdbx : Flag<["-"], "gdbx">, Group<gTune_Group>;
// Equivalent to our default dwarf version. Forces usual dwarf emission when // Equivalent to our default dwarf version. Forces usual dwarf emission when
// CodeView is enabled. // CodeView is enabled.
def gdwarf : Flag<["-"], "gdwarf">, Group<g_Group>, Flags<[CoreOption]>, def gdwarf : Flag<["-"], "gdwarf">, Group<g_Group>, Flags<[CoreOption]>,
@ -4612,8 +4613,8 @@ def default_function_attr : Separate<["-"], "default-function-attr">,
def dwarf_version_EQ : Joined<["-"], "dwarf-version=">, def dwarf_version_EQ : Joined<["-"], "dwarf-version=">,
MarshallingInfoInt<CodeGenOpts<"DwarfVersion">>; MarshallingInfoInt<CodeGenOpts<"DwarfVersion">>;
def debugger_tuning_EQ : Joined<["-"], "debugger-tuning=">, def debugger_tuning_EQ : Joined<["-"], "debugger-tuning=">,
Values<"gdb,lldb,sce">, Values<"gdb,lldb,sce,dbx">,
NormalizedValuesScope<"llvm::DebuggerKind">, NormalizedValues<["GDB", "LLDB", "SCE"]>, NormalizedValuesScope<"llvm::DebuggerKind">, NormalizedValues<["GDB", "LLDB", "SCE", "DBX"]>,
MarshallingInfoEnum<CodeGenOpts<"DebuggerTuning">, "Default">; MarshallingInfoEnum<CodeGenOpts<"DebuggerTuning">, "Default">;
def dwarf_debug_flags : Separate<["-"], "dwarf-debug-flags">, def dwarf_debug_flags : Separate<["-"], "dwarf-debug-flags">,
HelpText<"The string to embed in the Dwarf debug flags record.">, HelpText<"The string to embed in the Dwarf debug flags record.">,

View File

@ -77,6 +77,10 @@ public:
// Set default DWARF version to 3 for now as latest AIX OS supports version 3. // Set default DWARF version to 3 for now as latest AIX OS supports version 3.
unsigned GetDefaultDwarfVersion() const override { return 3; } unsigned GetDefaultDwarfVersion() const override { return 3; }
llvm::DebuggerKind getDefaultDebuggerTuning() const override {
return llvm::DebuggerKind::DBX;
}
protected: protected:
Tool *buildAssembler() const override; Tool *buildAssembler() const override;
Tool *buildLinker() const override; Tool *buildLinker() const override;

View File

@ -1051,6 +1051,9 @@ static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
case llvm::DebuggerKind::SCE: case llvm::DebuggerKind::SCE:
CmdArgs.push_back("-debugger-tuning=sce"); CmdArgs.push_back("-debugger-tuning=sce");
break; break;
case llvm::DebuggerKind::DBX:
CmdArgs.push_back("-debugger-tuning=dbx");
break;
default: default:
break; break;
} }
@ -3895,6 +3898,8 @@ static void renderDebugOptions(const ToolChain &TC, const Driver &D,
DebuggerTuning = llvm::DebuggerKind::LLDB; DebuggerTuning = llvm::DebuggerKind::LLDB;
else if (A->getOption().matches(options::OPT_gsce)) else if (A->getOption().matches(options::OPT_gsce))
DebuggerTuning = llvm::DebuggerKind::SCE; DebuggerTuning = llvm::DebuggerKind::SCE;
else if (A->getOption().matches(options::OPT_gdbx))
DebuggerTuning = llvm::DebuggerKind::DBX;
else else
DebuggerTuning = llvm::DebuggerKind::GDB; DebuggerTuning = llvm::DebuggerKind::GDB;
} }

View File

@ -550,6 +550,8 @@ void tools::addLTOOptions(const ToolChain &ToolChain, const ArgList &Args,
CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb"); CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
else if (A->getOption().matches(options::OPT_gsce)) else if (A->getOption().matches(options::OPT_gsce))
CmdArgs.push_back("-plugin-opt=-debugger-tune=sce"); CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
else if (A->getOption().matches(options::OPT_gdbx))
CmdArgs.push_back("-plugin-opt=-debugger-tune=dbx");
else else
CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb"); CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
} }

View File

@ -18,6 +18,8 @@
// RUN: | FileCheck -check-prefix=G_STANDALONE -check-prefix=G_LLDB %s // RUN: | FileCheck -check-prefix=G_STANDALONE -check-prefix=G_LLDB %s
// RUN: %clang -### -c -gsce %s -target x86_64-linux-gnu 2>&1 \ // RUN: %clang -### -c -gsce %s -target x86_64-linux-gnu 2>&1 \
// RUN: | FileCheck -check-prefix=G_LIMITED -check-prefix=G_SCE %s // RUN: | FileCheck -check-prefix=G_LIMITED -check-prefix=G_SCE %s
// RUN: %clang -### -c -gdbx %s -target x86_64-linux-gnu 2>&1 \
// RUN: | FileCheck -check-prefix=G_LIMITED -check-prefix=G_DBX %s
// Android. // Android.
// Android should always generate DWARF4. // Android should always generate DWARF4.
@ -102,6 +104,12 @@
// RUN: %clang -### -c %s -gsce -target x86_64-unknown-linux 2>&1 \ // RUN: %clang -### -c %s -gsce -target x86_64-unknown-linux 2>&1 \
// RUN: | FileCheck -check-prefix=NOCI %s // RUN: | FileCheck -check-prefix=NOCI %s
// On the AIX, -g defaults to -gdbx and limited debug info.
// RUN: %clang -### -c -g %s -target powerpc-ibm-aix-xcoff 2>&1 \
// RUN: | FileCheck -check-prefix=G_LIMITED -check-prefix=G_DBX %s
// RUN: %clang -### -c -g %s -target powerpc64-ibm-aix-xcoff 2>&1 \
// RUN: | FileCheck -check-prefix=G_LIMITED -check-prefix=G_DBX %s
// RUN: %clang -### -c -gdwarf-2 %s 2>&1 \ // RUN: %clang -### -c -gdwarf-2 %s 2>&1 \
// RUN: | FileCheck -check-prefix=G_ONLY_DWARF2 %s // RUN: | FileCheck -check-prefix=G_ONLY_DWARF2 %s
// //
@ -294,6 +302,7 @@
// G_GDB: "-debugger-tuning=gdb" // G_GDB: "-debugger-tuning=gdb"
// G_LLDB: "-debugger-tuning=lldb" // G_LLDB: "-debugger-tuning=lldb"
// G_SCE: "-debugger-tuning=sce" // G_SCE: "-debugger-tuning=sce"
// G_DBX: "-debugger-tuning=dbx"
// //
// G_NOTUNING: "-cc1" // G_NOTUNING: "-cc1"
// G_NOTUNING-NOT: "-debugger-tuning=" // G_NOTUNING-NOT: "-debugger-tuning="

View File

@ -105,10 +105,11 @@ namespace llvm {
/// in DwarfDebug; if a given feature has a more specific command-line option, /// in DwarfDebug; if a given feature has a more specific command-line option,
/// that option should take precedence over the tuning. /// that option should take precedence over the tuning.
enum class DebuggerKind { enum class DebuggerKind {
Default, // No specific tuning requested. Default, ///< No specific tuning requested.
GDB, // Tune debug info for gdb. GDB, ///< Tune debug info for gdb.
LLDB, // Tune debug info for lldb. LLDB, ///< Tune debug info for lldb.
SCE // Tune debug info for SCE targets (e.g. PS4). SCE, ///< Tune debug info for SCE targets (e.g. PS4).
DBX ///< Tune debug info for dbx.
}; };
/// Enable abort calls when global instruction selection fails to lower/select /// Enable abort calls when global instruction selection fails to lower/select