Commit e9a7eea6 by Andy Getzendanner Committed by Copybara-Service

Shrink most LOG callsites by one instruction (SysV x86_64 ABI) by dispatching to…

Shrink most LOG callsites by one instruction (SysV x86_64 ABI) by dispatching to per-severity constructors and omitting the severity argument.

In that particular ABI, the empty tag structs are NO_CLASS and don't appear in the generated code.

https://godbolt.org/z/crqaPh8Kv

PiperOrigin-RevId: 527989179
Change-Id: I365f11f6ca1de2623690d0a04e6f02f7de82b1fc
parent 56c5fc62
...@@ -234,6 +234,13 @@ LogMessage::LogMessage(const char* file, int line, absl::LogSeverity severity) ...@@ -234,6 +234,13 @@ LogMessage::LogMessage(const char* file, int line, absl::LogSeverity severity)
LogBacktraceIfNeeded(); LogBacktraceIfNeeded();
} }
LogMessage::LogMessage(const char* file, int line, InfoTag)
: LogMessage(file, line, absl::LogSeverity::kInfo) {}
LogMessage::LogMessage(const char* file, int line, WarningTag)
: LogMessage(file, line, absl::LogSeverity::kWarning) {}
LogMessage::LogMessage(const char* file, int line, ErrorTag)
: LogMessage(file, line, absl::LogSeverity::kError) {}
LogMessage::~LogMessage() { LogMessage::~LogMessage() {
#ifdef ABSL_MIN_LOG_LEVEL #ifdef ABSL_MIN_LOG_LEVEL
if (data_->entry.log_severity() < if (data_->entry.log_severity() <
...@@ -383,8 +390,7 @@ template LogMessage& LogMessage::operator<<(const double& v); ...@@ -383,8 +390,7 @@ template LogMessage& LogMessage::operator<<(const double& v);
template LogMessage& LogMessage::operator<<(const bool& v); template LogMessage& LogMessage::operator<<(const bool& v);
void LogMessage::Flush() { void LogMessage::Flush() {
if (data_->entry.log_severity() < absl::MinLogLevel()) if (data_->entry.log_severity() < absl::MinLogLevel()) return;
return;
if (data_->is_perror) { if (data_->is_perror) {
InternalStream() << ": " << absl::base_internal::StrError(errno_saver_()) InternalStream() << ": " << absl::base_internal::StrError(errno_saver_())
...@@ -427,7 +433,7 @@ LogMessage::OstreamView::OstreamView(LogMessageData& message_data) ...@@ -427,7 +433,7 @@ LogMessage::OstreamView::OstreamView(LogMessageData& message_data)
&encoded_remaining_copy_); &encoded_remaining_copy_);
string_start_ = string_start_ =
EncodeMessageStart(ValueTag::kString, encoded_remaining_copy_.size(), EncodeMessageStart(ValueTag::kString, encoded_remaining_copy_.size(),
&encoded_remaining_copy_); &encoded_remaining_copy_);
setp(encoded_remaining_copy_.data(), setp(encoded_remaining_copy_.data(),
encoded_remaining_copy_.data() + encoded_remaining_copy_.size()); encoded_remaining_copy_.data() + encoded_remaining_copy_.size());
data_.manipulated.rdbuf(this); data_.manipulated.rdbuf(this);
......
...@@ -51,9 +51,21 @@ constexpr int kLogMessageBufferSize = 15000; ...@@ -51,9 +51,21 @@ constexpr int kLogMessageBufferSize = 15000;
class LogMessage { class LogMessage {
public: public:
struct InfoTag {};
struct WarningTag {};
struct ErrorTag {};
// Used for `LOG`. // Used for `LOG`.
LogMessage(const char* file, int line, LogMessage(const char* file, int line,
absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD; absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD;
// These constructors are slightly smaller/faster to call; the severity is
// curried into the function pointer.
LogMessage(const char* file, int line,
InfoTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
LogMessage(const char* file, int line,
WarningTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
LogMessage(const char* file, int line,
ErrorTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE;
LogMessage(const LogMessage&) = delete; LogMessage(const LogMessage&) = delete;
LogMessage& operator=(const LogMessage&) = delete; LogMessage& operator=(const LogMessage&) = delete;
~LogMessage() ABSL_ATTRIBUTE_COLD; ~LogMessage() ABSL_ATTRIBUTE_COLD;
......
...@@ -42,15 +42,15 @@ ...@@ -42,15 +42,15 @@
#define ABSL_LOG_INTERNAL_QCHECK(failure_message) \ #define ABSL_LOG_INTERNAL_QCHECK(failure_message) \
ABSL_LOGGING_INTERNAL_LOG_QFATAL ABSL_LOGGING_INTERNAL_LOG_QFATAL
#else // !defined(STRIP_LOG) || !STRIP_LOG #else // !defined(STRIP_LOG) || !STRIP_LOG
#define ABSL_LOGGING_INTERNAL_LOG_INFO \ #define ABSL_LOGGING_INTERNAL_LOG_INFO \
::absl::log_internal::LogMessage(__FILE__, __LINE__, \ ::absl::log_internal::LogMessage( \
::absl::LogSeverity::kInfo) __FILE__, __LINE__, ::absl::log_internal::LogMessage::InfoTag{})
#define ABSL_LOGGING_INTERNAL_LOG_WARNING \ #define ABSL_LOGGING_INTERNAL_LOG_WARNING \
::absl::log_internal::LogMessage(__FILE__, __LINE__, \ ::absl::log_internal::LogMessage( \
::absl::LogSeverity::kWarning) __FILE__, __LINE__, ::absl::log_internal::LogMessage::WarningTag{})
#define ABSL_LOGGING_INTERNAL_LOG_ERROR \ #define ABSL_LOGGING_INTERNAL_LOG_ERROR \
::absl::log_internal::LogMessage(__FILE__, __LINE__, \ ::absl::log_internal::LogMessage( \
::absl::LogSeverity::kError) __FILE__, __LINE__, ::absl::log_internal::LogMessage::ErrorTag{})
#define ABSL_LOGGING_INTERNAL_LOG_FATAL \ #define ABSL_LOGGING_INTERNAL_LOG_FATAL \
::absl::log_internal::LogMessageFatal(__FILE__, __LINE__) ::absl::log_internal::LogMessageFatal(__FILE__, __LINE__)
#define ABSL_LOGGING_INTERNAL_LOG_QFATAL \ #define ABSL_LOGGING_INTERNAL_LOG_QFATAL \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment