From ebaace26065725129751adfdf99508c967cdbc71 Mon Sep 17 00:00:00 2001 From: Sam Clegg Date: Fri, 19 Jan 2024 19:48:07 +0000 Subject: [PATCH] [lld][WebAssembly] Reset context object after each link This mirrors who the ELF linker works. I wasn't able to find anywhere where this is currently tested. Followup to #78640, which triggered a regression. --- lld/wasm/Config.h | 4 +++- lld/wasm/Driver.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lld/wasm/Config.h b/lld/wasm/Config.h index dc7ca265e9a2c..97c508bda6a1c 100644 --- a/lld/wasm/Config.h +++ b/lld/wasm/Config.h @@ -124,7 +124,7 @@ struct Ctx { llvm::SmallVector syntheticTables; // True if we are creating position-independent code. - bool isPic; + bool isPic = false; // True if we have an MVP input that uses __indirect_function_table and which // requires it to be allocated to table number 0. @@ -138,6 +138,8 @@ struct Ctx { llvm::SmallVector, 0> whyExtractRecords; + + void reset(); }; extern Ctx ctx; diff --git a/lld/wasm/Driver.cpp b/lld/wasm/Driver.cpp index 4a4f9a9622794..716a2d9ebfe30 100644 --- a/lld/wasm/Driver.cpp +++ b/lld/wasm/Driver.cpp @@ -47,6 +47,20 @@ namespace lld::wasm { Configuration *config; Ctx ctx; +void Ctx::reset() { + objectFiles.clear(); + stubFiles.clear(); + sharedFiles.clear(); + bitcodeFiles.clear(); + syntheticFunctions.clear(); + syntheticGlobals.clear(); + syntheticTables.clear(); + whyExtractRecords.clear(); + isPic = false; + legacyFunctionTable = false; + emitBssSegments = false; +} + namespace { // Create enum with OPT_xxx values for each option in Options.td @@ -90,6 +104,7 @@ bool link(ArrayRef args, llvm::raw_ostream &stdoutOS, auto *ctx = new CommonLinkerContext; ctx->e.initialize(stdoutOS, stderrOS, exitEarly, disableOutput); + ctx->e.cleanupCallback = []() { wasm::ctx.reset(); }; ctx->e.logName = args::getFilenameWithoutExe(args[0]); ctx->e.errorLimitExceededMsg = "too many errors emitted, stopping now (use " "-error-limit=0 to see all errors)";