From 14ce9f1d253472b73689787c28808dd2ade6281d Mon Sep 17 00:00:00 2001 From: Michael Gottesman Date: Wed, 4 Sep 2013 04:31:56 +0000 Subject: [PATCH] Revert "Remove the darwin gdb option, that version of gdb is now dead and the rest of the compatibility should be done on a dwarf-N level." This reverts commit r189903. This commit broke the phase 1 buildbot for a while. http://lab.llvm.org:8013/builders/clang-x86_64-darwin11-nobootstrap-RAincremental/builds/6684 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189913 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 26 +++++++++++++++---- lib/CodeGen/AsmPrinter/DwarfDebug.cpp | 17 ++++++++++-- .../DebugInfo/X86/debug-info-static-member.ll | 3 +++ test/DebugInfo/X86/linkage-name.ll | 2 +- 4 files changed, 40 insertions(+), 8 deletions(-) diff --git a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 517ace6dfca..7b3842811a3 100644 --- a/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -100,7 +100,7 @@ int64_t CompileUnit::getDefaultLowerBound() const { /// addFlag - Add a flag that is true. void CompileUnit::addFlag(DIE *Die, uint16_t Attribute) { - if (DD->getDwarfVersion() >= 4) + if (!DD->useDarwinGDBCompat()) Die->addValue(Attribute, dwarf::DW_FORM_flag_present, DIEIntegerOne); else @@ -1242,6 +1242,17 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { // Add function template parameters. addTemplateParams(*SPDie, SP.getTemplateParams()); + // Unfortunately this code needs to stay here instead of below the + // AT_specification code in order to work around a bug in older + // gdbs that requires the linkage name to resolve multiple template + // functions. + // TODO: Remove this set of code when we get rid of the old gdb + // compatibility. + StringRef LinkageName = SP.getLinkageName(); + if (!LinkageName.empty() && DD->useDarwinGDBCompat()) + addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, + GlobalValue::getRealLinkageName(LinkageName)); + // If this DIE is going to refer declaration info using AT_specification // then there is no need to add other attributes. if (DeclDie) { @@ -1253,8 +1264,7 @@ DIE *CompileUnit::getOrCreateSubprogramDIE(DISubprogram SP) { } // Add the linkage name if we have one. - StringRef LinkageName = SP.getLinkageName(); - if (!LinkageName.empty()) + if (!LinkageName.empty() && !DD->useDarwinGDBCompat()) addString(SPDie, dwarf::DW_AT_MIPS_linkage_name, GlobalValue::getRealLinkageName(LinkageName)); @@ -1449,15 +1459,21 @@ void CompileUnit::createGlobalVariableDIE(const MDNode *N) { } else { addBlock(VariableDIE, dwarf::DW_AT_location, 0, Block); } - // Add the linkage name. + // Add linkage name. StringRef LinkageName = GV.getLinkageName(); - if (!LinkageName.empty()) + if (!LinkageName.empty()) { // From DWARF4: DIEs to which DW_AT_linkage_name may apply include: // TAG_common_block, TAG_constant, TAG_entry_point, TAG_subprogram and // TAG_variable. addString(IsStaticMember && VariableSpecDIE ? VariableSpecDIE : VariableDIE, dwarf::DW_AT_MIPS_linkage_name, GlobalValue::getRealLinkageName(LinkageName)); + // In compatibility mode with older gdbs we put the linkage name on both + // the TAG_variable DIE and on the TAG_member DIE. + if (IsStaticMember && VariableSpecDIE && DD->useDarwinGDBCompat()) + addString(VariableDIE, dwarf::DW_AT_MIPS_linkage_name, + GlobalValue::getRealLinkageName(LinkageName)); + } } else if (const ConstantInt *CI = dyn_cast_or_null(GV.getConstant())) { // AT_const_value was added when the static member was created. To avoid diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 3e1877dc951..ce684ffe80a 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -84,6 +84,14 @@ DwarfAccelTables("dwarf-accel-tables", cl::Hidden, clEnumVal(Disable, "Disabled"), clEnumValEnd), cl::init(Default)); +static cl::opt +DarwinGDBCompat("darwin-gdb-compat", cl::Hidden, + cl::desc("Compatibility with Darwin gdb."), + cl::values(clEnumVal(Default, "Default for platform"), + clEnumVal(Enable, "Enabled"), + clEnumVal(Disable, "Disabled"), clEnumValEnd), + cl::init(Default)); + static cl::opt SplitDwarf("split-dwarf", cl::Hidden, cl::desc("Output prototype dwarf split debug info."), @@ -198,6 +206,11 @@ DwarfDebug::DwarfDebug(AsmPrinter *A, Module *M) // and handle split dwarf. bool IsDarwin = Triple(A->getTargetTriple()).isOSDarwin(); + if (DarwinGDBCompat == Default) + IsDarwinGDBCompat = IsDarwin; + else + IsDarwinGDBCompat = DarwinGDBCompat == Enable; + if (DwarfAccelTables == Default) HasDwarfAccelTables = IsDarwin; else @@ -1885,10 +1898,10 @@ void DwarfDebug::emitSectionLabels() { DwarfLineSectionSym = emitSectionSym(Asm, TLOF.getDwarfLineSection(), "section_line"); emitSectionSym(Asm, TLOF.getDwarfLocSection()); - if (HasDwarfPubSections) { + if (HasDwarfPubSections) emitSectionSym(Asm, TLOF.getDwarfPubNamesSection()); + if (useDarwinGDBCompat() || HasDwarfPubSections) emitSectionSym(Asm, TLOF.getDwarfPubTypesSection()); - } DwarfStrSectionSym = emitSectionSym(Asm, TLOF.getDwarfStrSection(), "info_string"); if (useSplitDwarf()) { diff --git a/test/DebugInfo/X86/debug-info-static-member.ll b/test/DebugInfo/X86/debug-info-static-member.ll index 188703c100b..4378115c6fa 100644 --- a/test/DebugInfo/X86/debug-info-static-member.ll +++ b/test/DebugInfo/X86/debug-info-static-member.ll @@ -151,6 +151,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; DARWINP: DW_AT_external ; DARWINP: DW_AT_declaration ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x03) +; DARWINP: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1aE" ; DARWINP: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "const_a" ; DARWINP: DW_AT_external @@ -160,6 +161,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; DARWINP: 0x[[DECL_B:[0-9a-f]+]]: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "b" ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x02) +; DARWINP: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1bE" ; DARWINP: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "const_b" ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x02) @@ -167,6 +169,7 @@ declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone ; DARWINP: 0x[[DECL_C:[0-9a-f]+]]: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "c" ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x01) +; DARWINP: DW_AT_MIPS_linkage_name {{.*}} "_ZN1C1cE" ; DARWINP: DW_TAG_member ; DARWINP-NEXT: DW_AT_name {{.*}} "const_c" ; DARWINP: DW_AT_accessibility [DW_FORM_data1] (0x01) diff --git a/test/DebugInfo/X86/linkage-name.ll b/test/DebugInfo/X86/linkage-name.ll index 81fcc27b0b7..27fb0f79d76 100644 --- a/test/DebugInfo/X86/linkage-name.ll +++ b/test/DebugInfo/X86/linkage-name.ll @@ -1,4 +1,4 @@ -; RUN: llc -mtriple=x86_64-macosx %s -o %t -filetype=obj +; RUN: llc -mtriple=x86_64-macosx -darwin-gdb-compat=Disable %s -o %t -filetype=obj ; RUN: llvm-dwarfdump -debug-dump=info %t | FileCheck %s ; CHECK: DW_TAG_subprogram [9] *