[lld][WebAssembly] Refactor markLive.cpp. NFC

This pattern matches the ELF implementation add if also useful as
part of a planned change where running `mark` more than once is needed.

Differential Revision: https://reviews.llvm.org/D68749

llvm-svn: 374275
This commit is contained in:
Sam Clegg 2019-10-10 03:23:06 +00:00
parent e398def943
commit ad2e12a3d9
1 changed files with 60 additions and 29 deletions

View File

@ -31,20 +31,33 @@
using namespace llvm;
using namespace llvm::wasm;
void lld::wasm::markLive() {
if (!config->gcSections)
return;
namespace lld {
namespace wasm {
LLVM_DEBUG(dbgs() << "markLive\n");
SmallVector<InputChunk *, 256> q;
namespace {
std::function<void(Symbol*)> enqueue = [&](Symbol *sym) {
class MarkLive {
public:
void run();
private:
void enqueue(Symbol *sym);
void markSymbol(Symbol *sym);
void mark();
// A list of chunks to visit.
SmallVector<InputChunk *, 256> queue;
};
} // namespace
void MarkLive::enqueue(Symbol *sym) {
if (!sym || sym->isLive())
return;
LLVM_DEBUG(dbgs() << "markLive: " << sym->getName() << "\n");
sym->markLive();
if (InputChunk *chunk = sym->getChunk())
q.push_back(chunk);
queue.push_back(chunk);
// The ctor functions are all referenced by the synthetic callCtors
// function. However, this function does not contain relocations so we
@ -61,8 +74,9 @@ void lld::wasm::markLive() {
}
}
}
};
}
void MarkLive::run() {
// Add GC root symbols.
if (!config->entry.empty())
enqueue(symtab->find(config->entry));
@ -87,9 +101,13 @@ void lld::wasm::markLive() {
if (config->sharedMemory && !config->shared)
enqueue(WasmSym::initMemory);
mark();
}
void MarkLive::mark() {
// Follow relocations to mark all reachable chunks.
while (!q.empty()) {
InputChunk *c = q.pop_back_val();
while (!queue.empty()) {
InputChunk *c = queue.pop_back_val();
for (const WasmRelocation reloc : c->getRelocations()) {
if (reloc.Type == R_WASM_TYPE_INDEX_LEB)
@ -113,6 +131,16 @@ void lld::wasm::markLive() {
enqueue(sym);
}
}
}
void markLive() {
if (!config->gcSections)
return;
LLVM_DEBUG(dbgs() << "markLive\n");
MarkLive marker;
marker.run();
// Report garbage-collected sections.
if (config->printGcSections) {
@ -138,3 +166,6 @@ void lld::wasm::markLive() {
message("removing unused section " + toString(g));
}
}
} // namespace wasm
} // namespace lld