diff --git a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp index 557ae1d3d1e..c90d84b6f21 100644 --- a/lib/CodeGen/AsmPrinter/DwarfDebug.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfDebug.cpp @@ -312,6 +312,13 @@ static StringRef getObjCMethodName(StringRef In) { return In.slice(In.find(' ') + 1, In.find(']')); } +// Helper for sorting sections into a stable output order. +static bool SectionSort(const MCSection *A, const MCSection *B) { + std::string LA = (A ? A->getLabelBeginName() : ""); + std::string LB = (B ? B->getLabelBeginName() : ""); + return LA < LB; +} + // Add the various names to the Dwarf accelerator table names. // TODO: Determine whether or not we should add names for programs // that do not have a DW_AT_name or DW_AT_linkage_name field - this @@ -1119,14 +1126,29 @@ void DwarfDebug::endSections() { } } - // Add terminating symbols for each section. + // Build a list of sections used. + std::vector Sections; for (SectionMapType::iterator it = SectionMap.begin(); it != SectionMap.end(); it++) { const MCSection *Section = it->first; + Sections.push_back(Section); + } + + // Sort the sections into order. + // This is only done to ensure consistent output order across different runs. + std::sort(Sections.begin(), Sections.end(), SectionSort); + + // Add terminating symbols for each section. + for (unsigned ID=0;IDGetTempSymbol(Section->getLabelEndName()); + // We can't call MCSection::getLabelEndName, as it's only safe to do so + // if we know the section name up-front. For user-created sections, the resulting + // label may not be valid to use as a label. (section names can use a greater + // set of characters on some systems) + Sym = Asm->GetTempSymbol("debug_end", ID); Asm->OutStreamer.SwitchSection(Section); Asm->OutStreamer.EmitLabel(Sym); } @@ -2745,12 +2767,6 @@ struct SymbolCUSorter { } }; -static bool SectionSort(const MCSection *A, const MCSection *B) { - std::string LA = (A ? A->getLabelBeginName() : ""); - std::string LB = (B ? B->getLabelBeginName() : ""); - return LA < LB; -} - static bool CUSort(const CompileUnit *A, const CompileUnit *B) { return (A->getUniqueID() < B->getUniqueID()); } diff --git a/test/DebugInfo/X86/dwarf-aranges.ll b/test/DebugInfo/X86/dwarf-aranges.ll index a2f0059ed25..fc493c5008d 100644 --- a/test/DebugInfo/X86/dwarf-aranges.ll +++ b/test/DebugInfo/X86/dwarf-aranges.ll @@ -1,47 +1,38 @@ -; RUN: llc < %s | FileCheck -check-prefix=CHECK-HEADER %s -; RUN: llc < %s | FileCheck -check-prefix=CHECK-CODE %s -; RUN: llc < %s | FileCheck -check-prefix=CHECK-DATA %s -; RUN: llc < %s | FileCheck -check-prefix=CHECK-BSS %s -; RUN: llc < %s | FileCheck -check-prefix=CHECK-CUSTOM %s +; RUN: llc < %s | FileCheck %s ; -- header -- -; CHECK-HEADER: .short 2 # DWARF Arange version number -; CHECK-HEADER-NEXT: .long .L.debug_info_begin0 -; CHECK-HEADER-NEXT: .byte 8 # Address Size (in bytes) -; CHECK-HEADER-NEXT: .byte 0 # Segment Size (in bytes) +; CHECK: .short 2 # DWARF Arange version number +; CHECK-NEXT: .long .L.debug_info_begin0 +; CHECK-NEXT: .byte 8 # Address Size (in bytes) +; CHECK-NEXT: .byte 0 # Segment Size (in bytes) ; -- alignment -- -; CHECK-HEADER-NEXT: .byte -; CHECK-HEADER-NEXT: .byte -; CHECK-HEADER-NEXT: .byte -; CHECK-HEADER-NEXT: .byte -; -- finish -- -; CHECK-HEADER: # ARange terminator - -; - it should have made one span covering all functions in this CU. -; CHECK-CODE: .short 2 # DWARF Arange version number -; CHECK-CODE: .quad .Lfunc_begin0 -; CHECK-CODE-NEXT: .Lset1 = .L.text_end-.Lfunc_begin0 -; CHECK-CODE: # ARange terminator - -; - it should have made one span covering all vars in this CU. -; CHECK-DATA: .short 2 # DWARF Arange version number -; CHECK-DATA: .quad some_data -; CHECK-DATA-NEXT: -some_data -; CHECK-DATA: # ARange terminator +; CHECK-NEXT: .byte +; CHECK-NEXT: .byte +; CHECK-NEXT: .byte +; CHECK-NEXT: .byte ; - it should have made one span for each symbol. -; CHECK-BSS: .short 2 # DWARF Arange version number -; CHECK-BSS: .quad some_bss -; CHECK-BSS-NEXT: .quad 4 -; CHECK-BSS: # ARange terminator +; CHECK-NEXT: .quad some_bss +; CHECK-NEXT: .quad 4 + +; - it should have made one span covering all vars in this CU. +; CHECK-NEXT: .quad some_data +; CHECK-NEXT: .Lset0 = .Ldebug_end1-some_data +; CHECK-NEXT: .quad .Lset0 + +; - it should have made one span covering all functions in this CU. +; CHECK-NEXT: .quad .Lfunc_begin0 +; CHECK-NEXT: .Lset1 = .Ldebug_end2-.Lfunc_begin0 +; CHECK-NEXT: .quad .Lset1 ; - it should have made one span covering all vars in this CU. -; CHECK-CUSTOM: .short 2 # DWARF Arange version number -; CHECK-CUSTOM: .quad some_other -; CHECK-CUSTOM-NEXT: -some_other -; CHECK-CUSTOM: # ARange terminator +; CHECK-NEXT: .quad some_other +; CHECK-NEXT: .Lset2 = .Ldebug_end3-some_other +; CHECK-NEXT: .quad .Lset2 +; -- finish -- +; CHECK-NEXT: # ARange terminator @@ -50,7 +41,7 @@ ; ; int some_data = 4; ; int some_bss; -; int some_other __attribute__ ((section ("strangesection"))) = 5; +; int some_other __attribute__ ((section ("strange+section"))) = 5; ; ; void some_code() ; { @@ -60,7 +51,7 @@ target triple = "x86_64-unknown-linux-gnu" @some_data = global i32 4, align 4 -@some_other = global i32 5, section "strangesection", align 4 +@some_other = global i32 5, section "strange+section", align 4 @some_bss = common global i32 0, align 4 define void @some_code() { diff --git a/test/DebugInfo/X86/multiple-aranges.ll b/test/DebugInfo/X86/multiple-aranges.ll index 08c4fa66845..28b99ee3caa 100644 --- a/test/DebugInfo/X86/multiple-aranges.ll +++ b/test/DebugInfo/X86/multiple-aranges.ll @@ -27,7 +27,7 @@ ; CHECK-NEXT: .byte 255 ; CHECK-NEXT: .byte 255 ; CHECK-NEXT: .quad rainbows -; CHECK-NEXT: .Lset1 = .L.data_end-rainbows +; CHECK-NEXT: .Lset1 = .Ldebug_end0-rainbows ; CHECK-NEXT: .quad .Lset1 ; CHECK-NEXT: .quad 0 # ARange terminator ; CHECK-NEXT: .quad 0