diff --git a/lld/MachO/MarkLive.cpp b/lld/MachO/MarkLive.cpp index 979803f1fe70b..e9b0fd4f7b1a2 100644 --- a/lld/MachO/MarkLive.cpp +++ b/lld/MachO/MarkLive.cpp @@ -160,11 +160,16 @@ void MarkLiveImpl::markTransitively() { // Mark things reachable from GC roots as live. while (!worklist.empty()) { WorklistEntry *entry = worklist.pop_back_val(); - assert(cast(getInputSection(entry))->live && + // Entries that get placed onto the worklist always contain + // ConcatInputSections. `WhyLiveEntry::prev` may point to entries that + // contain other types of InputSections (due to S_ATTR_LIVE_SUPPORT), but + // those entries should never be pushed onto the worklist. + auto *isec = cast(getInputSection(entry)); + assert(isec->live && "We mark as live when pushing onto the worklist!"); // Mark all symbols listed in the relocation table for this section. - for (const Reloc &r : getInputSection(entry)->relocs) { + for (const Reloc &r : isec->relocs) { if (auto *s = r.referent.dyn_cast()) addSym(s, entry); else