1*9356374aSAndroid Build Coastguard Worker // Copyright 2022 The Abseil Authors. 2*9356374aSAndroid Build Coastguard Worker // 3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); 4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License. 5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at 6*9356374aSAndroid Build Coastguard Worker // 7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*9356374aSAndroid Build Coastguard Worker // 9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, 11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and 13*9356374aSAndroid Build Coastguard Worker // limitations under the License. 14*9356374aSAndroid Build Coastguard Worker // 15*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 16*9356374aSAndroid Build Coastguard Worker // File: log/internal/log_message.h 17*9356374aSAndroid Build Coastguard Worker // ----------------------------------------------------------------------------- 18*9356374aSAndroid Build Coastguard Worker // 19*9356374aSAndroid Build Coastguard Worker // This file declares `class absl::log_internal::LogMessage`. This class more or 20*9356374aSAndroid Build Coastguard Worker // less represents a particular log message. LOG/CHECK macros create a 21*9356374aSAndroid Build Coastguard Worker // temporary instance of `LogMessage` and then stream values to it. At the end 22*9356374aSAndroid Build Coastguard Worker // of the LOG/CHECK statement, LogMessage instance goes out of scope and 23*9356374aSAndroid Build Coastguard Worker // `~LogMessage` directs the message to the registered log sinks. 24*9356374aSAndroid Build Coastguard Worker // Heap-allocation of `LogMessage` is unsupported. Construction outside of a 25*9356374aSAndroid Build Coastguard Worker // `LOG` macro is unsupported. 26*9356374aSAndroid Build Coastguard Worker 27*9356374aSAndroid Build Coastguard Worker #ifndef ABSL_LOG_INTERNAL_LOG_MESSAGE_H_ 28*9356374aSAndroid Build Coastguard Worker #define ABSL_LOG_INTERNAL_LOG_MESSAGE_H_ 29*9356374aSAndroid Build Coastguard Worker 30*9356374aSAndroid Build Coastguard Worker #include <ios> 31*9356374aSAndroid Build Coastguard Worker #include <memory> 32*9356374aSAndroid Build Coastguard Worker #include <ostream> 33*9356374aSAndroid Build Coastguard Worker #include <streambuf> 34*9356374aSAndroid Build Coastguard Worker #include <string> 35*9356374aSAndroid Build Coastguard Worker 36*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h" 37*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h" 38*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/errno_saver.h" 39*9356374aSAndroid Build Coastguard Worker #include "absl/base/log_severity.h" 40*9356374aSAndroid Build Coastguard Worker #include "absl/log/internal/nullguard.h" 41*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_entry.h" 42*9356374aSAndroid Build Coastguard Worker #include "absl/log/log_sink.h" 43*9356374aSAndroid Build Coastguard Worker #include "absl/strings/has_absl_stringify.h" 44*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 45*9356374aSAndroid Build Coastguard Worker #include "absl/time/time.h" 46*9356374aSAndroid Build Coastguard Worker 47*9356374aSAndroid Build Coastguard Worker namespace absl { 48*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN 49*9356374aSAndroid Build Coastguard Worker namespace log_internal { 50*9356374aSAndroid Build Coastguard Worker constexpr int kLogMessageBufferSize = 15000; 51*9356374aSAndroid Build Coastguard Worker 52*9356374aSAndroid Build Coastguard Worker class LogMessage { 53*9356374aSAndroid Build Coastguard Worker public: 54*9356374aSAndroid Build Coastguard Worker struct InfoTag {}; 55*9356374aSAndroid Build Coastguard Worker struct WarningTag {}; 56*9356374aSAndroid Build Coastguard Worker struct ErrorTag {}; 57*9356374aSAndroid Build Coastguard Worker 58*9356374aSAndroid Build Coastguard Worker // Used for `LOG`. 59*9356374aSAndroid Build Coastguard Worker LogMessage(const char* file, int line, 60*9356374aSAndroid Build Coastguard Worker absl::LogSeverity severity) ABSL_ATTRIBUTE_COLD; 61*9356374aSAndroid Build Coastguard Worker // These constructors are slightly smaller/faster to call; the severity is 62*9356374aSAndroid Build Coastguard Worker // curried into the function pointer. 63*9356374aSAndroid Build Coastguard Worker LogMessage(const char* file, int line, 64*9356374aSAndroid Build Coastguard Worker InfoTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE; 65*9356374aSAndroid Build Coastguard Worker LogMessage(const char* file, int line, 66*9356374aSAndroid Build Coastguard Worker WarningTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE; 67*9356374aSAndroid Build Coastguard Worker LogMessage(const char* file, int line, 68*9356374aSAndroid Build Coastguard Worker ErrorTag) ABSL_ATTRIBUTE_COLD ABSL_ATTRIBUTE_NOINLINE; 69*9356374aSAndroid Build Coastguard Worker LogMessage(const LogMessage&) = delete; 70*9356374aSAndroid Build Coastguard Worker LogMessage& operator=(const LogMessage&) = delete; 71*9356374aSAndroid Build Coastguard Worker ~LogMessage() ABSL_ATTRIBUTE_COLD; 72*9356374aSAndroid Build Coastguard Worker 73*9356374aSAndroid Build Coastguard Worker // Overrides the location inferred from the callsite. The string pointed to 74*9356374aSAndroid Build Coastguard Worker // by `file` must be valid until the end of the statement. 75*9356374aSAndroid Build Coastguard Worker LogMessage& AtLocation(absl::string_view file, int line); 76*9356374aSAndroid Build Coastguard Worker // Omits the prefix from this line. The prefix includes metadata about the 77*9356374aSAndroid Build Coastguard Worker // logged data such as source code location and timestamp. 78*9356374aSAndroid Build Coastguard Worker LogMessage& NoPrefix(); 79*9356374aSAndroid Build Coastguard Worker // Sets the verbosity field of the logged message as if it was logged by 80*9356374aSAndroid Build Coastguard Worker // `VLOG(verbose_level)`. Unlike `VLOG`, this method does not affect 81*9356374aSAndroid Build Coastguard Worker // evaluation of the statement when the specified `verbose_level` has been 82*9356374aSAndroid Build Coastguard Worker // disabled. The only effect is on `absl::LogSink` implementations which 83*9356374aSAndroid Build Coastguard Worker // make use of the `absl::LogSink::verbosity()` value. The value 84*9356374aSAndroid Build Coastguard Worker // `absl::LogEntry::kNoVerbosityLevel` can be specified to mark the message 85*9356374aSAndroid Build Coastguard Worker // not verbose. 86*9356374aSAndroid Build Coastguard Worker LogMessage& WithVerbosity(int verbose_level); 87*9356374aSAndroid Build Coastguard Worker // Uses the specified timestamp instead of one collected in the constructor. 88*9356374aSAndroid Build Coastguard Worker LogMessage& WithTimestamp(absl::Time timestamp); 89*9356374aSAndroid Build Coastguard Worker // Uses the specified thread ID instead of one collected in the constructor. 90*9356374aSAndroid Build Coastguard Worker LogMessage& WithThreadID(absl::LogEntry::tid_t tid); 91*9356374aSAndroid Build Coastguard Worker // Copies all metadata (but no data) from the specified `absl::LogEntry`. 92*9356374aSAndroid Build Coastguard Worker LogMessage& WithMetadataFrom(const absl::LogEntry& entry); 93*9356374aSAndroid Build Coastguard Worker // Appends to the logged message a colon, a space, a textual description of 94*9356374aSAndroid Build Coastguard Worker // the current value of `errno` (as by strerror(3)), and the numerical value 95*9356374aSAndroid Build Coastguard Worker // of `errno`. 96*9356374aSAndroid Build Coastguard Worker LogMessage& WithPerror(); 97*9356374aSAndroid Build Coastguard Worker // Sends this message to `*sink` in addition to whatever other sinks it would 98*9356374aSAndroid Build Coastguard Worker // otherwise have been sent to. `sink` must not be null. 99*9356374aSAndroid Build Coastguard Worker LogMessage& ToSinkAlso(absl::LogSink* sink); 100*9356374aSAndroid Build Coastguard Worker // Sends this message to `*sink` and no others. `sink` must not be null. 101*9356374aSAndroid Build Coastguard Worker LogMessage& ToSinkOnly(absl::LogSink* sink); 102*9356374aSAndroid Build Coastguard Worker 103*9356374aSAndroid Build Coastguard Worker // Don't call this method from outside this library. InternalStream()104*9356374aSAndroid Build Coastguard Worker LogMessage& InternalStream() { return *this; } 105*9356374aSAndroid Build Coastguard Worker 106*9356374aSAndroid Build Coastguard Worker // By-value overloads for small, common types let us overlook common failures 107*9356374aSAndroid Build Coastguard Worker // to define globals and static data members (i.e. in a .cc file). 108*9356374aSAndroid Build Coastguard Worker // clang-format off 109*9356374aSAndroid Build Coastguard Worker // The CUDA toolchain cannot handle these <<<'s: 110*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(char v) { return operator<< <char>(v); } 111*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(signed char v) { return operator<< <signed char>(v); } 112*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(unsigned char v) { 113*9356374aSAndroid Build Coastguard Worker return operator<< <unsigned char>(v); 114*9356374aSAndroid Build Coastguard Worker } 115*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(signed short v) { // NOLINT 116*9356374aSAndroid Build Coastguard Worker return operator<< <signed short>(v); // NOLINT 117*9356374aSAndroid Build Coastguard Worker } 118*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(signed int v) { return operator<< <signed int>(v); } 119*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(signed long v) { // NOLINT 120*9356374aSAndroid Build Coastguard Worker return operator<< <signed long>(v); // NOLINT 121*9356374aSAndroid Build Coastguard Worker } 122*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(signed long long v) { // NOLINT 123*9356374aSAndroid Build Coastguard Worker return operator<< <signed long long>(v); // NOLINT 124*9356374aSAndroid Build Coastguard Worker } 125*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(unsigned short v) { // NOLINT 126*9356374aSAndroid Build Coastguard Worker return operator<< <unsigned short>(v); // NOLINT 127*9356374aSAndroid Build Coastguard Worker } 128*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(unsigned int v) { 129*9356374aSAndroid Build Coastguard Worker return operator<< <unsigned int>(v); 130*9356374aSAndroid Build Coastguard Worker } 131*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(unsigned long v) { // NOLINT 132*9356374aSAndroid Build Coastguard Worker return operator<< <unsigned long>(v); // NOLINT 133*9356374aSAndroid Build Coastguard Worker } 134*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(unsigned long long v) { // NOLINT 135*9356374aSAndroid Build Coastguard Worker return operator<< <unsigned long long>(v); // NOLINT 136*9356374aSAndroid Build Coastguard Worker } 137*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(void* v) { return operator<< <void*>(v); } 138*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(const void* v) { return operator<< <const void*>(v); } 139*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(float v) { return operator<< <float>(v); } 140*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(double v) { return operator<< <double>(v); } 141*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(bool v) { return operator<< <bool>(v); } 142*9356374aSAndroid Build Coastguard Worker // clang-format on 143*9356374aSAndroid Build Coastguard Worker 144*9356374aSAndroid Build Coastguard Worker // These overloads are more efficient since no `ostream` is involved. 145*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(const std::string& v); 146*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(absl::string_view v); 147*9356374aSAndroid Build Coastguard Worker 148*9356374aSAndroid Build Coastguard Worker // Handle stream manipulators e.g. std::endl. 149*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(std::ostream& (*m)(std::ostream& os)); 150*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(std::ios_base& (*m)(std::ios_base& os)); 151*9356374aSAndroid Build Coastguard Worker 152*9356374aSAndroid Build Coastguard Worker // Literal strings. This allows us to record C string literals as literals in 153*9356374aSAndroid Build Coastguard Worker // the logging.proto.Value. 154*9356374aSAndroid Build Coastguard Worker // 155*9356374aSAndroid Build Coastguard Worker // Allow this overload to be inlined to prevent generating instantiations of 156*9356374aSAndroid Build Coastguard Worker // this template for every value of `SIZE` encountered in each source code 157*9356374aSAndroid Build Coastguard Worker // file. That significantly increases linker input sizes. Inlining is cheap 158*9356374aSAndroid Build Coastguard Worker // because the argument to this overload is almost always a string literal so 159*9356374aSAndroid Build Coastguard Worker // the call to `strlen` can be replaced at compile time. The overload for 160*9356374aSAndroid Build Coastguard Worker // `char[]` below should not be inlined. The compiler typically does not have 161*9356374aSAndroid Build Coastguard Worker // the string at compile time and cannot replace the call to `strlen` so 162*9356374aSAndroid Build Coastguard Worker // inlining it increases the binary size. See the discussion on 163*9356374aSAndroid Build Coastguard Worker // cl/107527369. 164*9356374aSAndroid Build Coastguard Worker template <int SIZE> 165*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(const char (&buf)[SIZE]); 166*9356374aSAndroid Build Coastguard Worker 167*9356374aSAndroid Build Coastguard Worker // This prevents non-const `char[]` arrays from looking like literals. 168*9356374aSAndroid Build Coastguard Worker template <int SIZE> 169*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(char (&buf)[SIZE]) ABSL_ATTRIBUTE_NOINLINE; 170*9356374aSAndroid Build Coastguard Worker 171*9356374aSAndroid Build Coastguard Worker // Types that support `AbslStringify()` are serialized that way. 172*9356374aSAndroid Build Coastguard Worker template <typename T, 173*9356374aSAndroid Build Coastguard Worker typename std::enable_if<absl::HasAbslStringify<T>::value, 174*9356374aSAndroid Build Coastguard Worker int>::type = 0> 175*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(const T& v) ABSL_ATTRIBUTE_NOINLINE; 176*9356374aSAndroid Build Coastguard Worker 177*9356374aSAndroid Build Coastguard Worker // Types that don't support `AbslStringify()` but do support streaming into a 178*9356374aSAndroid Build Coastguard Worker // `std::ostream&` are serialized that way. 179*9356374aSAndroid Build Coastguard Worker template <typename T, 180*9356374aSAndroid Build Coastguard Worker typename std::enable_if<!absl::HasAbslStringify<T>::value, 181*9356374aSAndroid Build Coastguard Worker int>::type = 0> 182*9356374aSAndroid Build Coastguard Worker LogMessage& operator<<(const T& v) ABSL_ATTRIBUTE_NOINLINE; 183*9356374aSAndroid Build Coastguard Worker 184*9356374aSAndroid Build Coastguard Worker // Note: We explicitly do not support `operator<<` for non-const references 185*9356374aSAndroid Build Coastguard Worker // because it breaks logging of non-integer bitfield types (i.e., enums). 186*9356374aSAndroid Build Coastguard Worker 187*9356374aSAndroid Build Coastguard Worker protected: 188*9356374aSAndroid Build Coastguard Worker // Call `abort()` or similar to perform `LOG(FATAL)` crash. It is assumed 189*9356374aSAndroid Build Coastguard Worker // that the caller has already generated and written the trace as appropriate. 190*9356374aSAndroid Build Coastguard Worker [[noreturn]] static void FailWithoutStackTrace(); 191*9356374aSAndroid Build Coastguard Worker 192*9356374aSAndroid Build Coastguard Worker // Similar to `FailWithoutStackTrace()`, but without `abort()`. Terminates 193*9356374aSAndroid Build Coastguard Worker // the process with an error exit code. 194*9356374aSAndroid Build Coastguard Worker [[noreturn]] static void FailQuietly(); 195*9356374aSAndroid Build Coastguard Worker 196*9356374aSAndroid Build Coastguard Worker // Dispatches the completed `absl::LogEntry` to applicable `absl::LogSink`s. 197*9356374aSAndroid Build Coastguard Worker // This might as well be inlined into `~LogMessage` except that 198*9356374aSAndroid Build Coastguard Worker // `~LogMessageFatal` needs to call it early. 199*9356374aSAndroid Build Coastguard Worker void Flush(); 200*9356374aSAndroid Build Coastguard Worker 201*9356374aSAndroid Build Coastguard Worker // After this is called, failures are done as quiet as possible for this log 202*9356374aSAndroid Build Coastguard Worker // message. 203*9356374aSAndroid Build Coastguard Worker void SetFailQuietly(); 204*9356374aSAndroid Build Coastguard Worker 205*9356374aSAndroid Build Coastguard Worker private: 206*9356374aSAndroid Build Coastguard Worker struct LogMessageData; // Opaque type containing message state 207*9356374aSAndroid Build Coastguard Worker friend class AsLiteralImpl; 208*9356374aSAndroid Build Coastguard Worker friend class StringifySink; 209*9356374aSAndroid Build Coastguard Worker 210*9356374aSAndroid Build Coastguard Worker // This streambuf writes directly into the structured logging buffer so that 211*9356374aSAndroid Build Coastguard Worker // arbitrary types can be encoded as string data (using 212*9356374aSAndroid Build Coastguard Worker // `operator<<(std::ostream &, ...)` without any extra allocation or copying. 213*9356374aSAndroid Build Coastguard Worker // Space is reserved before the data to store the length field, which is 214*9356374aSAndroid Build Coastguard Worker // filled in by `~OstreamView`. 215*9356374aSAndroid Build Coastguard Worker class OstreamView final : public std::streambuf { 216*9356374aSAndroid Build Coastguard Worker public: 217*9356374aSAndroid Build Coastguard Worker explicit OstreamView(LogMessageData& message_data); 218*9356374aSAndroid Build Coastguard Worker ~OstreamView() override; 219*9356374aSAndroid Build Coastguard Worker OstreamView(const OstreamView&) = delete; 220*9356374aSAndroid Build Coastguard Worker OstreamView& operator=(const OstreamView&) = delete; 221*9356374aSAndroid Build Coastguard Worker std::ostream& stream(); 222*9356374aSAndroid Build Coastguard Worker 223*9356374aSAndroid Build Coastguard Worker private: 224*9356374aSAndroid Build Coastguard Worker LogMessageData& data_; 225*9356374aSAndroid Build Coastguard Worker absl::Span<char> encoded_remaining_copy_; 226*9356374aSAndroid Build Coastguard Worker absl::Span<char> message_start_; 227*9356374aSAndroid Build Coastguard Worker absl::Span<char> string_start_; 228*9356374aSAndroid Build Coastguard Worker }; 229*9356374aSAndroid Build Coastguard Worker 230*9356374aSAndroid Build Coastguard Worker enum class StringType { 231*9356374aSAndroid Build Coastguard Worker kLiteral, 232*9356374aSAndroid Build Coastguard Worker kNotLiteral, 233*9356374aSAndroid Build Coastguard Worker }; 234*9356374aSAndroid Build Coastguard Worker template <StringType str_type> 235*9356374aSAndroid Build Coastguard Worker void CopyToEncodedBuffer(absl::string_view str) ABSL_ATTRIBUTE_NOINLINE; 236*9356374aSAndroid Build Coastguard Worker template <StringType str_type> 237*9356374aSAndroid Build Coastguard Worker void CopyToEncodedBuffer(char ch, size_t num) ABSL_ATTRIBUTE_NOINLINE; 238*9356374aSAndroid Build Coastguard Worker 239*9356374aSAndroid Build Coastguard Worker // Returns `true` if the message is fatal or enabled debug-fatal. 240*9356374aSAndroid Build Coastguard Worker bool IsFatal() const; 241*9356374aSAndroid Build Coastguard Worker 242*9356374aSAndroid Build Coastguard Worker // Records some tombstone-type data in anticipation of `Die`. 243*9356374aSAndroid Build Coastguard Worker void PrepareToDie(); 244*9356374aSAndroid Build Coastguard Worker void Die(); 245*9356374aSAndroid Build Coastguard Worker 246*9356374aSAndroid Build Coastguard Worker void SendToLog(); 247*9356374aSAndroid Build Coastguard Worker 248*9356374aSAndroid Build Coastguard Worker // Checks `FLAGS_log_backtrace_at` and appends a backtrace if appropriate. 249*9356374aSAndroid Build Coastguard Worker void LogBacktraceIfNeeded(); 250*9356374aSAndroid Build Coastguard Worker 251*9356374aSAndroid Build Coastguard Worker // This should be the first data member so that its initializer captures errno 252*9356374aSAndroid Build Coastguard Worker // before any other initializers alter it (e.g. with calls to new) and so that 253*9356374aSAndroid Build Coastguard Worker // no other destructors run afterward an alter it (e.g. with calls to delete). 254*9356374aSAndroid Build Coastguard Worker absl::base_internal::ErrnoSaver errno_saver_; 255*9356374aSAndroid Build Coastguard Worker 256*9356374aSAndroid Build Coastguard Worker // We keep the data in a separate struct so that each instance of `LogMessage` 257*9356374aSAndroid Build Coastguard Worker // uses less stack space. 258*9356374aSAndroid Build Coastguard Worker std::unique_ptr<LogMessageData> data_; 259*9356374aSAndroid Build Coastguard Worker }; 260*9356374aSAndroid Build Coastguard Worker 261*9356374aSAndroid Build Coastguard Worker // Helper class so that `AbslStringify()` can modify the LogMessage. 262*9356374aSAndroid Build Coastguard Worker class StringifySink final { 263*9356374aSAndroid Build Coastguard Worker public: StringifySink(LogMessage & message)264*9356374aSAndroid Build Coastguard Worker explicit StringifySink(LogMessage& message) : message_(message) {} 265*9356374aSAndroid Build Coastguard Worker Append(size_t count,char ch)266*9356374aSAndroid Build Coastguard Worker void Append(size_t count, char ch) { 267*9356374aSAndroid Build Coastguard Worker message_.CopyToEncodedBuffer<LogMessage::StringType::kNotLiteral>(ch, 268*9356374aSAndroid Build Coastguard Worker count); 269*9356374aSAndroid Build Coastguard Worker } 270*9356374aSAndroid Build Coastguard Worker Append(absl::string_view v)271*9356374aSAndroid Build Coastguard Worker void Append(absl::string_view v) { 272*9356374aSAndroid Build Coastguard Worker message_.CopyToEncodedBuffer<LogMessage::StringType::kNotLiteral>(v); 273*9356374aSAndroid Build Coastguard Worker } 274*9356374aSAndroid Build Coastguard Worker 275*9356374aSAndroid Build Coastguard Worker // For types that implement `AbslStringify` using `absl::Format()`. AbslFormatFlush(StringifySink * sink,absl::string_view v)276*9356374aSAndroid Build Coastguard Worker friend void AbslFormatFlush(StringifySink* sink, absl::string_view v) { 277*9356374aSAndroid Build Coastguard Worker sink->Append(v); 278*9356374aSAndroid Build Coastguard Worker } 279*9356374aSAndroid Build Coastguard Worker 280*9356374aSAndroid Build Coastguard Worker private: 281*9356374aSAndroid Build Coastguard Worker LogMessage& message_; 282*9356374aSAndroid Build Coastguard Worker }; 283*9356374aSAndroid Build Coastguard Worker 284*9356374aSAndroid Build Coastguard Worker // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE` 285*9356374aSAndroid Build Coastguard Worker template <typename T, 286*9356374aSAndroid Build Coastguard Worker typename std::enable_if<absl::HasAbslStringify<T>::value, int>::type> 287*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const T& v) { 288*9356374aSAndroid Build Coastguard Worker StringifySink sink(*this); 289*9356374aSAndroid Build Coastguard Worker // Replace with public API. 290*9356374aSAndroid Build Coastguard Worker AbslStringify(sink, v); 291*9356374aSAndroid Build Coastguard Worker return *this; 292*9356374aSAndroid Build Coastguard Worker } 293*9356374aSAndroid Build Coastguard Worker 294*9356374aSAndroid Build Coastguard Worker // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE` 295*9356374aSAndroid Build Coastguard Worker template <typename T, 296*9356374aSAndroid Build Coastguard Worker typename std::enable_if<!absl::HasAbslStringify<T>::value, int>::type> 297*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const T& v) { 298*9356374aSAndroid Build Coastguard Worker OstreamView view(*data_); 299*9356374aSAndroid Build Coastguard Worker view.stream() << log_internal::NullGuard<T>().Guard(v); 300*9356374aSAndroid Build Coastguard Worker return *this; 301*9356374aSAndroid Build Coastguard Worker } 302*9356374aSAndroid Build Coastguard Worker 303*9356374aSAndroid Build Coastguard Worker template <int SIZE> 304*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(const char (&buf)[SIZE]) { 305*9356374aSAndroid Build Coastguard Worker CopyToEncodedBuffer<StringType::kLiteral>(buf); 306*9356374aSAndroid Build Coastguard Worker return *this; 307*9356374aSAndroid Build Coastguard Worker } 308*9356374aSAndroid Build Coastguard Worker 309*9356374aSAndroid Build Coastguard Worker // Note: the following is declared `ABSL_ATTRIBUTE_NOINLINE` 310*9356374aSAndroid Build Coastguard Worker template <int SIZE> 311*9356374aSAndroid Build Coastguard Worker LogMessage& LogMessage::operator<<(char (&buf)[SIZE]) { 312*9356374aSAndroid Build Coastguard Worker CopyToEncodedBuffer<StringType::kNotLiteral>(buf); 313*9356374aSAndroid Build Coastguard Worker return *this; 314*9356374aSAndroid Build Coastguard Worker } 315*9356374aSAndroid Build Coastguard Worker // We instantiate these specializations in the library's TU to save space in 316*9356374aSAndroid Build Coastguard Worker // other TUs. Since the template is marked `ABSL_ATTRIBUTE_NOINLINE` we will be 317*9356374aSAndroid Build Coastguard Worker // emitting a function call either way. 318*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const char& v); 319*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const signed char& v); 320*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const unsigned char& v); 321*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const short& v); // NOLINT 322*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<( 323*9356374aSAndroid Build Coastguard Worker const unsigned short& v); // NOLINT 324*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const int& v); 325*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<( 326*9356374aSAndroid Build Coastguard Worker const unsigned int& v); // NOLINT 327*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const long& v); // NOLINT 328*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<( 329*9356374aSAndroid Build Coastguard Worker const unsigned long& v); // NOLINT 330*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<( 331*9356374aSAndroid Build Coastguard Worker const long long& v); // NOLINT 332*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<( 333*9356374aSAndroid Build Coastguard Worker const unsigned long long& v); // NOLINT 334*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(void* const& v); 335*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const void* const& v); 336*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const float& v); 337*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const double& v); 338*9356374aSAndroid Build Coastguard Worker extern template LogMessage& LogMessage::operator<<(const bool& v); 339*9356374aSAndroid Build Coastguard Worker 340*9356374aSAndroid Build Coastguard Worker extern template void LogMessage::CopyToEncodedBuffer< 341*9356374aSAndroid Build Coastguard Worker LogMessage::StringType::kLiteral>(absl::string_view str); 342*9356374aSAndroid Build Coastguard Worker extern template void LogMessage::CopyToEncodedBuffer< 343*9356374aSAndroid Build Coastguard Worker LogMessage::StringType::kNotLiteral>(absl::string_view str); 344*9356374aSAndroid Build Coastguard Worker extern template void 345*9356374aSAndroid Build Coastguard Worker LogMessage::CopyToEncodedBuffer<LogMessage::StringType::kLiteral>(char ch, 346*9356374aSAndroid Build Coastguard Worker size_t num); 347*9356374aSAndroid Build Coastguard Worker extern template void LogMessage::CopyToEncodedBuffer< 348*9356374aSAndroid Build Coastguard Worker LogMessage::StringType::kNotLiteral>(char ch, size_t num); 349*9356374aSAndroid Build Coastguard Worker 350*9356374aSAndroid Build Coastguard Worker // `LogMessageFatal` ensures the process will exit in failure after logging this 351*9356374aSAndroid Build Coastguard Worker // message. 352*9356374aSAndroid Build Coastguard Worker class LogMessageFatal final : public LogMessage { 353*9356374aSAndroid Build Coastguard Worker public: 354*9356374aSAndroid Build Coastguard Worker LogMessageFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD; 355*9356374aSAndroid Build Coastguard Worker LogMessageFatal(const char* file, int line, 356*9356374aSAndroid Build Coastguard Worker absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD; 357*9356374aSAndroid Build Coastguard Worker [[noreturn]] ~LogMessageFatal(); 358*9356374aSAndroid Build Coastguard Worker }; 359*9356374aSAndroid Build Coastguard Worker 360*9356374aSAndroid Build Coastguard Worker // `LogMessageDebugFatal` ensures the process will exit in failure after logging 361*9356374aSAndroid Build Coastguard Worker // this message. It matches LogMessageFatal but is not [[noreturn]] as it's used 362*9356374aSAndroid Build Coastguard Worker // for DLOG(FATAL) variants. 363*9356374aSAndroid Build Coastguard Worker class LogMessageDebugFatal final : public LogMessage { 364*9356374aSAndroid Build Coastguard Worker public: 365*9356374aSAndroid Build Coastguard Worker LogMessageDebugFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD; 366*9356374aSAndroid Build Coastguard Worker ~LogMessageDebugFatal(); 367*9356374aSAndroid Build Coastguard Worker }; 368*9356374aSAndroid Build Coastguard Worker 369*9356374aSAndroid Build Coastguard Worker class LogMessageQuietlyDebugFatal final : public LogMessage { 370*9356374aSAndroid Build Coastguard Worker public: 371*9356374aSAndroid Build Coastguard Worker // DLOG(QFATAL) calls this instead of LogMessageQuietlyFatal to make sure the 372*9356374aSAndroid Build Coastguard Worker // destructor is not [[noreturn]] even if this is always FATAL as this is only 373*9356374aSAndroid Build Coastguard Worker // invoked when DLOG() is enabled. 374*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyDebugFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD; 375*9356374aSAndroid Build Coastguard Worker ~LogMessageQuietlyDebugFatal(); 376*9356374aSAndroid Build Coastguard Worker }; 377*9356374aSAndroid Build Coastguard Worker 378*9356374aSAndroid Build Coastguard Worker // Used for LOG(QFATAL) to make sure it's properly understood as [[noreturn]]. 379*9356374aSAndroid Build Coastguard Worker class LogMessageQuietlyFatal final : public LogMessage { 380*9356374aSAndroid Build Coastguard Worker public: 381*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyFatal(const char* file, int line) ABSL_ATTRIBUTE_COLD; 382*9356374aSAndroid Build Coastguard Worker LogMessageQuietlyFatal(const char* file, int line, 383*9356374aSAndroid Build Coastguard Worker absl::string_view failure_msg) ABSL_ATTRIBUTE_COLD; 384*9356374aSAndroid Build Coastguard Worker [[noreturn]] ~LogMessageQuietlyFatal(); 385*9356374aSAndroid Build Coastguard Worker }; 386*9356374aSAndroid Build Coastguard Worker 387*9356374aSAndroid Build Coastguard Worker } // namespace log_internal 388*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END 389*9356374aSAndroid Build Coastguard Worker } // namespace absl 390*9356374aSAndroid Build Coastguard Worker 391*9356374aSAndroid Build Coastguard Worker extern "C" ABSL_ATTRIBUTE_WEAK void ABSL_INTERNAL_C_SYMBOL( 392*9356374aSAndroid Build Coastguard Worker AbslInternalOnFatalLogMessage)(const absl::LogEntry&); 393*9356374aSAndroid Build Coastguard Worker 394*9356374aSAndroid Build Coastguard Worker #endif // ABSL_LOG_INTERNAL_LOG_MESSAGE_H_ 395