diff options
Diffstat (limited to 'llvm/lib/CodeGen/AsmPrinter')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 44 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h | 37 | 
2 files changed, 71 insertions, 10 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 45875667027..4621ecbb510 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -76,6 +76,17 @@ static cl::opt<bool> GenerateARangeSection("generate-arange-section",                                             cl::desc("Generate dwarf aranges"),                                             cl::init(false)); +static cl::opt<DebuggerKind> +DebuggerTuningOpt("debugger-tune", +                  cl::desc("Tune debug info for a particular debugger"), +                  cl::init(DebuggerKind::Default), +                  cl::values( +                      clEnumValN(DebuggerKind::GDB, "gdb", "gdb"), +                      clEnumValN(DebuggerKind::LLDB, "lldb", "lldb"), +                      clEnumValN(DebuggerKind::SCE, "sce", +                                 "SCE targets (e.g. PS4)"), +                      clEnumValEnd)); +  namespace {  enum DefaultOnOff { Default, Enable, Disable };  } @@ -197,32 +208,44 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)        UsedNonDefaultText(false),        SkeletonHolder(A, "skel_string", DIEValueAllocator),        IsDarwin(Triple(A->getTargetTriple()).isOSDarwin()), -      IsPS4(Triple(A->getTargetTriple()).isPS4()),        AccelNames(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,                                         dwarf::DW_FORM_data4)),        AccelObjC(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,                                        dwarf::DW_FORM_data4)),        AccelNamespace(DwarfAccelTable::Atom(dwarf::DW_ATOM_die_offset,                                             dwarf::DW_FORM_data4)), -      AccelTypes(TypeAtoms) { +      AccelTypes(TypeAtoms), DebuggerTuning(DebuggerKind::Default) {    CurFn = nullptr;    CurMI = nullptr; +  Triple TT(Asm->getTargetTriple()); + +  // Make sure we know our "debugger tuning."  The command-line option takes +  // precedence; fall back to triple-based defaults. +  if (DebuggerTuningOpt != DebuggerKind::Default) +    DebuggerTuning = DebuggerTuningOpt; +  else if (IsDarwin || TT.isOSFreeBSD()) +    DebuggerTuning = DebuggerKind::LLDB; +  else if (TT.isPS4CPU()) +    DebuggerTuning = DebuggerKind::SCE; +  else +    DebuggerTuning = DebuggerKind::GDB; -  // Turn on accelerator tables for Darwin by default, pubnames by -  // default for non-Darwin/PS4, and handle split dwarf. +  // Turn on accelerator tables for LLDB by default.    if (DwarfAccelTables == Default) -    HasDwarfAccelTables = IsDarwin; +    HasDwarfAccelTables = tuneForLLDB();    else      HasDwarfAccelTables = DwarfAccelTables == Enable; +  // Handle split DWARF. Off by default for now.    if (SplitDwarf == Default)      HasSplitDwarf = false;    else      HasSplitDwarf = SplitDwarf == Enable; +  // Pubnames/pubtypes on by default for GDB.    if (DwarfPubSections == Default) -    HasDwarfPubSections = !IsDarwin && !IsPS4; +    HasDwarfPubSections = tuneForGDB();    else      HasDwarfPubSections = DwarfPubSections == Enable; @@ -230,9 +253,12 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M)    DwarfVersion = DwarfVersionNumber ? DwarfVersionNumber                                      : MMI->getModule()->getDwarfVersion(); -  // Darwin and PS4 use the standard TLS opcode (defined in DWARF 3). -  // Everybody else uses GNU's. -  UseGNUTLSOpcode = !(IsDarwin || IsPS4) || DwarfVersion < 3; +  // Work around a GDB bug. GDB doesn't support the standard opcode; +  // SCE doesn't support GNU's; LLDB prefers the standard opcode, which +  // is defined as of DWARF 3. +  // See GDB bug 11616 - DW_OP_form_tls_address is unimplemented +  // https://sourceware.org/bugzilla/show_bug.cgi?id=11616 +  UseGNUTLSOpcode = tuneForGDB() || DwarfVersion < 3;    Asm->OutStreamer->getContext().setDwarfVersion(DwarfVersion); diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h index 36502225c29..57bb8d0229d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfDebug.h @@ -203,6 +203,30 @@ struct SymbolCU {    DwarfCompileUnit *CU;  }; +/// Identify a debugger for "tuning" the debug info. +/// +/// The "debugger tuning" concept allows us to present a more intuitive +/// interface that unpacks into different sets of defaults for the various +/// individual feature-flag settings, that suit the preferences of the +/// various debuggers.  However, it's worth remembering that debuggers are +/// not the only consumers of debug info, and some variations in DWARF might +/// better be treated as target/platform issues. Fundamentally, +/// o if the feature is useful (or not) to a particular debugger, regardless +///   of the target, that's a tuning decision; +/// o if the feature is useful (or not) on a particular platform, regardless +///   of the debugger, that's a target decision. +/// It's not impossible to see both factors in some specific case. +/// +/// The "tuning" should be used to set defaults for individual feature flags +/// in DwarfDebug; if a given feature has a more specific command-line option, +/// that option should take precedence over the tuning. +enum class DebuggerKind { +  Default,  // No specific tuning requested. +  GDB,      // Tune debug info for gdb. +  LLDB,     // Tune debug info for lldb. +  SCE       // Tune debug info for SCE targets (e.g. PS4). +}; +  /// Collects and handles dwarf debug information.  class DwarfDebug : public AsmPrinterHandler {    /// Target of Dwarf emission. @@ -338,7 +362,6 @@ class DwarfDebug : public AsmPrinterHandler {    /// True iff there are multiple CUs in this module.    bool SingleCU;    bool IsDarwin; -  bool IsPS4;    AddressPool AddrPool; @@ -349,6 +372,9 @@ class DwarfDebug : public AsmPrinterHandler {    DenseMap<const Function *, DISubprogram *> FunctionDIs; +  // Identify a debugger for "tuning" the debug info. +  DebuggerKind DebuggerTuning; +    MCDwarfDwoLineTable *getDwoLineTable(const DwarfCompileUnit &);    const SmallVectorImpl<std::unique_ptr<DwarfUnit>> &getUnits() { @@ -565,6 +591,15 @@ public:    /// standard DW_OP_form_tls_address opcode    bool useGNUTLSOpcode() const { return UseGNUTLSOpcode; } +  /// \defgroup DebuggerTuning Predicates to tune DWARF for a given debugger. +  /// +  /// Returns whether we are "tuning" for a given debugger. +  /// @{ +  bool tuneForGDB() const { return DebuggerTuning == DebuggerKind::GDB; } +  bool tuneForLLDB() const { return DebuggerTuning == DebuggerKind::LLDB; } +  bool tuneForSCE() const { return DebuggerTuning == DebuggerKind::SCE; } +  /// @} +    // Experimental DWARF5 features.    /// Returns whether or not to emit tables that dwarf consumers can  | 

