Loading...
common/SwiftVisitor.cpp dyld-1340 dyld-1165.3
--- dyld/dyld-1340/common/SwiftVisitor.cpp
+++ dyld/dyld-1165.3/common/SwiftVisitor.cpp
@@ -35,7 +35,6 @@
 #include <assert.h>
 
 using namespace metadata_visitor;
-using mach_o::Header;
 
 //
 // MARK: --- SwiftVisitor methods ---
@@ -68,7 +67,7 @@
     return SwiftConformanceList(sectionValue, (uint32_t)numElements);
 }
 
-std::optional<SwiftVisitor::SectionContent> SwiftVisitor::findSection(const char* segmentName, const char *sectionName) const
+std::optional<SwiftVisitor::SectionContent> SwiftVisitor::findTextSection(const char *sectionName) const
 {
 #if SUPPORT_VM_LAYOUT
     const dyld3::MachOFile* mf = this->dylibMA;
@@ -77,155 +76,26 @@
 #endif
 
     __block std::optional<SwiftVisitor::SectionContent> sectionContent;
-    ((const Header*)mf)->forEachSection(^(const Header::SegmentInfo& segInfo, const Header::SectionInfo& sectInfo, bool& stop) {
-        if ( sectInfo.segmentName != segmentName )
+    mf->forEachSection(^(const dyld3::MachOFile::SectionInfo& sectInfo, bool malformedSectionRange, bool& stop) {
+        if ( (strcmp(sectInfo.segInfo.segName, "__TEXT") != 0) )
             return;
-        if ( sectInfo.sectionName != sectionName )
+        if ( strcmp(sectInfo.sectName, sectionName) != 0 )
             return;
 
 #if SUPPORT_VM_LAYOUT
-        const void* targetValue = (const void*)(sectInfo.address + this->dylibMA->getSlide());
-        ResolvedValue target(targetValue, VMAddress(sectInfo.address));
+        const void* targetValue = (const void*)(sectInfo.sectAddr + this->dylibMA->getSlide());
+        ResolvedValue target(targetValue, VMAddress(sectInfo.sectAddr));
 #else
-        VMOffset offsetInSegment(sectInfo.address - segInfo.vmaddr);
-        ResolvedValue target(this->segments[sectInfo.segIndex], offsetInSegment);
+        VMOffset offsetInSegment(sectInfo.sectAddr - sectInfo.segInfo.vmAddr);
+        ResolvedValue target(this->segments[sectInfo.segInfo.segIndex], offsetInSegment);
 #endif
         sectionContent.emplace(std::move(target));
-        sectionContent->sectSize       = sectInfo.size;
+        sectionContent->sectSize       = sectInfo.sectSize;
 
         stop = true;
     });
     return sectionContent;
 }
-
-#if BUILDING_CACHE_BUILDER || BUILDING_CACHE_BUILDER_UNIT_TESTS
-void SwiftVisitor::forEachPointerHashTable(Diagnostics &diag, void(^callback)(ResolvedValue sectionBase, size_t tableIndex, uint8_t* tableStart, size_t numEntries)) const
-{
-    std::optional<SectionContent> sect = findPointerHashTableSection();
-    if ( !sect )
-        return;
-
-    if ( sect->sectSize < sizeof(uint64_t) )
-        return;
-
-    // Pointer hash table section consists of:
-    // struct PointerHashTable {
-    //   size_t count;
-    //   struct PointerHashTableEntry entries[];
-    // };
-    // struct PointerHashTableEntry {
-    //   struct PointerHashTableKey *key;
-    //   void *value;
-    // };
-
-    const size_t sizeTySize = this->pointerSize;
-    uint8_t* const sectBase = (uint8_t*)sect->sectionBase.value();
-    uint8_t* const sectEnd = (uint8_t*)sectBase + sect->sectSize;
-    uint8_t* pos = sectBase;
-    size_t   tableIndex = 0;
-    while ( pos < sectEnd ) {
-        if ( (sectEnd-pos) < sizeof(sizeTySize) ) {
-            diag.error("Bad hash table section, missing count");
-            return;
-        }
-
-        const uint64_t count = sizeTySize == 4 ? *(uint32_t*)pos : *(uint64_t*)pos;
-        const size_t headerSize = sizeTySize;
-        const size_t entrySize = this->pointerSize * 2;
-        const size_t minSize = (entrySize * count) + headerSize;
-        if ( (sectEnd-pos) < minSize ) {
-            diag.error("Bad hash table section, found count: %llu, expected section size: %lu, actual size: %llu", count, minSize, sect->sectSize);
-            return;
-        }
-
-        callback(sect->sectionBase, tableIndex, pos, count);
-        pos = pos + minSize;
-        ++tableIndex;
-    }
-}
-
-size_t SwiftVisitor::numPointerHashTables(Diagnostics& diag) const
-{
-    __block size_t res = 0;
-    forEachPointerHashTable(diag, ^(ResolvedValue sectionBase, size_t tableIndex, uint8_t *tableStart, size_t numEntries) {
-        ++res;
-    });
-    return res;
-}
-
-std::optional<ResolvedValue> SwiftVisitor::forEachPointerHashTableRelativeEntry(Diagnostics& diag, uint8_t* tableStart,
-                                                                                VMAddress sharedCacheBaseAddr,
-                                                                                void(^callback)(size_t index, std::span<uint64_t> cacheOffsetKeys, uint64_t cacheOffsetValue)) const
-{
-    std::optional<SectionContent> sect = findPointerHashTableSection();
-    if ( !sect )
-        return {};
-
-    if ( sect->sectSize < sizeof(uint64_t) )
-        return {};
-
-    std::vector<ResolvedValue> res;
-    uint8_t* const sectBase = (uint8_t*)sect->sectionBase.value();
-    uint8_t* const sectEnd = (uint8_t*)sectBase + sect->sectSize;
-    if ( tableStart < sectBase || tableStart >= sectEnd ) {
-        assert(false && "invalid pointer table addr");
-        return std::nullopt;
-    }
-
-    const size_t sizeTySize = pointerSize;
-    if ( (sectEnd-tableStart) < sizeTySize ) {
-        diag.error("Bad hash table section, missing count");
-        return {};
-    }
-
-    const uint64_t count = sizeTySize == 4 ? *(uint32_t*)tableStart : *(uint64_t*)tableStart;
-    const size_t headerSize = sizeTySize;
-    const size_t ptrSize = this->pointerSize;
-    const size_t entrySize = ptrSize * 2;
-    const size_t minSize = (entrySize * count) + headerSize;
-    if ( (sectEnd-tableStart) < minSize ) {
-        diag.error("Bad hash table section, found count: %llu, expected section size: %lu, actual size: %llu", count, minSize, sect->sectSize);
-        return {};
-    }
-
-    // Entry and key layout are:
-    //
-    // struct PointerHashTableEntry {
-    //     struct PointerHashTableKey *key;
-    //     void *value;
-    // };
-    // struct PointerHashTableKey {
-    //     size_t  count;
-    //     void *pointers[];
-    // };
-    uint8_t* entry = (uint8_t*)(tableStart + headerSize);
-    std::vector<uint64_t> keysBuffer;
-    for ( size_t i = 0; i < count; ++i ) {
-        ResolvedValue keyPtrResolved = resolveRebase(getField(sect->sectionBase, entry));
-        entry += ptrSize;
-
-        bool wasBind;
-        ResolvedValue valueResolved = resolveBindOrRebase(getField(sect->sectionBase, entry), wasBind);
-        entry += ptrSize;
-
-        uint8_t* keyPtr = (uint8_t*)keyPtrResolved.value();
-        const uint64_t numKeys = sizeTySize == 4 ? *(uint32_t*)keyPtr : *(uint64_t*)keyPtr;
-        keyPtr += sizeTySize;
-
-        keysBuffer.clear();
-        for ( uint64_t k = 0; k < numKeys; ++k ) {
-            ResolvedValue key = resolveBindOrRebase(getField(keyPtrResolved, keyPtr), wasBind);
-            keyPtr += ptrSize;
-
-            keysBuffer.push_back((key.vmAddress()-sharedCacheBaseAddr).rawValue());
-        }
-
-        callback(i, keysBuffer, (valueResolved.vmAddress()-sharedCacheBaseAddr).rawValue());
-    }
-    assert((uint8_t*)entry == (tableStart+minSize));
-    return getField(sect->sectionBase, tableStart);
-}
-#endif
 
 //
 // MARK: --- SwiftConformanceList methods ---