diff --git a/llvm/test/tools/obj2yaml/ELF/DWARF/debug-str.yaml b/llvm/test/tools/obj2yaml/ELF/DWARF/debug-str.yaml new file mode 100644 --- /dev/null +++ b/llvm/test/tools/obj2yaml/ELF/DWARF/debug-str.yaml @@ -0,0 +1,80 @@ +## Test how we dump the .debug_str section. + +## a) Test dumping a .debug_str section with a default section header. + +# RUN: yaml2obj --docnum=1 %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefix=BASIC --implicit-check-not='Name: .debug_str' + +## b) Test dumping a .debug_str section whose section header properties are overridden. + +## Override the sh_type field. +# RUN: yaml2obj --docnum=1 -DTYPE=STRTAB %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON \ +# RUN: -DTYPE=STRTAB -DFLAGS="[ SHF_MERGE, SHF_STRINGS ]" -DADDRALIGN=0001 -DENTSIZE=0001 + +## Override the sh_flags field. +# RUN: yaml2obj --docnum=1 -DFLAGS=[SHF_ALLOC] %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON \ +# RUN: -DTYPE=PROGBITS -DFLAGS="[ SHF_ALLOC ]" -DADDRALIGN=0001 -DENTSIZE=0001 + +## Override the sh_link field. +# RUN: yaml2obj --docnum=1 -DLINK=.sec %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON,LINK \ +# RUN: -DTYPE=PROGBITS -DFLAGS="[ SHF_MERGE, SHF_STRINGS ]" -DLINK=.sec -DADDRALIGN=0001 -DENTSIZE=0001 + +## Override the sh_addr field. +# RUN: yaml2obj --docnum=1 -DADDRESS=0x2020 %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON,ADDRESS \ +# RUN: -DTYPE=PROGBITS -DFLAGS="[ SHF_MERGE, SHF_STRINGS ]" -DADDRALIGN=0001 -DENTSIZE=0001 -DADDRESS=2020 + +## Override the sh_addralign field +# RUN: yaml2obj --docnum=1 -DADDRALIGN=3 %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON \ +# RUN: -DTYPE=PROGBITS -DFLAGS="[ SHF_MERGE, SHF_STRINGS ]" -DADDRALIGN=0003 -DENTSIZE=0001 + +## Override the sh_entsize field. +# RUN: yaml2obj --docnum=1 -DENTSIZE=3 %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON \ +# RUN: -DTYPE=PROGBITS -DFLAGS="[ SHF_MERGE, SHF_STRINGS ]" -DADDRALIGN=0001 -DENTSIZE=0003 + +## Override the sh_info field. +# RUN: yaml2obj --docnum=1 -DINFO=3 %s | obj2yaml | \ +# RUN: FileCheck %s --check-prefixes=BASIC,COMMON,INFO \ +# RUN: -DTYPE=PROGBITS -DFLAGS="[ SHF_MERGE, SHF_STRINGS ]" -DINFO=0003 -DADDRALIGN=0001 -DENTSIZE=0001 + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC +Sections: + - Name: .debug_str + Type: SHT_[[TYPE=PROGBITS]] + Flags: [[FLAGS=]] + Link: [[LINK='']] + EntSize: [[ENTSIZE=1]] + Info: [[INFO=]] + AddressAlign: [[ADDRALIGN=1]] + Address: [[ADDRESS=]] + - Name: .sec + Type: SHT_PROGBITS +DWARF: + debug_str: + - a + - b + - abc + +# COMMON: - Name: .debug_str +# COMMON-NEXT: Type: SHT_[[TYPE]] +# COMMON-NEXT: Flags: [[FLAGS]] +# LINK-NEXT: Link: .sec +# ADDRESS-NEXT: Address: 0x000000000000[[ADDRESS]] +# COMMON-NEXT: AddressAlign: 0x000000000000[[ADDRALIGN]] +# COMMON-NEXT: EntSize: 0x000000000000[[ENTSIZE]] +# INFO-NEXT: Info: 0x000000000000[[INFO]] +# BASIC: DWARF: +# BASIC-NEXT: debug_str: +# BASIC-NEXT: - a +# BASIC-NEXT: - b +# BASIC-NEXT: - abc +# BASIC-NEXT: ... diff --git a/llvm/tools/obj2yaml/elf2yaml.cpp b/llvm/tools/obj2yaml/elf2yaml.cpp --- a/llvm/tools/obj2yaml/elf2yaml.cpp +++ b/llvm/tools/obj2yaml/elf2yaml.cpp @@ -197,12 +197,21 @@ // entry but their section headers may have special flags, entry size, address // alignment, etc. We will preserve the header for them under such // circumstances. - if (DWARF && DWARF->getNonEmptySectionNames().count(S.Name.substr(1))) { + StringRef SecName = S.Name.substr(1); + if (DWARF && DWARF->getNonEmptySectionNames().count(SecName)) { if (const ELFYAML::RawContentSection *RawSec = - dyn_cast(&S)) - return RawSec->Type != ELF::SHT_PROGBITS || RawSec->Flags || - !RawSec->Link.empty() || RawSec->Info || - RawSec->AddressAlign != 1 || RawSec->EntSize; + dyn_cast(&S)) { + if (RawSec->Type != ELF::SHT_PROGBITS || !RawSec->Link.empty() || + RawSec->Info || RawSec->AddressAlign != 1 || RawSec->Address) + return true; + + if (SecName == "debug_str") + return !(RawSec->EntSize && (uint64_t)*RawSec->EntSize == 1) || + RawSec->Flags.getValueOr(ELFYAML::ELF_SHF(0)) != + ELFYAML::ELF_SHF(ELF::SHF_MERGE | ELF::SHF_STRINGS); + + return RawSec->EntSize || RawSec->Flags; + } } // Normally we use "Symbols:" and "DynamicSymbols:" to describe contents of @@ -404,6 +413,8 @@ if (RawSec->Name == ".debug_aranges") Err = dumpDebugARanges(*DWARFCtx.get(), DWARF); + else if (RawSec->Name == ".debug_str") + dumpDebugStrings(*DWARFCtx.get(), DWARF); // If the DWARF section cannot be successfully parsed, emit raw content // instead of an entry in the DWARF section of the YAML.