void RuntimeDyldMachO::registerEHFrames() { if (!MemMgr) return; for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) { EHFrameRelatedSections &SectionInfo = UnregisteredEHFrameSections[i]; if (SectionInfo.EHFrameSID == RTDYLD_INVALID_SECTION_ID || SectionInfo.TextSID == RTDYLD_INVALID_SECTION_ID) continue; SectionEntry *Text = &Sections[SectionInfo.TextSID]; SectionEntry *EHFrame = &Sections[SectionInfo.EHFrameSID]; SectionEntry *ExceptTab = nullptr; if (SectionInfo.ExceptTabSID != RTDYLD_INVALID_SECTION_ID) ExceptTab = &Sections[SectionInfo.ExceptTabSID]; intptr_t DeltaForText = computeDelta(Text, EHFrame); intptr_t DeltaForEH = 0; if (ExceptTab) DeltaForEH = computeDelta(ExceptTab, EHFrame); unsigned char *P = EHFrame->Address; unsigned char *End = P + EHFrame->Size; do { P = processFDE(P, DeltaForText, DeltaForEH); } while (P != End); MemMgr->registerEHFrames(EHFrame->Address, EHFrame->LoadAddress, EHFrame->Size); } UnregisteredEHFrameSections.clear(); }
void RuntimeDyldMachOCRTPBase<Impl>::registerEHFrames() { for (int i = 0, e = UnregisteredEHFrameSections.size(); i != e; ++i) { EHFrameRelatedSections &SectionInfo = UnregisteredEHFrameSections[i]; if (SectionInfo.EHFrameSID == RTDYLD_INVALID_SECTION_ID || SectionInfo.TextSID == RTDYLD_INVALID_SECTION_ID) continue; SectionEntry *Text = &Sections[SectionInfo.TextSID]; SectionEntry *EHFrame = &Sections[SectionInfo.EHFrameSID]; SectionEntry *ExceptTab = nullptr; if (SectionInfo.ExceptTabSID != RTDYLD_INVALID_SECTION_ID) ExceptTab = &Sections[SectionInfo.ExceptTabSID]; int64_t DeltaForText = computeDelta(Text, EHFrame); int64_t DeltaForEH = 0; if (ExceptTab) DeltaForEH = computeDelta(ExceptTab, EHFrame); uint8_t *P = EHFrame->getAddress(); uint8_t *End = P + EHFrame->getSize(); do { P = processFDE(P, DeltaForText, DeltaForEH); } while (P != End); MemMgr.registerEHFrames(EHFrame->getAddress(), EHFrame->getLoadAddress(), EHFrame->getSize()); } UnregisteredEHFrameSections.clear(); }
void RTDyldMemoryManager::deregisterEHFramesInProcess(uint8_t *Addr, size_t Size) { const char *P = (const char *)Addr; const char *End = P + Size; do { P = processFDE(P, true); } while(P != End); }
void RTDyldMemoryManager::registerEHFrames(StringRef SectionData) { #if HAVE_EHTABLE_SUPPORT const char *P = SectionData.data(); const char *End = SectionData.data() + SectionData.size(); do { P = processFDE(P); } while(P != End); #endif }
// This implementation handles frame registration for local targets. // Memory managers for remote targets should re-implement this function // and use the LoadAddr parameter. void RTDyldMemoryManager::registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) { #if HAVE_EHTABLE_SUPPORT const char *P = (const char *)Addr; const char *End = P + Size; do { P = processFDE(P); } while(P != End); #endif }
// This implementation handles frame registration for local targets. // Memory managers for remote targets should re-implement this function // and use the LoadAddr parameter. void RTDyldMemoryManager::registerEHFramesInProcess(uint8_t *Addr, size_t Size) { // On OS X OS X __register_frame takes a single FDE as an argument. // See http://lists.llvm.org/pipermail/llvm-dev/2013-April/061737.html // and projects/libunwind/src/UnwindLevel1-gcc-ext.c. const char *P = (const char *)Addr; const char *End = P + Size; do { P = processFDE(P, false); } while(P != End); }
// This implementation handles frame registration for local targets. // Memory managers for remote targets should re-implement this function // and use the LoadAddr parameter. void RTDyldMemoryManager::registerEHFrames(uint8_t *Addr, uint64_t LoadAddr, size_t Size) { // On OS X OS X __register_frame takes a single FDE as an argument. // See http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-April/061768.html const char *P = (const char *)Addr; const char *End = P + Size; do { P = processFDE(P, false); } while(P != End); }