Index: llvm/lib/ObjectYAML/ELFEmitter.cpp =================================================================== --- llvm/lib/ObjectYAML/ELFEmitter.cpp +++ llvm/lib/ObjectYAML/ELFEmitter.cpp @@ -260,7 +260,10 @@ if (C->Name.empty()) C->Name = StringRef(Twine(SuffixPrefix + Twine(I) + "]").str()) .copy(StringAlloc); - DocSections.insert(C->Name); + + if (!DocSections.insert(C->Name).second) + reportError("repeated section/fill name: '" + C->Name + + "' at YAML section/fill number " + Twine(I)); } std::vector ImplicitSections; @@ -1415,18 +1418,10 @@ template void ELFState::buildSectionIndex() { size_t SecNdx = -1; - StringSet<> Seen; - for (size_t I = 0; I < Doc.Chunks.size(); ++I) { - const std::unique_ptr &C = Doc.Chunks[I]; - bool IsSection = isa(C.get()); - if (IsSection) - ++SecNdx; - - if (!Seen.insert(C->Name).second) - reportError("repeated section/fill name: '" + C->Name + - "' at YAML section/fill number " + Twine(I)); - if (!IsSection || HasError) + for (const std::unique_ptr &C : Doc.Chunks) { + if (!isa(C.get())) continue; + ++SecNdx; if (!SN2I.addName(C->Name, SecNdx)) llvm_unreachable("buildSectionIndex() failed"); @@ -1489,6 +1484,8 @@ bool ELFState::writeELF(raw_ostream &OS, ELFYAML::Object &Doc, yaml::ErrorHandler EH) { ELFState State(Doc, EH); + if (State.HasError) + return false; // Finalize .strtab and .dynstr sections. We do that early because want to // finalize the string table builders before writing the content of the @@ -1496,9 +1493,6 @@ State.finalizeStrings(); State.buildSectionIndex(); - if (State.HasError) - return false; - State.buildSymbolIndexes(); std::vector PHeaders;