From ef4c72233eea8e9ef283dc74a3f48dc4e755e35a Mon Sep 17 00:00:00 2001 From: Teng Qin Date: Wed, 8 Nov 2017 21:43:58 -0800 Subject: [PATCH] Add a multi-type version of iterateSectionsWithType Summary: When using `folly::symbolizer`, it's very often that we want to use `iterateSectionsWithType` iterate through sections of a few types using the same callback. Current approach would require iterating the section header multiple times. This Diff add `iterateSectionsWithTypes`, which is basically just `iterateSectionsWithType` but accepts multiple section types. It is very similar to D6279651. However, in this Diff we did not change implementation of `getDefinitionByAddress` and `getSymbolByName`, since going through `.dynsym` separately would improve the efficiency of single-address or single-symbol lookup. However, for the use cases that we want to iterate through all symbols of an ELF file, this new interface would be useful. Reviewed By: anakryiko, yfeldblum Differential Revision: D6281449 fbshipit-source-id: f9afe0a0e95d9fafcd041014abad8ca86d1a882f --- folly/experimental/symbolizer/Elf-inl.h | 10 ++++++++++ folly/experimental/symbolizer/Elf.h | 11 ++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/folly/experimental/symbolizer/Elf-inl.h b/folly/experimental/symbolizer/Elf-inl.h index 3e2f4dcf..51890e40 100644 --- a/folly/experimental/symbolizer/Elf-inl.h +++ b/folly/experimental/symbolizer/Elf-inl.h @@ -51,6 +51,16 @@ const ElfShdr* ElfFile::iterateSectionsWithType(uint32_t type, Fn fn) const { [&](const ElfShdr& sh) { return sh.sh_type == type && fn(sh); }); } +template +const ElfShdr* ElfFile::iterateSectionsWithTypes( + std::initializer_list types, + Fn fn) const { + return iterateSections([&](const ElfShdr& sh) { + auto const it = std::find(types.begin(), types.end(), sh.sh_type); + return it != types.end() && fn(sh); + }); +} + template const char* ElfFile::iterateStrings(const ElfShdr& stringTable, Fn fn) const { validateStringTable(stringTable); diff --git a/folly/experimental/symbolizer/Elf.h b/folly/experimental/symbolizer/Elf.h index 477d8798..a4f5afd2 100644 --- a/folly/experimental/symbolizer/Elf.h +++ b/folly/experimental/symbolizer/Elf.h @@ -140,12 +140,21 @@ class ElfFile { const ElfShdr* iterateSections(Fn fn) const; /** - * Iterate over all sections with a given type. Similar to + * Iterate over all sections with a given type. Similar to * iterateSections(), but filtered only for sections with the given type. */ template const ElfShdr* iterateSectionsWithType(uint32_t type, Fn fn) const; + /** + * Iterate over all sections with a given types. Similar to + * iterateSectionWithTypes(), but filtered on multiple types. + */ + template + const ElfShdr* iterateSectionsWithTypes( + std::initializer_list types, + Fn fn) const; + /** * Iterate over all symbols witin a given section. * -- 2.34.1