Commit ef4c7223 authored by Teng Qin's avatar Teng Qin Committed by Facebook Github Bot

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
parent 67811c1b
......@@ -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 <class Fn>
const ElfShdr* ElfFile::iterateSectionsWithTypes(
std::initializer_list<uint32_t> 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 <class Fn>
const char* ElfFile::iterateStrings(const ElfShdr& stringTable, Fn fn) const {
validateStringTable(stringTable);
......
......@@ -146,6 +146,15 @@ class ElfFile {
template <class Fn>
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 <class Fn>
const ElfShdr* iterateSectionsWithTypes(
std::initializer_list<uint32_t> types,
Fn fn) const;
/**
* Iterate over all symbols witin a given section.
*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment