Skip to content

Commit b9c66f7

Browse files
committed
Read machO sections section by section
This changes how ReflectionContext reads machO reflection sections by reading them individually instead of as one big memory block spanning from the first to the last section (and including whatever else is in between). This change will enable an optimization on LLDB's side where, if we're reading read-only data, we read from the file-cache instead of the child process, which should speed up debugging when working with remote processes. (cherry picked from commit b54d426)
1 parent 1fe90db commit b9c66f7

File tree

1 file changed

+7
-35
lines changed

1 file changed

+7
-35
lines changed

include/swift/Reflection/ReflectionContext.h

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -205,36 +205,7 @@ class ReflectionContext
205205
return false;
206206

207207
auto Slide = ImageStart.getAddressData() - Command->vmaddr;
208-
std::string Prefix = "__swift5";
209-
uint64_t RangeStart = UINT64_MAX;
210-
uint64_t RangeEnd = UINT64_MAX;
211208
auto SectionsBuf = reinterpret_cast<const char *>(Sections.get());
212-
for (unsigned I = 0; I < NumSect; ++I) {
213-
auto S = reinterpret_cast<typename T::Section *>(
214-
SectionsBuf + (I * sizeof(typename T::Section)));
215-
if (strncmp(S->sectname, Prefix.c_str(), strlen(Prefix.c_str())) != 0)
216-
continue;
217-
if (RangeStart == UINT64_MAX && RangeEnd == UINT64_MAX) {
218-
RangeStart = S->addr + Slide;
219-
RangeEnd = S->addr + S->size + Slide;
220-
continue;
221-
}
222-
RangeStart = std::min(RangeStart, (uint64_t)S->addr + Slide);
223-
RangeEnd = std::max(RangeEnd, (uint64_t)(S->addr + S->size + Slide));
224-
// Keep the range rounded to 8 byte alignment on both ends so we don't
225-
// introduce misaligned pointers mapping between local and remote
226-
// address space.
227-
RangeStart = RangeStart & ~7;
228-
RangeEnd = RangeEnd + 7 & ~7;
229-
}
230-
231-
if (RangeStart == UINT64_MAX && RangeEnd == UINT64_MAX)
232-
return false;
233-
234-
auto SectBuf = this->getReader().readBytes(RemoteAddress(RangeStart),
235-
RangeEnd - RangeStart);
236-
if (!SectBuf)
237-
return false;
238209

239210
auto findMachOSectionByName = [&](llvm::StringRef Name)
240211
-> std::pair<RemoteRef<void>, uint64_t> {
@@ -244,11 +215,13 @@ class ReflectionContext
244215
if (strncmp(S->sectname, Name.data(), strlen(Name.data())) != 0)
245216
continue;
246217
auto RemoteSecStart = S->addr + Slide;
247-
auto SectBufData = reinterpret_cast<const char *>(SectBuf.get());
248-
auto LocalSectStart =
249-
reinterpret_cast<const char *>(SectBufData + RemoteSecStart - RangeStart);
250-
251-
auto StartRef = RemoteRef<void>(RemoteSecStart, LocalSectStart);
218+
auto LocalSectBuf =
219+
this->getReader().readBytes(RemoteAddress(RemoteSecStart), S->size);
220+
if (!LocalSectBuf)
221+
return {nullptr, 0};
222+
223+
auto StartRef = RemoteRef<void>(RemoteSecStart, LocalSectBuf.get());
224+
savedBuffers.push_back(std::move(LocalSectBuf));
252225
return {StartRef, S->size};
253226
}
254227
return {nullptr, 0};
@@ -307,7 +280,6 @@ class ReflectionContext
307280
}
308281

309282
savedBuffers.push_back(std::move(Buf));
310-
savedBuffers.push_back(std::move(SectBuf));
311283
savedBuffers.push_back(std::move(Sections));
312284
return true;
313285
}

0 commit comments

Comments
 (0)