Skip to content

Commit 8b8c159

Browse files
authored
Merge pull request #37092 from augusto2112/cherry-pick-b54d42
Read machO sections section by section
2 parents 9608a08 + b9c66f7 commit 8b8c159

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)