diff options
Diffstat (limited to 'COFF/MarkLive.cpp')
-rw-r--r-- | COFF/MarkLive.cpp | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/COFF/MarkLive.cpp b/COFF/MarkLive.cpp index a2756e5c89e0..01be60d12d82 100644 --- a/COFF/MarkLive.cpp +++ b/COFF/MarkLive.cpp @@ -18,7 +18,7 @@ namespace coff { // Set live bit on for each reachable chunk. Unmarked (unreachable) // COMDAT chunks will be ignored by Writer, so they will be excluded // from the final output. -void markLive(const std::vector<Chunk *> &Chunks) { +void markLive(ArrayRef<Chunk *> Chunks) { // We build up a worklist of sections which have been marked as live. We only // push into the worklist when we discover an unmarked section, and we mark // as we push, so sections never appear twice in the list. @@ -37,7 +37,7 @@ void markLive(const std::vector<Chunk *> &Chunks) { Worklist.push_back(C); }; - auto AddSym = [&](SymbolBody *B) { + auto AddSym = [&](Symbol *B) { if (auto *Sym = dyn_cast<DefinedRegular>(B)) Enqueue(Sym->getChunk()); else if (auto *Sym = dyn_cast<DefinedImportData>(B)) @@ -47,23 +47,17 @@ void markLive(const std::vector<Chunk *> &Chunks) { }; // Add GC root chunks. - for (SymbolBody *B : Config->GCRoot) + for (Symbol *B : Config->GCRoot) AddSym(B); while (!Worklist.empty()) { SectionChunk *SC = Worklist.pop_back_val(); - - // If this section was discarded, there are relocations referring to - // discarded sections. Ignore these sections to avoid crashing. They will be - // diagnosed during relocation processing. - if (SC->isDiscarded()) - continue; - assert(SC->isLive() && "We mark as live when pushing onto the worklist!"); // Mark all symbols listed in the relocation table for this section. - for (SymbolBody *B : SC->symbols()) - AddSym(B); + for (Symbol *B : SC->symbols()) + if (B) + AddSym(B); // Mark associative sections if any. for (SectionChunk *C : SC->children()) |