[libcxx-commits] [PATCH] D75781: Rework findUnwindSectionsByPhdr to be more optimal.

Sterling Augustine via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 9 17:50:02 PDT 2020

saugustine marked 3 inline comments as done.
saugustine added inline comments.

Comment at: libunwind/src/AddressSpace.hpp:463-464
-  if (cbdata->targetAddr < pinfo->dlpi_addr)
+int findUnwindSectionsByPhdr(struct dl_phdr_info *pinfo, size_t, void *data) {
+  auto cbdata = static_cast<dl_iterate_cb_data *>(data);
+  if (pinfo->dlpi_phnum == 0)
     return 0;
saugustine wrote:
> jgorbe wrote:
> > Is this early check no longer necessary/beneficial?
> I think it is still needed by the reverse-iteration below, which assumes there is one or more phdrs.
> This is likely always true--Would dl_iterate_phdr ever pass a phdr-less pinfo? But I don't think dl_iterate_phdr actually guarantees that, at least not in any documentation I have read.
Actually, I responded to the wrong question. You are right that this code is still useful. Restored.

Comment at: libunwind/src/AddressSpace.hpp:502
-  if (found_obj && found_hdr) {
-    cbdata->sects->dwarf_section_length = object_length;
-    return true;
-  } else {
-    return false;
-  }
+  cbdata->sects->dwarf_section_length = 0;
+  return 0;
jgorbe wrote:
> The old code only touches `dwarf_section_length` if both phdrs are found, whereas this patch always resets it to 0 after the loop if it didn't find both. Is this intentional?
It is. I believe the code is equivalent if dwarf_section_length is always zero on entry (which it is). The new code avoids carrying object_length as a separate variable, and trying to figure out what it means.

  rG LLVM Github Monorepo



More information about the libcxx-commits mailing list