Outline SourceLocation stringification for StringifySink to reduce binary size.

Every call site formatting `absl::SourceLocation` via `StrCat`, `StrAppend`, or `Substitute` instantiates `AbslStringify` with `strings_internal::StringifySink`, expanding integer formatting and buffer appends inline across callers.

Provide an out-of-line non-template `AbslStringify(strings_internal::StringifySink&, SourceLocation)` overload in `stringify_sink.cc` that delegates to the existing template implementation.

PiperOrigin-RevId: 1003943520
diff --git a/absl/strings/ascii.cc b/absl/strings/ascii.cc
index b5c7e19..793d4a2 100644
--- a/absl/strings/ascii.cc
+++ b/absl/strings/ascii.cc
@@ -14,6 +14,7 @@
 
 #include "absl/strings/ascii.h"
 
+#include <algorithm>
 #include <climits>
 #include <cstddef>
 #include <cstring>
@@ -21,6 +22,8 @@
 
 #include "absl/base/config.h"
 #include "absl/base/nullability.h"
+#include "absl/strings/resize_and_overwrite.h"
+#include "absl/strings/string_view.h"
 
 namespace absl {
 ABSL_NAMESPACE_BEGIN
@@ -258,11 +261,58 @@
   return ascii_internal::AsciiStrCaseFold<false>(p, p, s->size());
 }
 
+std::string AsciiStrToLower(absl::string_view s) {
+  std::string result;
+  StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) {
+    ascii_internal::AsciiStrToLower(buf, s.data(), s.size());
+    return buf_size;
+  });
+  return result;
+}
+
 void AsciiStrToUpper(std::string* absl_nonnull s) {
   char* p = &(*s)[0];
   return ascii_internal::AsciiStrCaseFold<true>(p, p, s->size());
 }
 
+std::string AsciiStrToUpper(absl::string_view s) {
+  std::string result;
+  StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) {
+    ascii_internal::AsciiStrToUpper(buf, s.data(), s.size());
+    return buf_size;
+  });
+  return result;
+}
+
+absl::string_view StripLeadingAsciiWhitespace(absl::string_view str) {
+  auto it = std::find_if_not(str.begin(), str.end(), absl::ascii_isspace);
+  return str.substr(static_cast<size_t>(it - str.begin()));
+}
+
+void StripLeadingAsciiWhitespace(std::string* absl_nonnull str) {
+  auto it = std::find_if_not(str->begin(), str->end(), absl::ascii_isspace);
+  str->erase(str->begin(), it);
+}
+
+absl::string_view StripTrailingAsciiWhitespace(absl::string_view str) {
+  auto it = std::find_if_not(str.rbegin(), str.rend(), absl::ascii_isspace);
+  return str.substr(0, static_cast<size_t>(str.rend() - it));
+}
+
+void StripTrailingAsciiWhitespace(std::string* absl_nonnull str) {
+  auto it = std::find_if_not(str->rbegin(), str->rend(), absl::ascii_isspace);
+  str->erase(static_cast<size_t>(str->rend() - it));
+}
+
+absl::string_view StripAsciiWhitespace(absl::string_view str) {
+  return StripTrailingAsciiWhitespace(StripLeadingAsciiWhitespace(str));
+}
+
+void StripAsciiWhitespace(std::string* absl_nonnull str) {
+  StripTrailingAsciiWhitespace(str);
+  StripLeadingAsciiWhitespace(str);
+}
+
 void RemoveExtraAsciiWhitespace(std::string* absl_nonnull str) {
   auto stripped = StripAsciiWhitespace(*str);
 
diff --git a/absl/strings/ascii.h b/absl/strings/ascii.h
index d6252d6..581184e 100644
--- a/absl/strings/ascii.h
+++ b/absl/strings/ascii.h
@@ -188,14 +188,7 @@
 void AsciiStrToLower(std::string* absl_nonnull s);
 
 // Creates a lowercase string from a given absl::string_view.
-[[nodiscard]] inline std::string AsciiStrToLower(absl::string_view s) {
-  std::string result;
-  StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) {
-    ascii_internal::AsciiStrToLower(buf, s.data(), s.size());
-    return buf_size;
-  });
-  return result;
-}
+[[nodiscard]] std::string AsciiStrToLower(absl::string_view s);
 
 // Creates a lowercase string from a given std::string&&.
 //
