148534b31d8bc5a68ba152fcdb905bf266def5268Daniel Dunbar//===--- raw_ostream.h - Raw output stream ----------------------*- C++ -*-===// 260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// The LLVM Compiler Infrastructure 460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// This file is distributed under the University of Illinois Open Source 660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// License. See LICENSE.TXT for details. 760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//===----------------------------------------------------------------------===// 960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 1060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// This file defines the raw_ostream class. 1160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner// 1260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner//===----------------------------------------------------------------------===// 1360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 1460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#ifndef LLVM_SUPPORT_RAW_OSTREAM_H 1560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner#define LLVM_SUPPORT_RAW_OSTREAM_H 1660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 174c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar#include "llvm/ADT/SmallVector.h" 18dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar#include "llvm/ADT/StringRef.h" 191f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer#include "llvm/Support/DataTypes.h" 2037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include <system_error> 2160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 2260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnernamespace llvm { 230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass format_object_base; 240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass FormattedString; 250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass FormattedNumber; 260c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainartemplate <typename T> class SmallVectorImpl; 270c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 280c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarnamespace sys { 290c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarnamespace fs { 300c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarenum OpenFlags : unsigned; 310c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar} 320c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar} 330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// This class implements an extremely fast bulk output stream that can *only* 350c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// output to a stream. It does not support seeking, reopening, rewinding, line 360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// buffered disciplines etc. It is a simple buffer that outputs 3760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// a chunk at a time. 3860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerclass raw_ostream { 3989a66a96fed75796bc5e079217130b62105cb438Daniel Dunbarprivate: 40ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines void operator=(const raw_ostream &) = delete; 41ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines raw_ostream(const raw_ostream &) = delete; 42b3667ae9b6fb204e60d4e1def21442fbf0251f99Dan Gohman 43d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// The buffer is handled in such a way that the buffer is 44d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// uninitialized, unbuffered, or out of space when OutBufCur >= 45d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// OutBufEnd. Thus a single comparison suffices to determine if we 46d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// need to take the slow path to write a single character. 47d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// 48d17d74bb80d9da1712a066df40122e8584dad227Daniel Dunbar /// The buffer is in one of three states: 49906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 1. Unbuffered (BufferMode == Unbuffered) 50906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 1. Uninitialized (BufferMode != Unbuffered && OutBufStart == 0). 51906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 2. Buffered (BufferMode != Unbuffered && OutBufStart != 0 && 52c8213b782735c7916cbc996c8dcdf89f9593d354Daniel Dunbar /// OutBufEnd - OutBufStart >= 1). 53906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 54906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// If buffered, then the raw_ostream owns the buffer if (BufferMode == 55906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// InternalBuffer); otherwise the buffer has been set via SetBuffer and is 56906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// managed by the subclass. 57906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 58906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// If a subclass installs an external buffer using SetBuffer then it can wait 59906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// for a \see write_impl() call to handle the data which has been put into 60906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// this buffer. 6160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner char *OutBufStart, *OutBufEnd, *OutBufCur; 62085b9c034fb97120cffbf0c235c5f372f2c938b8Eric Christopher 63906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar enum BufferKind { 64906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar Unbuffered = 0, 65906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar InternalBuffer, 66906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar ExternalBuffer 67906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar } BufferMode; 68e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar 6960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic: 70e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin // color order matches ANSI escape sequence, don't change 71e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin enum Colors { 72e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin BLACK=0, 73e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin RED, 74e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin GREEN, 75e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin YELLOW, 76e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin BLUE, 77e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin MAGENTA, 78e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin CYAN, 79e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin WHITE, 80e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin SAVEDCOLOR 81e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin }; 82e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit raw_ostream(bool unbuffered = false) 840c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar : BufferMode(unbuffered ? Unbuffered : InternalBuffer) { 8560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Start out ready to flush. 86dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines OutBufStart = OutBufEnd = OutBufCur = nullptr; 8760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 885b8dbf839ba8f586e2823744dc695acf57480c5fNuno Lopes 89e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohman virtual ~raw_ostream(); 90fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 918f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor /// tell - Return the current offset with the file. 92cd0129f5a6f0485ecac525c17a3c5dff0a19ca5fChris Lattner uint64_t tell() const { return current_pos() + GetNumBytesInBuffer(); } 938f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 9460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 9560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Configuration Interface 9660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 97fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Set the stream to be buffered, with an automatically determined buffer 990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// size. 100208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman void SetBuffered(); 101fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1020c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Set the stream to be buffered, using the specified buffer size. 103906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar void SetBufferSize(size_t Size) { 104906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar flush(); 105906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar SetBufferAndMode(new char[Size], Size, InternalBuffer); 106906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar } 107208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman 108cd0129f5a6f0485ecac525c17a3c5dff0a19ca5fChris Lattner size_t GetBufferSize() const { 109208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman // If we're supposed to be buffered but haven't actually gotten around 110208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman // to allocating the buffer yet, return the value that would be used. 111dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (BufferMode != Unbuffered && OutBufStart == nullptr) 112208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman return preferred_buffer_size(); 113208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman 114208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman // Otherwise just return the size of the allocated buffer. 115f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman return OutBufEnd - OutBufStart; 116f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman } 117f3e488476e1bdfe9de6daddcd1cd452c9d874b56Dan Gohman 1180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Set the stream to be unbuffered. When unbuffered, the stream will flush 1190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// after every write. This routine will also flush the buffer immediately 1200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// when the stream is being set to unbuffered. 121906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar void SetUnbuffered() { 122906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar flush(); 123dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines SetBufferAndMode(nullptr, 0, Unbuffered); 124906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar } 125e77e434bc96f2935dcf337909c4009324fe24eafDaniel Dunbar 126ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman size_t GetNumBytesInBuffer() const { 12789a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar return OutBufCur - OutBufStart; 12889a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar } 12989a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 13060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 13160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Data Output Interface 13260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 133fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 13460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner void flush() { 13560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner if (OutBufCur != OutBufStart) 136cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar flush_nonempty(); 13760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 138fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 139f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray raw_ostream &operator<<(char C) { 140f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray if (OutBufCur >= OutBufEnd) 141de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar return write(C); 142f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray *OutBufCur++ = C; 143f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray return *this; 144f46dc79ac502f6ed06dea3ba558bcfcc49061114Nicolas Geoffray } 145fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1461f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson raw_ostream &operator<<(unsigned char C) { 1471f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson if (OutBufCur >= OutBufEnd) 148de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar return write(C); 1491f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson *OutBufCur++ = C; 1501f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson return *this; 1511f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson } 152fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1531f83b02c62380f5ac5502eccc45d7b6203a7ea93Owen Anderson raw_ostream &operator<<(signed char C) { 15460d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner if (OutBufCur >= OutBufEnd) 155de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar return write(C); 15660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner *OutBufCur++ = C; 15760d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner return *this; 15860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 159fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1602928c83b010f7cfdb0f819199d806f6942a7d995Daniel Dunbar raw_ostream &operator<<(StringRef Str) { 161dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar // Inline fast path, particularly for strings with a known length. 162dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar size_t Size = Str.size(); 16338f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar 16438f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar // Make sure we can use the fast path. 165dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines if (Size > (size_t)(OutBufEnd - OutBufCur)) 166dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar return write(Str.data(), Size); 16738f4dd7b5e333aee8f89cee85d1c79378fee0ffcDaniel Dunbar 168f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (Size) { 169f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar memcpy(OutBufCur, Str.data(), Size); 170f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar OutBufCur += Size; 171f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 172c39b80fdfc606f5df118288f4fc6b5e9c0b5ee41Daniel Dunbar return *this; 17360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner } 174fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 175dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar raw_ostream &operator<<(const char *Str) { 176052f1eebdb6dbfb3f1197cc91f28ebc688ffb02dMichael J. Spencer // Inline fast path, particularly for constant strings where a sufficiently 177dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar // smart compiler will simplify strlen. 178dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar 179a4f8ecd85de38c14b11bbd0fc8cb9a427e9f3d75Dan Gohman return this->operator<<(StringRef(Str)); 180dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar } 181dbe77cfa0bcae10d91fbdbf118a97ec212afc88eDaniel Dunbar 182906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar raw_ostream &operator<<(const std::string &Str) { 183906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar // Avoid the fast path, it would only increase code size for a marginal win. 184a4f8ecd85de38c14b11bbd0fc8cb9a427e9f3d75Dan Gohman return write(Str.data(), Str.length()); 185cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 186fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 1874c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar raw_ostream &operator<<(const llvm::SmallVectorImpl<char> &Str) { 1884c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar return write(Str.data(), Str.size()); 1894c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar } 1904c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 19166b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(unsigned long N); 19266b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(long N); 19366b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(unsigned long long N); 19466b17ba0d263442b8b4e82aaa08acc0df85e1787Owen Anderson raw_ostream &operator<<(long long N); 195944fac71e082cc2664cc71b4d3f6c72bab7143fbChris Lattner raw_ostream &operator<<(const void *P); 19689a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson raw_ostream &operator<<(unsigned int N) { 197a4f8ecd85de38c14b11bbd0fc8cb9a427e9f3d75Dan Gohman return this->operator<<(static_cast<unsigned long>(N)); 198cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 199fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 20089a1a85913fb559c7e0266570738fd9cdf616fa3Owen Anderson raw_ostream &operator<<(int N) { 201a4f8ecd85de38c14b11bbd0fc8cb9a427e9f3d75Dan Gohman return this->operator<<(static_cast<long>(N)); 202cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson } 203afc802dc7d963a2cb46f1b0c1f1b0faa5e1dca2aEli Friedman 204085b9c034fb97120cffbf0c235c5f372f2c938b8Eric Christopher raw_ostream &operator<<(double N); 205fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 2060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Output \p N in hexadecimal, without any prefix or padding. 20748018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar raw_ostream &write_hex(unsigned long long N); 20848018e08f0d47331e72e5dcfcde2173217091b0eDaniel Dunbar 2090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Output \p Str, turning '\\', '\t', '\n', '"', and anything that doesn't 2100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// satisfy std::isprint into an escape sequence. 21110a049e6cf50eb9a1dddae49dc21513cfeddcb47Daniel Dunbar raw_ostream &write_escaped(StringRef Str, bool UseHexEscapes = false); 212522b113a752a8e86932eebdc41ba07e058950e41Daniel Dunbar 213de75d7ffcd5ed315240cfe0c52a821cf66411edaDaniel Dunbar raw_ostream &write(unsigned char C); 214ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman raw_ostream &write(const char *Ptr, size_t Size); 215fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 216b2560526d5f6d2f9cc3698244dbb1f4861dc8efcChris Lattner // Formatted output, see the format() function in Support/Format.h. 217097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner raw_ostream &operator<<(const format_object_base &Fmt); 218fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 21937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Formatted output, see the leftJustify() function in Support/Format.h. 22037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines raw_ostream &operator<<(const FormattedString &); 221f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 22237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Formatted output, see the formatHex() function in Support/Format.h. 22337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines raw_ostream &operator<<(const FormattedNumber &); 224f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 225c5a227ddd1fa09cd66e4fd1c0473be5c2b4f8f32Chris Lattner /// indent - Insert 'NumSpaces' spaces. 226c5a227ddd1fa09cd66e4fd1c0473be5c2b4f8f32Chris Lattner raw_ostream &indent(unsigned NumSpaces); 227085b9c034fb97120cffbf0c235c5f372f2c938b8Eric Christopher 228e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// Changes the foreground color of text that will be output from this point 229e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// forward. 230a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek /// @param Color ANSI color to use, the special SAVEDCOLOR can be used to 231e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// change only the bold attribute, and keep colors untouched 232a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek /// @param Bold bold/brighter text, default false 233a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek /// @param BG if true change the background, default: change foreground 234e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// @returns itself so it can be used within << invocations 235a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek virtual raw_ostream &changeColor(enum Colors Color, 236a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek bool Bold = false, 237a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek bool BG = false) { 238db9ba339b118d89f082c3f7b415ec86405d0258eAlexander Potapenko (void)Color; 239db9ba339b118d89f082c3f7b415ec86405d0258eAlexander Potapenko (void)Bold; 240db9ba339b118d89f082c3f7b415ec86405d0258eAlexander Potapenko (void)BG; 241a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek return *this; 242a2ea78f1320c08018e28f82f8fb543fa7b4bb52dTed Kremenek } 243e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 244e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// Resets the colors to terminal defaults. Call this when you are done 245e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin /// outputting colored text, or before program exit. 246e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin virtual raw_ostream &resetColor() { return *this; } 247e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 248f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Reverses the foreground and background colors. 249246de858e37a989a9cdf9b80d7434453b2c52e70Benjamin Kramer virtual raw_ostream &reverseColor() { return *this; } 250246de858e37a989a9cdf9b80d7434453b2c52e70Benjamin Kramer 251ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman /// This function determines if this stream is connected to a "tty" or 252ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman /// "console" window. That is, the output would be displayed to the user 253ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman /// rather than being put on a pipe or stored in a file. 254ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman virtual bool is_displayed() const { return false; } 255ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman 256d79637b940dfbcdc0b7c702d9655491ecca9d93dDaniel Dunbar /// This function determines if this stream is displayed and supports colors. 257d79637b940dfbcdc0b7c702d9655491ecca9d93dDaniel Dunbar virtual bool has_colors() const { return is_displayed(); } 258d79637b940dfbcdc0b7c702d9655491ecca9d93dDaniel Dunbar 25960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 26060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // Subclass Interface 26160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner //===--------------------------------------------------------------------===// 26260d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 263cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate: 2640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// The is the piece of the class that is implemented by subclasses. This 2650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// writes the \p Size bytes starting at 2662d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \p Ptr to the underlying stream. 267085b9c034fb97120cffbf0c235c5f372f2c938b8Eric Christopher /// 268906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// This function is guaranteed to only be called at a point at which it is 269906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// safe for the subclass to install a new buffer via SetBuffer. 270906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 2712d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Ptr The start of the data to be written. For buffered streams this 272906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// is guaranteed to be the start of the buffer. 2732d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// 2742d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param Size The number of bytes to be written. 275906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar /// 27689a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar /// \invariant { Size > 0 } 277ad60f660c6fd1999a3e21823128d37aca62e9285Dan Gohman virtual void write_impl(const char *Ptr, size_t Size) = 0; 278fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 27960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner // An out of line virtual method to provide a home for the class vtable. 28060d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner virtual void handle(); 281cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar 2820c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return the current position within the stream, not counting the bytes 2830c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// currently in the buffer. 284cd0129f5a6f0485ecac525c17a3c5dff0a19ca5fChris Lattner virtual uint64_t current_pos() const = 0; 2858f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 286e87b2abe91fc44bb9875188d80e3a43a9dfc41ebDan Gohmanprotected: 2870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Use the provided buffer as the raw_ostream buffer. This is intended for 2880c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// use only by subclasses which can arrange for the output to go directly 2890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// into the desired output buffer, instead of being copied on each flush. 290906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar void SetBuffer(char *BufferStart, size_t Size) { 291906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar SetBufferAndMode(BufferStart, Size, ExternalBuffer); 292906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar } 293906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar 2940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return an efficient buffer size for the underlying output mechanism. 295cd0129f5a6f0485ecac525c17a3c5dff0a19ca5fChris Lattner virtual size_t preferred_buffer_size() const; 296208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman 2970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return the beginning of the current stream buffer, or 0 if the stream is 2980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// unbuffered. 299ab810275448c34c072c47be1f16ae1d679bfd20cDaniel Dunbar const char *getBufferStart() const { return OutBufStart; } 300fd29440c07f195d7c059efeb50fe0c5905d88b3bDavid Greene 301cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar //===--------------------------------------------------------------------===// 302cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar // Private Interface 303cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar //===--------------------------------------------------------------------===// 304cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbarprivate: 3050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Install the given buffer and mode. 306906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar void SetBufferAndMode(char *BufferStart, size_t Size, BufferKind Mode); 307906d5b4455c6d605ab62f26d45cad2e49bf948bbDaniel Dunbar 3080c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Flush the current buffer, which is known to be non-empty. This outputs the 3090c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// currently buffered data and resets the buffer to empty. 310cf2a2c6a26427733f31dd539c6ee6486ea191da2Daniel Dunbar void flush_nonempty(); 31133e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman 3120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Copy data into the buffer. Size must not be greater than the number of 3130c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// unused bytes in the buffer. 31433e49ef5e5dc2d3e65bcd4fc1f20874bf3847829Dan Gohman void copy_to_buffer(const char *Ptr, size_t Size); 31560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner}; 316fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// An abstract base class for streams implementations that also support a 318f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// pwrite operation. This is useful for code that can mostly stream out data, 3190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// but needs to patch in a header that needs to know the output size. 3200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass raw_pwrite_stream : public raw_ostream { 3216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar virtual void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) = 0; 3226948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarpublic: 3240c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit raw_pwrite_stream(bool Unbuffered = false) 3250c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar : raw_ostream(Unbuffered) {} 3266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void pwrite(const char *Ptr, size_t Size, uint64_t Offset) { 3276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#ifndef NDBEBUG 3286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint64_t Pos = tell(); 3296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // /dev/null always reports a pos of 0, so we cannot perform this check 3306948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // in that case. 3316948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (Pos) 3326948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(Size + Offset <= Pos && "We don't support extending the stream"); 3336948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#endif 3346948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar pwrite_impl(Ptr, Size, Offset); 3356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 3360c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}; 3370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 338097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 339097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner// File Output Streams 340097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 341fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3420c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// A raw_ostream that writes to a file descriptor. 34360d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner/// 3440c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass raw_fd_ostream : public raw_pwrite_stream { 34560d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner int FD; 34660d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner bool ShouldClose; 3478df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman 3488df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman /// Error This flag is true if an error of any kind has been detected. 3498df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman /// 3508df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman bool Error; 3518df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman 352d75ba1c3573d3d5146d0abe8cb376dca94be94d5Ted Kremenek uint64_t pos; 35389a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 3540c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar bool SupportsSeeking; 3550c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 3560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// See raw_ostream::write_impl. 35736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void write_impl(const char *Ptr, size_t Size) override; 3588f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) override; 3606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 3610c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return the current position within the stream, not counting the bytes 3620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// currently in the buffer. 36336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t current_pos() const override { return pos; } 3648f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 3650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Determine an efficient buffer size. 36636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines size_t preferred_buffer_size() const override; 367208ec0f32eed8874074bddf97cd04f60a772198dDan Gohman 3680c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Set the flag indicating that an output error has been encountered. 3698df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman void error_detected() { Error = true; } 3708df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman 37160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattnerpublic: 37237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// Open the specified file for writing. If an error occurs, information 37337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// about the error is put into EC, and the stream should be immediately 37437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// destroyed; 37537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// \p Flags allows optional flags to control how the file will be opened. 3760d9eb9b4917340acbfc831890655b8e9724959f6Daniel Dunbar /// 3772499990699899e6da865c919fe63ef6e6c6f4a00Dan Gohman /// As a special case, if Filename is "-", then the stream will use 3782499990699899e6da865c919fe63ef6e6c6f4a00Dan Gohman /// STDOUT_FILENO instead of opening a file. Note that it will still consider 3792499990699899e6da865c919fe63ef6e6c6f4a00Dan Gohman /// itself to own the file descriptor. In particular, it will close the 3802499990699899e6da865c919fe63ef6e6c6f4a00Dan Gohman /// file descriptor when it is done (this is necessary to detect 3812499990699899e6da865c919fe63ef6e6c6f4a00Dan Gohman /// output errors). 38237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines raw_fd_ostream(StringRef Filename, std::error_code &EC, 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines sys::fs::OpenFlags Flags); 384fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3850c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// FD is the file descriptor that this writes to. If ShouldClose is true, 3860c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// this closes the file when the stream is destroyed. 387a872a0f5f800b352ab9af9d0f1e975ea0dead4efFrancois Pichet raw_fd_ostream(int fd, bool shouldClose, bool unbuffered=false); 388085b9c034fb97120cffbf0c235c5f372f2c938b8Eric Christopher 3890c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ~raw_fd_ostream() override; 390fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3910c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Manually flush the stream and close the file. Note that this does not call 3920c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// fsync. 3935984680c1fe7ad98381154c26f9c009e4c91b08cTed Kremenek void close(); 394fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 3950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar bool supportsSeeking() { return SupportsSeeking; } 3960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 3970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Flushes the stream and repositions the underlying file descriptor position 3980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// to the offset specified from the beginning of the file. 3999c27886dd5d504f2b03c6fcb57aba23e5e44c4faTed Kremenek uint64_t seek(uint64_t off); 400e8ebb0fe1bba0fdff7475d98e1f8a04804b0b056Torok Edwin 40136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &changeColor(enum Colors colors, bool bold=false, 40236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool bg=false) override; 40336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &resetColor() override; 404ec080467f5b322441055de1f6cd4f08edc23d7dfDan Gohman 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &reverseColor() override; 406246de858e37a989a9cdf9b80d7434453b2c52e70Benjamin Kramer 40736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool is_displayed() const override; 4088df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman 40936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool has_colors() const override; 410d79637b940dfbcdc0b7c702d9655491ecca9d93dDaniel Dunbar 4110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return the value of the flag in this raw_fd_ostream indicating whether an 4120c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// output error has been encountered. 41327f7aad50b93f02e81f7875dba09a5a1020431e6Dan Gohman /// This doesn't implicitly flush any pending output. Also, it doesn't 414c8e41c591741b3da1077f7000274ad040bef8002Sylvestre Ledru /// guarantee to detect all errors unless the stream has been closed. 4158df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman bool has_error() const { 4168df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman return Error; 4178df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman } 4188df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman 4190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Set the flag read by has_error() to false. If the error flag is set at the 4200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// time when this raw_ostream's destructor is called, report_fatal_error is 4210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// called to report the error. Use clear_error() after handling the error to 4220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// avoid this behavior. 42300d1cdeca9d718d2eb51859800cf66a9d5e386caDan Gohman /// 42400d1cdeca9d718d2eb51859800cf66a9d5e386caDan Gohman /// "Errors should never pass silently. 42500d1cdeca9d718d2eb51859800cf66a9d5e386caDan Gohman /// Unless explicitly silenced." 42600d1cdeca9d718d2eb51859800cf66a9d5e386caDan Gohman /// - from The Zen of Python, by Tim Peters 42700d1cdeca9d718d2eb51859800cf66a9d5e386caDan Gohman /// 4288df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman void clear_error() { 4298df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman Error = false; 4308df0e010469db2db5c641a50d9cfa74a5ffe68eaDan Gohman } 43160d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner}; 432fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 4330c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// This returns a reference to a raw_ostream for standard output. Use it like: 4340c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// outs() << "foo" << "bar"; 43507f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &outs(); 43607f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattner 4370c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// This returns a reference to a raw_ostream for standard error. Use it like: 4380c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// errs() << "foo" << "bar"; 43907f51f788e1dff2982ff0aae7c2ea3d00e48cc61Chris Lattnerraw_ostream &errs(); 440fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 4410c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// This returns a reference to a raw_ostream which simply discards output. 44234ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarraw_ostream &nulls(); 443fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 444097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 44578a2812538d871a62d90f53ed66d26198876d011Chris Lattner// Output Stream Adaptors 446097af7fc8f8688cc21453a5561347f14ca7c5771Chris Lattner//===----------------------------------------------------------------------===// 447fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 4480c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// A raw_ostream that writes to an std::string. This is a simple adaptor 4490c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// class. This class does not encounter output errors. 45078a2812538d871a62d90f53ed66d26198876d011Chris Lattnerclass raw_string_ostream : public raw_ostream { 45178a2812538d871a62d90f53ed66d26198876d011Chris Lattner std::string &OS; 45289a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 4530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// See raw_ostream::write_impl. 45436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void write_impl(const char *Ptr, size_t Size) override; 4558f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 4560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return the current position within the stream, not counting the bytes 4570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// currently in the buffer. 45836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t current_pos() const override { return OS.size(); } 459f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 46078a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic: 46135979c021e4789b915cd569145bd9fb9ae0d8d8bDaniel Dunbar explicit raw_string_ostream(std::string &O) : OS(O) {} 4620c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ~raw_string_ostream() override; 463fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 4640c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Flushes the stream contents to the target string and returns the string's 4650c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// reference. 4663d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek std::string& str() { 4673d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek flush(); 4683d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek return OS; 4693d4866e68338c5c5d7b9a3130a3db5b12658776cTed Kremenek } 47078a2812538d871a62d90f53ed66d26198876d011Chris Lattner}; 471fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 4720c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// A raw_ostream that writes to an SmallVector or SmallString. This is a 4730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// simple adaptor class. This class does not encounter output errors. 474f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// raw_svector_ostream operates without a buffer, delegating all memory 475f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// management to the SmallString. Thus the SmallString is always up-to-date, 476f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar/// may be used directly and there is no need to call flush(). 4770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass raw_svector_ostream : public raw_pwrite_stream { 47878a2812538d871a62d90f53ed66d26198876d011Chris Lattner SmallVectorImpl<char> &OS; 47989a66a96fed75796bc5e079217130b62105cb438Daniel Dunbar 4800c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// See raw_ostream::write_impl. 48136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void write_impl(const char *Ptr, size_t Size) override; 4828f7be4731e979255c54eb8951b7a06ed4fd6ce45Douglas Gregor 4836948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) override; 4846948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 485f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Return the current position within the stream. 48636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t current_pos() const override; 4870c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 48878a2812538d871a62d90f53ed66d26198876d011Chris Lattnerpublic: 489425d08c654c7893782b1215f9b2715bc1d90bd07Daniel Dunbar /// Construct a new raw_svector_ostream. 490425d08c654c7893782b1215f9b2715bc1d90bd07Daniel Dunbar /// 4912d9eb72178af8e79dc6432cd1b7d29bde16da1b9Dmitri Gribenko /// \param O The vector to write to; this should generally have at least 128 492d14787e49777888eb7c685c0d5803044e7b7971aDaniel Dunbar /// bytes free to avoid any extraneous memory overhead. 493f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar explicit raw_svector_ostream(SmallVectorImpl<char> &O) : OS(O) { 494f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar SetUnbuffered(); 495f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 496f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ~raw_svector_ostream() override {} 4970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 498f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar void flush() = delete; 4996bb156a6817aa9c9e02e5212db12d70e28faefc2Mikhail Glushenkov 500f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// Return a StringRef for the vector contents. 501f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar StringRef str() { return StringRef(OS.data(), OS.size()); } 50278a2812538d871a62d90f53ed66d26198876d011Chris Lattner}; 503fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman 5040c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar/// A raw_ostream that discards all output. 5050c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass raw_null_ostream : public raw_pwrite_stream { 5060c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// See raw_ostream::write_impl. 50736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void write_impl(const char *Ptr, size_t size) override; 5086948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void pwrite_impl(const char *Ptr, size_t Size, uint64_t Offset) override; 509085b9c034fb97120cffbf0c235c5f372f2c938b8Eric Christopher 5100c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// Return the current position within the stream, not counting the bytes 5110c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar /// currently in the buffer. 51236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t current_pos() const override; 51334ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar 51434ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbarpublic: 51534ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar explicit raw_null_ostream() {} 5160c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ~raw_null_ostream() override; 5170c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar}; 5180c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 5190c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarclass buffer_ostream : public raw_svector_ostream { 5200c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar raw_ostream &OS; 5210c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar SmallVector<char, 0> Buffer; 5220c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 5230c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarpublic: 524f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar buffer_ostream(raw_ostream &OS) : raw_svector_ostream(Buffer), OS(OS) {} 525f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ~buffer_ostream() override { OS << str(); } 52634ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar}; 52734ccf037fea3d83dcb18f72496775ec4c7dcd3d3Daniel Dunbar 52860d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner} // end llvm namespace 52960d396262460f0613175e52c00be5e8bfb89d8fbChris Lattner 530f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#endif // LLVM_SUPPORT_RAW_OSTREAM_H 531