[lld][WebAssembly] Reset context object after each link (#78770)

This mirrors how the ELF linker works. I wasn't able to find anywhere
where this is currently tested.

Followup to #78640, which triggered a regression.

GitOrigin-RevId: 2bfa5ca9277a7320358501c8fa0f1741c5134859
diff --git a/wasm/Config.h b/wasm/Config.h
index dc7ca26..97c508b 100644
--- a/wasm/Config.h
+++ b/wasm/Config.h
@@ -124,7 +124,7 @@
   llvm::SmallVector<InputTable *, 0> 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 @@
   llvm::SmallVector<std::tuple<std::string, const InputFile *, const Symbol &>,
                     0>
       whyExtractRecords;
+
+  void reset();
 };
 
 extern Ctx ctx;
diff --git a/wasm/Driver.cpp b/wasm/Driver.cpp
index 4a4f9a9..716a2d9 100644
--- a/wasm/Driver.cpp
+++ b/wasm/Driver.cpp
@@ -47,6 +47,20 @@
 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 @@
   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)";