@@ -219,14 +212,7 @@
 void AsciiStrToUpper(std::string* absl_nonnull s);
 
 // Creates an uppercase string from a given absl::string_view.
-[[nodiscard]] inline std::string AsciiStrToUpper(absl::string_view s) {
-  std::string result;
-  StringResizeAndOverwrite(result, s.size(), [s](char* buf, size_t buf_size) {
-    ascii_internal::AsciiStrToUpper(buf, s.data(), s.size());
-    return buf_size;
-  });
-  return result;
-}
+[[nodiscard]] std::string AsciiStrToUpper(absl::string_view s);
 
 // Creates an uppercase string from a given std::string&&.
 //
@@ -240,44 +226,27 @@
 
 // Returns absl::string_view with whitespace stripped from the beginning of the
 // given string_view.
-[[nodiscard]] inline absl::string_view StripLeadingAsciiWhitespace(
-    absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) {
-  auto it = std::find_if_not(str.begin(), str.end(), absl::ascii_isspace);
-  return str.substr(static_cast<size_t>(it - str.begin()));
-}
+[[nodiscard]] absl::string_view StripLeadingAsciiWhitespace(
+    absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND);
 
 // Strips in place whitespace from the beginning of the given string.
-inline void StripLeadingAsciiWhitespace(std::string* absl_nonnull str) {
-  auto it = std::find_if_not(str->begin(), str->end(), absl::ascii_isspace);
-  str->erase(str->begin(), it);
-}
+void StripLeadingAsciiWhitespace(std::string* absl_nonnull str);
 
 // Returns absl::string_view with whitespace stripped from the end of the given
 // string_view.
-[[nodiscard]] inline absl::string_view StripTrailingAsciiWhitespace(
-    absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) {
-  auto it = std::find_if_not(str.rbegin(), str.rend(), absl::ascii_isspace);
-  return str.substr(0, static_cast<size_t>(str.rend() - it));
-}
+[[nodiscard]] absl::string_view StripTrailingAsciiWhitespace(
+    absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND);
 
 // Strips in place whitespace from the end of the given string
-inline void StripTrailingAsciiWhitespace(std::string* absl_nonnull str) {
-  auto it = std::find_if_not(str->rbegin(), str->rend(), absl::ascii_isspace);
-  str->erase(static_cast<size_t>(str->rend() - it));
-}
+void StripTrailingAsciiWhitespace(std::string* absl_nonnull str);
 
 // Returns absl::string_view with whitespace stripped from both ends of the
 // given string_view.
-[[nodiscard]] inline absl::string_view StripAsciiWhitespace(
-    absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND) {
-  return StripTrailingAsciiWhitespace(StripLeadingAsciiWhitespace(str));
-}
+[[nodiscard]] absl::string_view StripAsciiWhitespace(
+    absl::string_view str ABSL_ATTRIBUTE_LIFETIME_BOUND);
 
 // Strips in place whitespace from both ends of the given string
-inline void StripAsciiWhitespace(std::string* absl_nonnull str) {
-  StripTrailingAsciiWhitespace(str);
-  StripLeadingAsciiWhitespace(str);
-}
+void StripAsciiWhitespace(std::string* absl_nonnull str);
 
 // Removes leading, trailing, and consecutive internal whitespace.
 void RemoveExtraAsciiWhitespace(std::string* absl_nonnull str);
diff --git a/absl/strings/internal/ostringstream.cc b/absl/strings/internal/ostringstream.cc
index 5ac41cc..e848c15 100644
--- a/absl/strings/internal/ostringstream.cc
+++ b/absl/strings/internal/ostringstream.cc
@@ -17,7 +17,10 @@
 #include <cassert>
 #include <cstddef>
 #include <ios>
+#include <ostream>
 #include <streambuf>
