[Frontend/Offloading] Fix use-after-reallocation in sycl::writeSymbolTable (#197612)

`writeSymbolTable` took raw pointers into the `SmallString` buffer
(`Header`, `Entries`) and then called `Out.append()` / `Out.push_back()`
inside the loop to write string data. When the `SmallString` needed to
grow, it reallocated, silently invalidating those pointers. All writes
  through `Entries[I]` after the first reallocation were undefined
behaviour; UBSAN caught this as a crash (exit code -6 / SIGABRT) on the
  sanitizer-x86_64-linux-bootstrap-ubsan builder.

  The fix pre-computes the total buffer size (header + entry array +
  all null-terminated name strings) and calls `reserve()` before any
  pointers are taken, guaranteeing that the subsequent `append` and
  `push_back` calls cannot trigger a reallocation.
diff --git a/llvm/lib/Frontend/Offloading/Utility.cpp b/llvm/lib/Frontend/Offloading/Utility.cpp
index d689d1b..909af02 100644
--- a/llvm/lib/Frontend/Offloading/Utility.cpp
+++ b/llvm/lib/Frontend/Offloading/Utility.cpp
@@ -462,8 +462,12 @@
   uint32_t StringDataOffset =
       sizeof(SymbolTableHeader) + Count * sizeof(SymbolTableEntry);
 
-  // Pre-size the output to hold the header and entry array; string data is
-  // appended below.
+  // Compute total size and reserve to prevent reallocation while writing
+  // entries via pointer (append() could otherwise invalidate the pointer).
+  uint32_t TotalSize = StringDataOffset;
+  for (StringRef N : Names)
+    TotalSize += N.size() + 1;
+  Out.reserve(TotalSize);
   Out.resize(StringDataOffset);
 
   // Write the header.