Index: llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h =================================================================== --- llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h +++ llvm/trunk/include/llvm/ObjectYAML/ELFYAML.h @@ -25,6 +25,8 @@ namespace llvm { namespace ELFYAML { +StringRef dropUniqueSuffix(StringRef S); + // These types are invariant across 32/64-bit ELF, so for simplicity just // directly give them their exact sizes. We don't need to worry about // endianness because these are just the types in the YAMLIO structures, Index: llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp +++ llvm/trunk/lib/ObjectYAML/ELFEmitter.cpp @@ -340,7 +340,7 @@ return true; } -static StringRef dropUniqueSuffix(StringRef S) { +StringRef llvm::ELFYAML::dropUniqueSuffix(StringRef S) { size_t SuffixPos = S.rfind(" ["); if (SuffixPos == StringRef::npos) return S; @@ -371,7 +371,8 @@ assert(Sec && "It can't be null unless it is an implicit section. But all " "implicit sections should already have been handled above."); - SHeader.sh_name = DotShStrtab.getOffset(dropUniqueSuffix(Sec->Name)); + SHeader.sh_name = + DotShStrtab.getOffset(ELFYAML::dropUniqueSuffix(Sec->Name)); SHeader.sh_type = Sec->Type; if (Sec->Flags) SHeader.sh_flags = *Sec->Flags; @@ -473,7 +474,7 @@ if (Sym.NameIndex) Symbol.st_name = *Sym.NameIndex; else if (!Sym.Name.empty()) - Symbol.st_name = Strtab.getOffset(dropUniqueSuffix(Sym.Name)); + Symbol.st_name = Strtab.getOffset(ELFYAML::dropUniqueSuffix(Sym.Name)); Symbol.setBindingAndType(Sym.Binding, Sym.Type); if (!Sym.Section.empty()) @@ -962,7 +963,7 @@ if (Name.empty()) continue; - DotShStrtab.add(dropUniqueSuffix(Name)); + DotShStrtab.add(ELFYAML::dropUniqueSuffix(Name)); if (!SN2I.addName(Name, I)) reportError("repeated section name: '" + Name + "' at YAML section number " + Twine(I)); @@ -987,12 +988,12 @@ template void ELFState::finalizeStrings() { // Add the regular symbol names to .strtab section. for (const ELFYAML::Symbol &Sym : Doc.Symbols) - DotStrtab.add(dropUniqueSuffix(Sym.Name)); + DotStrtab.add(ELFYAML::dropUniqueSuffix(Sym.Name)); DotStrtab.finalize(); // Add the dynamic symbol names to .dynstr section. for (const ELFYAML::Symbol &Sym : Doc.DynamicSymbols) - DotDynstr.add(dropUniqueSuffix(Sym.Name)); + DotDynstr.add(ELFYAML::dropUniqueSuffix(Sym.Name)); // SHT_GNU_verdef and SHT_GNU_verneed sections might also // add strings to .dynstr section. Index: llvm/trunk/lib/ObjectYAML/ELFYAML.cpp =================================================================== --- llvm/trunk/lib/ObjectYAML/ELFYAML.cpp +++ llvm/trunk/lib/ObjectYAML/ELFYAML.cpp @@ -1152,6 +1152,7 @@ if (!IO.outputting()) { StringRef Name; IO.mapOptional("Name", Name, StringRef()); + Name = ELFYAML::dropUniqueSuffix(Name); if (ELFYAML::StackSizesSection::nameMatches(Name)) Section = std::make_unique(); Index: llvm/trunk/test/tools/yaml2obj/elf-stack-sizes.yaml =================================================================== --- llvm/trunk/test/tools/yaml2obj/elf-stack-sizes.yaml +++ llvm/trunk/test/tools/yaml2obj/elf-stack-sizes.yaml @@ -311,3 +311,34 @@ Type: SHT_PROGBITS Size: 0x1 Content: "1122" + +## Check we can describe multiple .stack_sizes sections using unique suffixes. + +# RUN: yaml2obj --docnum=14 %s -o %t11 +# RUN: llvm-readobj --sections --section-data %t11 | FileCheck %s --check-prefix=UNIQUE + +# UNIQUE: Name: .stack_sizes +# UNIQUE: SectionData ( +# UNIQUE-NEXT: 0000: 10000000 00000000 20 | + +# UNIQUE: Name: .stack_sizes +# UNIQUE: SectionData ( +# UNIQUE-NEXT: 0000: 30000000 00000000 40 | + +--- !ELF +FileHeader: + Class: ELFCLASS64 + Data: ELFDATA2LSB + Type: ET_EXEC + Machine: EM_X86_64 +Sections: + - Name: '.stack_sizes [1]' + Type: SHT_PROGBITS + Entries: + - Address: 0x10 + Size: 0x20 + - Name: '.stack_sizes [2]' + Type: SHT_PROGBITS + Entries: + - Address: 0x30 + Size: 0x40