+#include <string>
+#include <utility>
 
 #include "absl/base/config.h"
 
@@ -25,6 +28,26 @@
 ABSL_NAMESPACE_BEGIN
 namespace strings_internal {
 
+OStringStream::OStringStream(std::string* str)
+    : std::ostream(&buf_), buf_(str) {}
+
+OStringStream::OStringStream(OStringStream&& that)
+    : std::ostream(std::move(static_cast<std::ostream&>(that))),
+      buf_(that.buf_) {
+  rdbuf(&buf_);
+}
+
+OStringStream& OStringStream::operator=(OStringStream&& that) {
+  std::ostream::operator=(std::move(static_cast<std::ostream&>(that)));
+  buf_ = that.buf_;
+  rdbuf(&buf_);
+  return *this;
+}
+
+OStringStream::~OStringStream() = default;
+
+OStringStream::Streambuf::~Streambuf() = default;
+
 OStringStream::Streambuf::int_type OStringStream::Streambuf::overflow(int c) {
   assert(str_);
   if (!std::streambuf::traits_type::eq_int_type(
diff --git a/absl/strings/internal/ostringstream.h b/absl/strings/internal/ostringstream.h
index c0e237d..943b369 100644
--- a/absl/strings/internal/ostringstream.h
+++ b/absl/strings/internal/ostringstream.h
@@ -69,19 +69,10 @@
   //
   // The destructor of OStringStream doesn't use the std::string. It's OK to
   // destroy the std::string before the stream.
-  explicit OStringStream(std::string* str)
-      : std::ostream(&buf_), buf_(str) {}
-  OStringStream(OStringStream&& that)
-      : std::ostream(std::move(static_cast<std::ostream&>(that))),
-        buf_(that.buf_) {
-    rdbuf(&buf_);
-  }
-  OStringStream& operator=(OStringStream&& that) {
-    std::ostream::operator=(std::move(static_cast<std::ostream&>(that)));
-    buf_ = that.buf_;
-    rdbuf(&buf_);
-    return *this;
-  }
+  explicit OStringStream(std::string* str);
+  OStringStream(OStringStream&& that);
+  OStringStream& operator=(OStringStream&& that);
+  ~OStringStream() override;
 
   std::string* str() { return buf_.str(); }
   const std::string* str() const { return buf_.str(); }
@@ -93,6 +84,7 @@
     explicit Streambuf(std::string* str) : str_(str) {}
     Streambuf(const Streambuf&) = default;
     Streambuf& operator=(const Streambuf&) = default;
+    ~Streambuf() override;
 
     std::string* str() { return str_; }
     const std::string* str() const { return str_; }
diff --git a/absl/strings/internal/stringify_sink.cc b/absl/strings/internal/stringify_sink.cc
index c9f8258..f0c3cc2 100644
--- a/absl/strings/internal/stringify_sink.cc
+++ b/absl/strings/internal/stringify_sink.cc
@@ -18,6 +18,7 @@
 
 #include "absl/base/config.h"
 #include "absl/strings/string_view.h"
+#include "absl/types/source_location.h"
 
 namespace absl {
 ABSL_NAMESPACE_BEGIN
@@ -30,5 +31,10 @@
 }
 
 }  // namespace strings_internal
+
+void AbslStringify(strings_internal::StringifySink& sink, SourceLocation l) {
+  AbslStringify<strings_internal::StringifySink>(sink, l);
+}
+
 ABSL_NAMESPACE_END
 }  // namespace absl
diff --git a/absl/strings/internal/stringify_sink.h b/absl/strings/internal/stringify_sink.h
index e4e5f9e..7b8c456 100644
--- a/absl/strings/internal/stringify_sink.h
+++ b/absl/strings/internal/stringify_sink.h
@@ -56,6 +56,8 @@
 
 }  // namespace strings_internal
 
+void AbslStringify(strings_internal::StringifySink& sink, SourceLocation l);
+
 template <typename Sink>
 void AbslStringify(Sink& sink, SourceLocation l) {
   sink.Append(l.file_name());