mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Fixed a bug with section names containing special characters.
Changed the dwarf aranges code to not use getLabelEndName, as it turns out it's not reliable to call that given user-defined section names. Section names can have characters in that aren't representable as symbol names. The dwarf-aranges test case has been updated to include a special character, to check this. This fixes pr17416. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191932 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
03e84c9df9
commit
7c9659a3b2
@ -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<const MCSection *> 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;ID<Sections.size();ID++) {
|
||||
const MCSection *Section = Sections[ID];
|
||||
MCSymbol *Sym = NULL;
|
||||
|
||||
if (Section) {
|
||||
Sym = Asm->GetTempSymbol(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());
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
; <text section> - 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
|
||||
|
||||
; <data section> - 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
|
||||
|
||||
; <common symbols> - 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
|
||||
|
||||
; <data section> - 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
|
||||
|
||||
; <text section> - 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
|
||||
|
||||
; <other sections> - 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() {
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user