From 61cac1fabb3953830995eefe6a1cca4573033685 Mon Sep 17 00:00:00 2001 From: Andy Getzendanner Date: Mon, 1 May 2023 14:07:31 -0700 Subject: Instantiate LogMessage::CopyToEncodedBuffer separately for literals and non-literals to save an instruction at each operator<<(string) callsite. The operator<(v); return *this; } LogMessage& LogMessage::operator<<(absl::string_view v) { - CopyToEncodedBuffer(v, StringType::kNotLiteral); + CopyToEncodedBuffer(v); return *this; } LogMessage& LogMessage::operator<<(std::ostream& (*m)(std::ostream& os)) { @@ -525,8 +525,8 @@ void LogMessage::LogBacktraceIfNeeded() { // containing the specified string data using a `Value` field appropriate to // `str_type`. Truncates `str` if necessary, but emits nothing and marks the // buffer full if even the field headers do not fit. -void LogMessage::CopyToEncodedBuffer(absl::string_view str, - StringType str_type) { +template +void LogMessage::CopyToEncodedBuffer(absl::string_view str) { auto encoded_remaining_copy = data_->encoded_remaining; auto start = EncodeMessageStart( EventTag::kValue, BufferSizeFor(WireType::kLengthDelimited) + str.size(), @@ -547,7 +547,12 @@ void LogMessage::CopyToEncodedBuffer(absl::string_view str, data_->encoded_remaining.remove_suffix(data_->encoded_remaining.size()); } } -void LogMessage::CopyToEncodedBuffer(char ch, size_t num, StringType str_type) { +template void LogMessage::CopyToEncodedBuffer( + absl::string_view str); +template void LogMessage::CopyToEncodedBuffer< + LogMessage::StringType::kNotLiteral>(absl::string_view str); +template +void LogMessage::CopyToEncodedBuffer(char ch, size_t num) { auto encoded_remaining_copy = data_->encoded_remaining; auto value_start = EncodeMessageStart( EventTag::kValue, BufferSizeFor(WireType::kLengthDelimited) + num, @@ -568,6 +573,10 @@ void LogMessage::CopyToEncodedBuffer(char ch, size_t num, StringType str_type) { data_->encoded_remaining.remove_suffix(data_->encoded_remaining.size()); } } +template void LogMessage::CopyToEncodedBuffer( + char ch, size_t num); +template void LogMessage::CopyToEncodedBuffer< + LogMessage::StringType::kNotLiteral>(char ch, size_t num); LogMessageFatal::LogMessageFatal(const char* file, int line) : LogMessage(file, line, absl::LogSeverity::kFatal) {} diff --git a/absl/log/internal/log_message.h b/absl/log/internal/log_message.h index 6fdfa7bd..46937728 100644 --- a/absl/log/internal/log_message.h +++ b/absl/log/internal/log_message.h @@ -231,10 +231,10 @@ class LogMessage { kLiteral, kNotLiteral, }; - void CopyToEncodedBuffer(absl::string_view str, - StringType str_type) ABSL_ATTRIBUTE_NOINLINE; - void CopyToEncodedBuffer(char ch, size_t num, - StringType str_type) ABSL_ATTRIBUTE_NOINLINE; + template + void CopyToEncodedBuffer(absl::string_view str) ABSL_ATTRIBUTE_NOINLINE; + template + void CopyToEncodedBuffer(char ch, size_t num) ABSL_ATTRIBUTE_NOINLINE; // Returns `true` if the message is fatal or enabled debug-fatal. bool IsFatal() const; @@ -264,12 +264,12 @@ class StringifySink final { explicit StringifySink(LogMessage& message) : message_(message) {} void Append(size_t count, char ch) { - message_.CopyToEncodedBuffer(ch, count, - LogMessage::StringType::kNotLiteral); + message_.CopyToEncodedBuffer(ch, + count); } void Append(absl::string_view v) { - message_.CopyToEncodedBuffer(v, LogMessage::StringType::kNotLiteral); + message_.CopyToEncodedBuffer(v); } // For types that implement `AbslStringify` using `absl::Format()`. @@ -304,14 +304,14 @@ LogMessage& LogMessage::operator<<(const T& v) { template LogMessage& LogMessage::operator<<(const char (&buf)[SIZE]) { - CopyToEncodedBuffer(buf, StringType::kLiteral); + CopyToEncodedBuffer(buf); return *this; } // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE` template LogMessage& LogMessage::operator<<(char (&buf)[SIZE]) { - CopyToEncodedBuffer(buf, StringType::kNotLiteral); + CopyToEncodedBuffer(buf); return *this; } // We instantiate these specializations in the library's TU to save space in @@ -339,6 +339,16 @@ extern template LogMessage& LogMessage::operator<<(const float& v); extern template LogMessage& LogMessage::operator<<(const double& v); extern template LogMessage& LogMessage::operator<<(const bool& v); +extern template void LogMessage::CopyToEncodedBuffer< + LogMessage::StringType::kLiteral>(absl::string_view str); +extern template void LogMessage::CopyToEncodedBuffer< + LogMessage::StringType::kNotLiteral>(absl::string_view str); +extern template void +LogMessage::CopyToEncodedBuffer(char ch, + size_t num); +extern template void LogMessage::CopyToEncodedBuffer< + LogMessage::StringType::kNotLiteral>(char ch, size_t num); + // `LogMessageFatal` ensures the process will exit in failure after logging this // message. class LogMessageFatal final : public LogMessage { diff --git a/absl/log/internal/structured.h b/absl/log/internal/structured.h index 08caea66..5223dbc3 100644 --- a/absl/log/internal/structured.h +++ b/absl/log/internal/structured.h @@ -42,7 +42,7 @@ class ABSL_MUST_USE_RESULT AsLiteralImpl final { return os << as_literal.str_; } void AddToMessage(log_internal::LogMessage& m) { - m.CopyToEncodedBuffer(str_, log_internal::LogMessage::StringType::kLiteral); + m.CopyToEncodedBuffer(str_); } friend log_internal::LogMessage& operator<<(log_internal::LogMessage& m, AsLiteralImpl as_literal) { -- cgit v1.2.3