| //===-- Stream.h ------------------------------------------------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef liblldb_Stream_h_ |
| #define liblldb_Stream_h_ |
| |
| #include "lldb/Utility/Flags.h" |
| #include "lldb/lldb-defines.h" |
| #include "lldb/lldb-enumerations.h" // for ByteOrder::eByteOrderInvalid |
| #include "llvm/ADT/StringRef.h" // for StringRef |
| #include "llvm/Support/FormatVariadic.h" |
| |
| #include <stdarg.h> |
| #include <stddef.h> // for size_t |
| #include <stdint.h> // for uint32_t, uint64_t, uint8_t |
| #include <type_traits> // for forward |
| |
| namespace lldb_private { |
| |
| //---------------------------------------------------------------------- |
| /// @class Stream Stream.h "lldb/Utility/Stream.h" |
| /// A stream class that can stream formatted output to a file. |
| //---------------------------------------------------------------------- |
| class Stream { |
| public: |
| //------------------------------------------------------------------ |
| /// \a m_flags bit values. |
| //------------------------------------------------------------------ |
| enum { |
| eBinary = (1 << 0) ///< Get and put data as binary instead of as the default |
| /// string mode. |
| }; |
| |
| //------------------------------------------------------------------ |
| /// Construct with flags and address size and byte order. |
| /// |
| /// Construct with dump flags \a flags and the default address size. \a |
| /// flags can be any of the above enumeration logical OR'ed together. |
| //------------------------------------------------------------------ |
| Stream(uint32_t flags, uint32_t addr_size, lldb::ByteOrder byte_order); |
| |
| //------------------------------------------------------------------ |
| /// Construct a default Stream, not binary, host byte order and host addr |
| /// size. |
| /// |
| //------------------------------------------------------------------ |
| Stream(); |
| |
| //------------------------------------------------------------------ |
| /// Destructor |
| //------------------------------------------------------------------ |
| virtual ~Stream(); |
| |
| //------------------------------------------------------------------ |
| // Subclasses must override these methods |
| //------------------------------------------------------------------ |
| |
| //------------------------------------------------------------------ |
| /// Flush the stream. |
| /// |
| /// Subclasses should flush the stream to make any output appear if the |
| /// stream has any buffering. |
| //------------------------------------------------------------------ |
| virtual void Flush() = 0; |
| |
| //------------------------------------------------------------------ |
| /// Output character bytes to the stream. |
| /// |
| /// Appends \a src_len characters from the buffer \a src to the stream. |
| /// |
| /// @param[in] src |
| /// A buffer containing at least \a src_len bytes of data. |
| /// |
| /// @param[in] src_len |
| /// A number of bytes to append to the stream. |
| /// |
| /// @return |
| /// The number of bytes that were appended to the stream. |
| //------------------------------------------------------------------ |
| virtual size_t Write(const void *src, size_t src_len) = 0; |
| |
| //------------------------------------------------------------------ |
| // Member functions |
| //------------------------------------------------------------------ |
| size_t PutChar(char ch); |
| |
| //------------------------------------------------------------------ |
| /// Set the byte_order value. |
| /// |
| /// Sets the byte order of the data to extract. Extracted values will be |
| /// swapped if necessary when decoding. |
| /// |
| /// @param[in] byte_order |
| /// The byte order value to use when extracting data. |
| /// |
| /// @return |
| /// The old byte order value. |
| //------------------------------------------------------------------ |
| lldb::ByteOrder SetByteOrder(lldb::ByteOrder byte_order); |
| |
| //------------------------------------------------------------------ |
| /// Format a C string from a printf style format and variable arguments and |
| /// encode and append the resulting C string as hex bytes. |
| /// |
| /// @param[in] format |
| /// A printf style format string. |
| /// |
| /// @param[in] ... |
| /// Any additional arguments needed for the printf format string. |
| /// |
| /// @return |
| /// The number of bytes that were appended to the stream. |
| //------------------------------------------------------------------ |
| size_t PrintfAsRawHex8(const char *format, ...) |
| __attribute__((__format__(__printf__, 2, 3))); |
| |
| //------------------------------------------------------------------ |
| /// Format a C string from a printf style format and variable arguments and |
| /// encode and append the resulting C string as hex bytes. |
| /// |
| /// @param[in] format |
| /// A printf style format string. |
| /// |
| /// @param[in] ... |
| /// Any additional arguments needed for the printf format string. |
| /// |
| /// @return |
| /// The number of bytes that were appended to the stream. |
| //------------------------------------------------------------------ |
| size_t PutHex8(uint8_t uvalue); |
| |
| size_t PutNHex8(size_t n, uint8_t uvalue); |
| |
| size_t PutHex16(uint16_t uvalue, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutHex32(uint32_t uvalue, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutHex64(uint64_t uvalue, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutMaxHex64(uint64_t uvalue, size_t byte_size, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| size_t PutFloat(float f, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutDouble(double d, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutLongDouble(long double ld, |
| lldb::ByteOrder byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutPointer(void *ptr); |
| |
| // Append \a src_len bytes from \a src to the stream as hex characters (two |
| // ascii characters per byte of input data) |
| size_t |
| PutBytesAsRawHex8(const void *src, size_t src_len, |
| lldb::ByteOrder src_byte_order = lldb::eByteOrderInvalid, |
| lldb::ByteOrder dst_byte_order = lldb::eByteOrderInvalid); |
| |
| // Append \a src_len bytes from \a s to the stream as binary data. |
| size_t PutRawBytes(const void *s, size_t src_len, |
| lldb::ByteOrder src_byte_order = lldb::eByteOrderInvalid, |
| lldb::ByteOrder dst_byte_order = lldb::eByteOrderInvalid); |
| |
| size_t PutCStringAsRawHex8(const char *s); |
| |
| //------------------------------------------------------------------ |
| /// Output a NULL terminated C string \a cstr to the stream \a s. |
| /// |
| /// @param[in] cstr |
| /// A NULL terminated C string. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(const char *cstr); |
| |
| Stream &operator<<(llvm::StringRef str); |
| |
| //------------------------------------------------------------------ |
| /// Output a pointer value \a p to the stream \a s. |
| /// |
| /// @param[in] p |
| /// A void pointer. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(const void *p); |
| |
| //------------------------------------------------------------------ |
| /// Output a character \a ch to the stream \a s. |
| /// |
| /// @param[in] ch |
| /// A printable character value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(char ch); |
| |
| //------------------------------------------------------------------ |
| /// Output a uint8_t \a uval to the stream \a s. |
| /// |
| /// @param[in] uval |
| /// A uint8_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(uint8_t uval); |
| |
| //------------------------------------------------------------------ |
| /// Output a uint16_t \a uval to the stream \a s. |
| /// |
| /// @param[in] uval |
| /// A uint16_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(uint16_t uval); |
| |
| //------------------------------------------------------------------ |
| /// Output a uint32_t \a uval to the stream \a s. |
| /// |
| /// @param[in] uval |
| /// A uint32_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(uint32_t uval); |
| |
| //------------------------------------------------------------------ |
| /// Output a uint64_t \a uval to the stream \a s. |
| /// |
| /// @param[in] uval |
| /// A uint64_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(uint64_t uval); |
| |
| //------------------------------------------------------------------ |
| /// Output a int8_t \a sval to the stream \a s. |
| /// |
| /// @param[in] sval |
| /// A int8_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(int8_t sval); |
| |
| //------------------------------------------------------------------ |
| /// Output a int16_t \a sval to the stream \a s. |
| /// |
| /// @param[in] sval |
| /// A int16_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(int16_t sval); |
| |
| //------------------------------------------------------------------ |
| /// Output a int32_t \a sval to the stream \a s. |
| /// |
| /// @param[in] sval |
| /// A int32_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(int32_t sval); |
| |
| //------------------------------------------------------------------ |
| /// Output a int64_t \a sval to the stream \a s. |
| /// |
| /// @param[in] sval |
| /// A int64_t value. |
| /// |
| /// @return |
| /// A reference to this class so multiple things can be streamed |
| /// in one statement. |
| //------------------------------------------------------------------ |
| Stream &operator<<(int64_t sval); |
| |
| //------------------------------------------------------------------ |
| /// Output an address value to this stream. |
| /// |
| /// Put an address \a addr out to the stream with optional \a prefix and \a |
| /// suffix strings. |
| /// |
| /// @param[in] addr |
| /// An address value. |
| /// |
| /// @param[in] addr_size |
| /// Size in bytes of the address, used for formatting. |
| /// |
| /// @param[in] prefix |
| /// A prefix C string. If nullptr, no prefix will be output. |
| /// |
| /// @param[in] suffix |
| /// A suffix C string. If nullptr, no suffix will be output. |
| //------------------------------------------------------------------ |
| void Address(uint64_t addr, uint32_t addr_size, const char *prefix = nullptr, |
| const char *suffix = nullptr); |
| |
| //------------------------------------------------------------------ |
| /// Output an address range to this stream. |
| /// |
| /// Put an address range \a lo_addr - \a hi_addr out to the stream with |
| /// optional \a prefix and \a suffix strings. |
| /// |
| /// @param[in] lo_addr |
| /// The start address of the address range. |
| /// |
| /// @param[in] hi_addr |
| /// The end address of the address range. |
| /// |
| /// @param[in] addr_size |
| /// Size in bytes of the address, used for formatting. |
| /// |
| /// @param[in] prefix |
| /// A prefix C string. If nullptr, no prefix will be output. |
| /// |
| /// @param[in] suffix |
| /// A suffix C string. If nullptr, no suffix will be output. |
| //------------------------------------------------------------------ |
| void AddressRange(uint64_t lo_addr, uint64_t hi_addr, uint32_t addr_size, |
| const char *prefix = nullptr, const char *suffix = nullptr); |
| |
| //------------------------------------------------------------------ |
| /// Output a C string to the stream. |
| /// |
| /// Print a C string \a cstr to the stream. |
| /// |
| /// @param[in] cstr |
| /// The string to be output to the stream. |
| //------------------------------------------------------------------ |
| size_t PutCString(llvm::StringRef cstr); |
| |
| //------------------------------------------------------------------ |
| /// Output and End of Line character to the stream. |
| //------------------------------------------------------------------ |
| size_t EOL(); |
| |
| //------------------------------------------------------------------ |
| /// Get the address size in bytes. |
| /// |
| /// @return |
| /// The size of an address in bytes that is used when outputting |
| /// address and pointer values to the stream. |
| //------------------------------------------------------------------ |
| uint32_t GetAddressByteSize() const; |
| |
| //------------------------------------------------------------------ |
| /// The flags accessor. |
| /// |
| /// @return |
| /// A reference to the Flags member variable. |
| //------------------------------------------------------------------ |
| Flags &GetFlags(); |
| |
| //------------------------------------------------------------------ |
| /// The flags const accessor. |
| /// |
| /// @return |
| /// A const reference to the Flags member variable. |
| //------------------------------------------------------------------ |
| const Flags &GetFlags() const; |
| |
| //------------------------------------------------------------------ |
| //// The byte order accessor. |
| //// |
| //// @return |
| //// The byte order. |
| //------------------------------------------------------------------ |
| lldb::ByteOrder GetByteOrder() const; |
| |
| //------------------------------------------------------------------ |
| /// Get the current indentation level. |
| /// |
| /// @return |
| /// The current indentation level as an integer. |
| //------------------------------------------------------------------ |
| int GetIndentLevel() const; |
| |
| //------------------------------------------------------------------ |
| /// Indent the current line in the stream. |
| /// |
| /// Indent the current line using the current indentation level and print an |
| /// optional string following the indentation spaces. |
| /// |
| /// @param[in] s |
| /// A C string to print following the indentation. If nullptr, just |
| /// output the indentation characters. |
| //------------------------------------------------------------------ |
| size_t Indent(const char *s = nullptr); |
| size_t Indent(llvm::StringRef s); |
| |
| //------------------------------------------------------------------ |
| /// Decrement the current indentation level. |
| //------------------------------------------------------------------ |
| void IndentLess(int amount = 2); |
| |
| //------------------------------------------------------------------ |
| /// Increment the current indentation level. |
| //------------------------------------------------------------------ |
| void IndentMore(int amount = 2); |
| |
| //------------------------------------------------------------------ |
| /// Output an offset value. |
| /// |
| /// Put an offset \a uval out to the stream using the printf format in \a |
| /// format. |
| /// |
| /// @param[in] offset |
| /// The offset value. |
| /// |
| /// @param[in] format |
| /// The printf style format to use when outputting the offset. |
| //------------------------------------------------------------------ |
| void Offset(uint32_t offset, const char *format = "0x%8.8x: "); |
| |
| //------------------------------------------------------------------ |
| /// Output printf formatted output to the stream. |
| /// |
| /// Print some formatted output to the stream. |
| /// |
| /// @param[in] format |
| /// A printf style format string. |
| /// |
| /// @param[in] ... |
| /// Variable arguments that are needed for the printf style |
| /// format string \a format. |
| //------------------------------------------------------------------ |
| size_t Printf(const char *format, ...) __attribute__((format(printf, 2, 3))); |
| |
| size_t PrintfVarArg(const char *format, va_list args); |
| |
| template <typename... Args> void Format(const char *format, Args &&... args) { |
| PutCString(llvm::formatv(format, std::forward<Args>(args)...).str()); |
| } |
| |
| //------------------------------------------------------------------ |
| /// Output a quoted C string value to the stream. |
| /// |
| /// Print a double quoted NULL terminated C string to the stream using the |
| /// printf format in \a format. |
| /// |
| /// @param[in] cstr |
| /// A NULL terminated C string value. |
| /// |
| /// @param[in] format |
| /// The optional C string format that can be overridden. |
| //------------------------------------------------------------------ |
| void QuotedCString(const char *cstr, const char *format = "\"%s\""); |
| |
| //------------------------------------------------------------------ |
| /// Set the address size in bytes. |
| /// |
| /// @param[in] addr_size |
| /// The new size in bytes of an address to use when outputting |
| /// address and pointer values. |
| //------------------------------------------------------------------ |
| void SetAddressByteSize(uint32_t addr_size); |
| |
| //------------------------------------------------------------------ |
| /// Set the current indentation level. |
| /// |
| /// @param[in] level |
| /// The new indentation level. |
| //------------------------------------------------------------------ |
| void SetIndentLevel(int level); |
| |
| //------------------------------------------------------------------ |
| /// Output a SLEB128 number to the stream. |
| /// |
| /// Put an SLEB128 \a uval out to the stream using the printf format in \a |
| /// format. |
| /// |
| /// @param[in] uval |
| /// A uint64_t value that was extracted as a SLEB128 value. |
| /// |
| /// @param[in] format |
| /// The optional printf format that can be overridden. |
| //------------------------------------------------------------------ |
| size_t PutSLEB128(int64_t uval); |
| |
| //------------------------------------------------------------------ |
| /// Output a ULEB128 number to the stream. |
| /// |
| /// Put an ULEB128 \a uval out to the stream using the printf format in \a |
| /// format. |
| /// |
| /// @param[in] uval |
| /// A uint64_t value that was extracted as a ULEB128 value. |
| /// |
| /// @param[in] format |
| /// The optional printf format that can be overridden. |
| //------------------------------------------------------------------ |
| size_t PutULEB128(uint64_t uval); |
| |
| protected: |
| //------------------------------------------------------------------ |
| // Member variables |
| //------------------------------------------------------------------ |
| Flags m_flags; ///< Dump flags. |
| uint32_t m_addr_size; ///< Size of an address in bytes. |
| lldb::ByteOrder |
| m_byte_order; ///< Byte order to use when encoding scalar types. |
| int m_indent_level; ///< Indention level. |
| |
| size_t _PutHex8(uint8_t uvalue, bool add_prefix); |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // liblldb_Stream_h_ |