Author: Georgii Rymar Date: 2020-11-25T11:04:13+03:00 New Revision: ec0b927e4aa863dd610b97f3d6e996ca05475846
URL: https://github.com/llvm/llvm-project/commit/ec0b927e4aa863dd610b97f3d6e996ca05475846 DIFF: https://github.com/llvm/llvm-project/commit/ec0b927e4aa863dd610b97f3d6e996ca05475846.diff LOG: [llvm-readelf/obj] - Deduplicate the logic that prints notes. NFCI. We have a similar logic for LLVM/GNU styles that can be deduplicated. This will allow to replace `reportError` calls with `reportUniqueWarning` calls in a single place. Differential revision: https://reviews.llvm.org/D92018 Added: Modified: llvm/tools/llvm-readobj/ELFDumper.cpp Removed: ################################################################################ diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp index d1a5aa7e0e5d..3676ee9724d3 100644 --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -5541,6 +5541,54 @@ const StringRef getNoteTypeName(const typename ELFT::Note &Note, return FindNote(GenericNoteTypes); } +template <class ELFT> +static void printNotesHelper( + const ELFDumper<ELFT> &Dumper, + llvm::function_ref<void(Optional<StringRef>, typename ELFT::Off, + typename ELFT::Addr)> + StartNotesFn, + llvm::function_ref<void(const typename ELFT::Note &)> ProcessNoteFn, + llvm::function_ref<void()> FinishNotesFn = []() {}) { + const ELFFile<ELFT> &Obj = *Dumper.getElfObject().getELFFile(); + + ArrayRef<typename ELFT::Shdr> Sections = cantFail(Obj.sections()); + if (Obj.getHeader().e_type != ELF::ET_CORE && !Sections.empty()) { + for (const typename ELFT::Shdr &S : Sections) { + if (S.sh_type != SHT_NOTE) + continue; + StartNotesFn(expectedToOptional(Obj.getSectionName(S)), S.sh_offset, + S.sh_size); + Error Err = Error::success(); + for (const typename ELFT::Note &Note : Obj.notes(S, Err)) + ProcessNoteFn(Note); + if (Err) + reportError(std::move(Err), Dumper.getElfObject().getFileName()); + FinishNotesFn(); + } + return; + } + + Expected<ArrayRef<typename ELFT::Phdr>> PhdrsOrErr = Obj.program_headers(); + if (!PhdrsOrErr) { + Dumper.reportUniqueWarning(createError( + "unable to read program headers to locate the PT_NOTE segment: " + + toString(PhdrsOrErr.takeError()))); + return; + } + + for (const typename ELFT::Phdr &P : *PhdrsOrErr) { + if (P.p_type != PT_NOTE) + continue; + StartNotesFn(/*SecName=*/None, P.p_offset, P.p_filesz); + Error Err = Error::success(); + for (const typename ELFT::Note Note : Obj.notes(P, Err)) + ProcessNoteFn(Note); + if (Err) + reportError(std::move(Err), Dumper.getElfObject().getFileName()); + FinishNotesFn(); + } +} + template <class ELFT> void GNUStyle<ELFT>::printNotes() { auto PrintHeader = [&](Optional<StringRef> SecName, const typename ELFT::Off Offset, @@ -5603,39 +5651,7 @@ template <class ELFT> void GNUStyle<ELFT>::printNotes() { } }; - ArrayRef<Elf_Shdr> Sections = cantFail(this->Obj.sections()); - if (this->Obj.getHeader().e_type != ELF::ET_CORE && !Sections.empty()) { - for (const Elf_Shdr &S : Sections) { - if (S.sh_type != SHT_NOTE) - continue; - PrintHeader(expectedToOptional(this->Obj.getSectionName(S)), S.sh_offset, - S.sh_size); - Error Err = Error::success(); - for (const Elf_Note Note : this->Obj.notes(S, Err)) - ProcessNote(Note); - if (Err) - reportError(std::move(Err), this->FileName); - } - } else { - Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = this->Obj.program_headers(); - if (!PhdrsOrErr) { - this->reportUniqueWarning(createError( - "unable to read program headers to locate the PT_NOTE segment: " + - toString(PhdrsOrErr.takeError()))); - return; - } - - for (const Elf_Phdr &P : *PhdrsOrErr) { - if (P.p_type != PT_NOTE) - continue; - PrintHeader(/*SecName=*/None, P.p_offset, P.p_filesz); - Error Err = Error::success(); - for (const Elf_Note Note : this->Obj.notes(P, Err)) - ProcessNote(Note); - if (Err) - reportError(std::move(Err), this->FileName); - } - } + printNotesHelper(this->dumper(), PrintHeader, ProcessNote); } template <class ELFT> void GNUStyle<ELFT>::printELFLinkerOptions() { @@ -6828,14 +6844,18 @@ static void printCoreNoteLLVMStyle(const CoreNote &Note, ScopedPrinter &W) { template <class ELFT> void LLVMStyle<ELFT>::printNotes() { ListScope L(W, "Notes"); - auto PrintHeader = [&](Optional<StringRef> SecName, - const typename ELFT::Off Offset, - const typename ELFT::Addr Size) { + std::unique_ptr<DictScope> NoteScope; + auto StartNotes = [&](Optional<StringRef> SecName, + const typename ELFT::Off Offset, + const typename ELFT::Addr Size) { + NoteScope = std::make_unique<DictScope>(W, "NoteSection"); W.printString("Name", SecName ? *SecName : "<?>"); W.printHex("Offset", Offset); W.printHex("Size", Size); }; + auto EndNotes = [&] { NoteScope.reset(); }; + auto ProcessNote = [&](const Elf_Note &Note) { DictScope D2(W, "Note"); StringRef Name = Note.getName(); @@ -6882,41 +6902,7 @@ template <class ELFT> void LLVMStyle<ELFT>::printNotes() { } }; - ArrayRef<Elf_Shdr> Sections = cantFail(this->Obj.sections()); - if (this->Obj.getHeader().e_type != ELF::ET_CORE && !Sections.empty()) { - for (const Elf_Shdr &S : Sections) { - if (S.sh_type != SHT_NOTE) - continue; - DictScope D(W, "NoteSection"); - PrintHeader(expectedToOptional(this->Obj.getSectionName(S)), S.sh_offset, - S.sh_size); - Error Err = Error::success(); - for (auto Note : this->Obj.notes(S, Err)) - ProcessNote(Note); - if (Err) - reportError(std::move(Err), this->FileName); - } - } else { - Expected<ArrayRef<Elf_Phdr>> PhdrsOrErr = this->Obj.program_headers(); - if (!PhdrsOrErr) { - this->reportUniqueWarning(createError( - "unable to read program headers to locate the PT_NOTE segment: " + - toString(PhdrsOrErr.takeError()))); - return; - } - - for (const Elf_Phdr &P : *PhdrsOrErr) { - if (P.p_type != PT_NOTE) - continue; - DictScope D(W, "NoteSection"); - PrintHeader(/*SecName=*/None, P.p_offset, P.p_filesz); - Error Err = Error::success(); - for (auto Note : this->Obj.notes(P, Err)) - ProcessNote(Note); - if (Err) - reportError(std::move(Err), this->FileName); - } - } + printNotesHelper(this->dumper(), StartNotes, ProcessNote, EndNotes); } template <class ELFT> void LLVMStyle<ELFT>::printELFLinkerOptions() { _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits