124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Stream.cpp ----------------------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 11cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Endian.h" 12769908bd4f1d0e09f60dc8f75d1a1b6f41ca6963Benjamin Kramer#include <stddef.h> 13a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <stdio.h> 14a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <string.h> 15a408326b499c3ffdfed2378738598c4ad0cf745fEli Friedman#include <stdlib.h> 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 175f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea#include <inttypes.h> 185f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Stream (uint32_t flags, uint32_t addr_size, ByteOrder byte_order) : 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags (flags), 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_size (addr_size), 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_order (byte_order), 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indent_level(0) 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Stream () : 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags (0), 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_size (4), 33cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton m_byte_order (lldb::endian::InlHostByteOrder()), 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indent_level(0) 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::~Stream () 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerByteOrder 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::SetByteOrder (ByteOrder byte_order) 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ByteOrder old_byte_order = m_byte_order; 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_byte_order = byte_order; 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return old_byte_order; 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an offset "uval" out to the stream using the printf format 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in "format". 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Offset (uint32_t uval, const char *format) 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf (format, uval); 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an SLEB128 "uval" out to the stream using the printf format 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in "format". 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 6736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutSLEB128 (int64_t sval) 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 71f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_flags.Test(eBinary)) 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool more = true; 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner while (more) 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t byte = sval & 0x7fu; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sval >>= 7; 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner /* sign bit of byte is 2nd high order bit (0x40) */ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if ((sval == 0 && !(byte & 0x40)) || 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner (sval == -1 && (byte & 0x40)) ) 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner more = false; 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // more bytes to come 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte |= 0x80u; 8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += Write(&byte, 1); 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 905f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea bytes_written = Printf ("0x%" PRIi64, sval); 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an ULEB128 "uval" out to the stream using the printf format 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// in "format". 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 10136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutULEB128 (uint64_t uval) 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 105f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_flags.Test(eBinary)) 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner do 10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint8_t byte = uval & 0x7fu; 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uval >>= 7; 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (uval != 0) 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // more bytes to come 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte |= 0x80u; 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += Write(&byte, 1); 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } while (uval != 0); 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1225f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea bytes_written = Printf ("0x%" PRIx64, uval); 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 1284691fc522359004738cde0646af96e0a39181b6bEnrico Granata// Print a raw NULL terminated C string to the stream. 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 13036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutCString (const char *cstr) 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 13336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t cstr_len = strlen(cstr); 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // when in binary mode, emit the NULL terminator 135f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_flags.Test(eBinary)) 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++cstr_len; 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (cstr, cstr_len); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print a double quoted NULL terminated C string to the stream 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// using the printf format in "format". 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::QuotedCString (const char *cstr, const char *format) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf (format, cstr); 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an address "addr" out to the stream with optional prefix 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and suffix strings. 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonStream::Address (uint64_t addr, uint32_t addr_size, const char *prefix, const char *suffix) 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (prefix == NULL) 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner prefix = ""; 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (suffix == NULL) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner suffix = ""; 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// int addr_width = m_addr_size << 1; 1625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea// Printf ("%s0x%0*" PRIx64 "%s", prefix, addr_width, addr, suffix); 1635f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea Printf ("%s0x%0*" PRIx64 "%s", prefix, addr_size * 2, (uint64_t)addr, suffix); 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Put an address range out to the stream with optional prefix 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// and suffix strings. 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 17136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonStream::AddressRange(uint64_t lo_addr, uint64_t hi_addr, uint32_t addr_size, const char *prefix, const char *suffix) 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 17348f479811cabdbd8b4c24083a0e8ef56d0e7369dGreg Clayton if (prefix && prefix[0]) 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutCString (prefix); 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address (lo_addr, addr_size, "["); 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Address (hi_addr, addr_size, "-", ")"); 17748f479811cabdbd8b4c24083a0e8ef56d0e7369dGreg Clayton if (suffix && suffix[0]) 17848f479811cabdbd8b4c24083a0e8ef56d0e7369dGreg Clayton PutCString (suffix); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutChar (char ch) 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Write (&ch, 1); 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print some formatted output to the stream. 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 19236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Printf (const char *format, ...) 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t result = PrintfVarArg(format, args); 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result; 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print some formatted output to the stream. 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 20536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PrintfVarArg (const char *format, va_list args) 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char str[1024]; 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args_copy; 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_copy (args_copy, args); 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and format our string into a fixed buffer first and see if it fits 21554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t length = ::vsnprintf (str, sizeof(str), format, args); 21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (length < sizeof(str)) 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include the NULL termination byte for binary output 219f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_flags.Test(eBinary)) 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length += 1; 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The formatted string fit into our stack based buffer, so we can just 22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // append that to our packet 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written = Write (str, length); 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Our stack buffer wasn't big enough to contain the entire formatted 22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // string, so lets let vasprintf create the string for us! 22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *str_ptr = NULL; 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = ::vasprintf (&str_ptr, format, args_copy); 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (str_ptr) 23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Include the NULL termination byte for binary output 234f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_flags.Test(eBinary)) 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length += 1; 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written = Write (str_ptr, length); 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::free (str_ptr); 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args_copy); 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Print and End of Line character to the stream 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 24736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::EOL() 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return PutChar ('\n'); 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Indent the current line using the current indentation level and 25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// print an optional string following the idenatation spaces. 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 25736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::Indent(const char *s) 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return Printf ("%*.*s%s", m_indent_level, m_indent_level, "", s ? s : ""); 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a character "ch" out to this stream. 26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (char ch) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutChar (ch); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream the NULL terminated C string out to this stream. 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (const char *s) 27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("%s", s); 28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream the pointer value out to this stream. 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (void *p) 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("0x%.*tx", (int)sizeof(void*) * 2, (ptrdiff_t)p); 29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint8_t "uval" out to this stream. 29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint8_t uval) 29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutHex8(uval); 30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint16_t "uval" out to this stream. 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint16_t uval) 30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutHex16(uval, m_byte_order); 31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint32_t "uval" out to this stream. 31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint32_t uval) 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutHex32(uval, m_byte_order); 32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a uint64_t "uval" out to this stream. 32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (uint64_t uval) 32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutHex64(uval, m_byte_order); 33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int8_t "sval" out to this stream. 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int8_t sval) 33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("%i", (int)sval); 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int16_t "sval" out to this stream. 34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int16_t sval) 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("%i", (int)sval); 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int32_t "sval" out to this stream. 35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int32_t sval) 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Printf ("%i", (int)sval); 36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Stream a int64_t "sval" out to this stream. 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream& 36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::operator<< (int64_t sval) 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3695f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea Printf ("%" PRIi64, sval); 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return *this; 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the current indentation level 37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetIndentLevel() const 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_indent_level; 38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the current indentation level 38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::SetIndentLevel(int indent_level) 38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indent_level = indent_level; 38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Increment the current indentation level 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::IndentMore(int amount) 39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indent_level += amount; 39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Decrement the current indentation level 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::IndentLess (int amount) 40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_indent_level >= amount) 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indent_level -= amount; 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_indent_level = 0; 41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Get the address size in bytes 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 41536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonuint32_t 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetAddressByteSize() const 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_addr_size; 41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Set the address size in bytes 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 42536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonStream::SetAddressByteSize(uint32_t addr_size) 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_addr_size = addr_size; 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the verbose flag bit is set in this stream. 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 43424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetVerbose() const 43524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 436f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_flags.Test(eVerbose); 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if the debug flag bit is set in this stream. 44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetDebug() const 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 445f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return m_flags.Test(eDebug); 44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The flags get accessor 45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags& 45224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetFlags() 45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_flags; 45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The flags const get accessor 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------ 46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags& 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::GetFlags() const 46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_flags; 46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 466b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan//------------------------------------------------------------------ 467b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan// The byte order get accessor 468b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan//------------------------------------------------------------------ 469b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan 470b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callananlldb::ByteOrder 471b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean CallananStream::GetByteOrder() const 472b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan{ 473b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan return m_byte_order; 474b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan} 475b352ebdfef166f3d0363fe9af50dcf063638d9f7Sean Callanan 47636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PrintfAsRawHex8 (const char *format, ...) 47824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args; 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_list args_copy; 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_start (args, format); 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_copy (args, args_copy); // Copy this so we 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char str[1024]; 48536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Try and format our string into a fixed buffer first and see if it fits 48754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton size_t length = ::vsnprintf (str, sizeof(str), format, args); 48824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (length < sizeof(str)) 48924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // The formatted string fit into our stack based buffer, so we can just 49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // append that to our packet 49254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i=0; i<length; ++i) 49324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (str[i], false); 49424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Our stack buffer wasn't big enough to contain the entire formatted 49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // string, so lets let vasprintf create the string for us! 49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char *str_ptr = NULL; 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner length = ::vasprintf (&str_ptr, format, args_copy); 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (str_ptr) 50224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 50354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i=0; i<length; ++i) 50424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (str_ptr[i], false); 50524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ::free (str_ptr); 50624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 50824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args); 50924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner va_end (args_copy); 51024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 51224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 51324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 51436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 51524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutNHex8 (size_t n, uint8_t uvalue) 51624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 51736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 51854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i=0; i<n; ++i) 519f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bytes_written += _PutHex8 (uvalue, m_flags.Test(eAddPrefix)); 52024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 52124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 52224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 52336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 52424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::_PutHex8 (uint8_t uvalue, bool add_prefix) 52524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 52636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 527f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (m_flags.Test(eBinary)) 52824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 52924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written = Write (&uvalue, 1); 53024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 53124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 53224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 53324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (add_prefix) 53424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner PutCString("0x"); 53524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 53624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static char g_hex_to_ascii_hex_char[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 53724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner char nibble_chars[2]; 53824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nibble_chars[0] = g_hex_to_ascii_hex_char[(uvalue >> 4) & 0xf]; 53924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner nibble_chars[1] = g_hex_to_ascii_hex_char[(uvalue >> 0) & 0xf]; 54024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written = Write (nibble_chars, sizeof(nibble_chars)); 54124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 54224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 54324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 54424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 54536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 54624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex8 (uint8_t uvalue) 54724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 548f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return _PutHex8 (uvalue, m_flags.Test(eAddPrefix)); 54924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 55024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 55136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 55224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex16 (uint16_t uvalue, ByteOrder byte_order) 55324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 55424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderInvalid) 55524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_order = m_byte_order; 55624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 557f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool add_prefix = m_flags.Test(eAddPrefix); 55836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 55924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderLittle) 56024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false) 56236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix); 56324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 56524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 56654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false) 56736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix); 56824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 56924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 57024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 57124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 57236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 57324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex32(uint32_t uvalue, ByteOrder byte_order) 57424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 57524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderInvalid) 57624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_order = m_byte_order; 57724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 578f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool add_prefix = m_flags.Test(eAddPrefix); 57936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 58024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderLittle) 58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false) 58336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix); 58424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 58524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 58624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 58754e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false) 58836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix); 58924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 59124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutHex64(uint64_t uvalue, ByteOrder byte_order) 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderInvalid) 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_order = m_byte_order; 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 599f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool add_prefix = m_flags.Test(eAddPrefix); 60036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderLittle) 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60354e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t byte = 0; byte < sizeof(uvalue); ++byte, add_prefix = false) 60436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix); 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 60854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t byte = sizeof(uvalue)-1; byte < sizeof(uvalue); --byte, add_prefix = false) 60936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton bytes_written += _PutHex8 ((uint8_t)(uvalue >> (byte * 8)), add_prefix); 61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 61436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutMaxHex64 61624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 61724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t uvalue, 61824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner size_t byte_size, 61924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner lldb::ByteOrder byte_order 62024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 62124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 62224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (byte_size) 62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 62436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton case 1: return PutHex8 ((uint8_t)uvalue); 62536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton case 2: return PutHex16 ((uint16_t)uvalue); 62636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton case 4: return PutHex32 ((uint32_t)uvalue); 62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case 8: return PutHex64 (uvalue); 62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return 0; 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutPointer (void *ptr) 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 635cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return PutRawBytes (&ptr, sizeof(ptr), lldb::endian::InlHostByteOrder(), lldb::endian::InlHostByteOrder()); 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutFloat(float f, ByteOrder byte_order) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderInvalid) 64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_order = m_byte_order; 64324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 644cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return PutRawBytes (&f, sizeof(f), lldb::endian::InlHostByteOrder(), byte_order); 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 64736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutDouble(double d, ByteOrder byte_order) 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderInvalid) 65124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_order = m_byte_order; 65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 653cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return PutRawBytes (&d, sizeof(d), lldb::endian::InlHostByteOrder(), byte_order); 65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 65636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutLongDouble(long double ld, ByteOrder byte_order) 65824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (byte_order == eByteOrderInvalid) 66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner byte_order = m_byte_order; 66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 662cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton return PutRawBytes (&ld, sizeof(ld), lldb::endian::InlHostByteOrder(), byte_order); 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 66536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutRawBytes (const void *s, size_t src_len, ByteOrder src_byte_order, ByteOrder dst_byte_order) 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (src_byte_order == eByteOrderInvalid) 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner src_byte_order = m_byte_order; 67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_byte_order == eByteOrderInvalid) 67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst_byte_order = m_byte_order; 67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 67436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *src = (const uint8_t *)s; 676f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool binary_was_set = m_flags.Test (eBinary); 677f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!binary_was_set) 678f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton m_flags.Set (eBinary); 67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (src_byte_order == dst_byte_order) 68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68154e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i = 0; i < src_len; ++i) 68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (src[i], false); 68324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 68654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i = src_len-1; i < src_len; --i) 68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (src[i], false); 68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 689f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!binary_was_set) 69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Clear (eBinary); 69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 69536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutBytesAsRawHex8 (const void *s, size_t src_len, ByteOrder src_byte_order, ByteOrder dst_byte_order) 69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (src_byte_order == eByteOrderInvalid) 69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner src_byte_order = m_byte_order; 70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (dst_byte_order == eByteOrderInvalid) 70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner dst_byte_order = m_byte_order; 70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 70436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const uint8_t *src = (const uint8_t *)s; 706f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool binary_is_set = m_flags.Test(eBinary); 70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Clear(eBinary); 70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (src_byte_order == dst_byte_order) 70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71054e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i = 0; i < src_len; ++i) 71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (src[i], false); 71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 71554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton for (size_t i = src_len-1; i < src_len; --i) 71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (src[i], false); 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (binary_is_set) 71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set(eBinary); 72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 72324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 72436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::PutCStringAsRawHex8 (const char *s) 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton size_t bytes_written = 0; 728f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton bool binary_is_set = m_flags.Test(eBinary); 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Clear(eBinary); 73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner do 73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bytes_written += _PutHex8 (*s, false); 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ++s; 73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } while (*s); 73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (binary_is_set) 73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_flags.Set(eBinary); 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return bytes_written; 73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerStream::UnitTest(Stream *s) 74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex8(0x12); 74424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 746cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton s->PutHex16(0x3456, lldb::endian::InlHostByteOrder()); 74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 74824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex16(0x3456, eByteOrderBig); 74924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex16(0x3456, eByteOrderLittle); 75124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 753cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton s->PutHex32(0x789abcde, lldb::endian::InlHostByteOrder()); 75424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex32(0x789abcde, eByteOrderBig); 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex32(0x789abcde, eByteOrderLittle); 75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 760cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton s->PutHex64(0x1122334455667788ull, lldb::endian::InlHostByteOrder()); 76124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 76224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex64(0x1122334455667788ull, eByteOrderBig); 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutHex64(0x1122334455667788ull, eByteOrderLittle); 76524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 76624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *hola = "Hello World!!!"; 76724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutCString (hola); 76924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 77124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Write (hola, 5); 77224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 77424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutCStringAsRawHex8 (hola); 77524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 77724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutCStringAsRawHex8 ("01234"); 77824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 77924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf ("pid=%i", 12733); 78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 78224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar(' '); 78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PrintfAsRawHex8 ("pid=%i", 12733); 78424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutChar('\n'); 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 787