mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
771 lines
26 KiB
Diff
771 lines
26 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: PJ Reiniger <pj.reiniger@gmail.com>
|
|
Date: Sun, 8 May 2022 13:43:50 -0400
|
|
Subject: [PATCH 10/31] Remove unused functions
|
|
|
|
---
|
|
llvm/include/llvm/ADT/SmallString.h | 85 +-----
|
|
llvm/include/llvm/Support/Errno.h | 9 -
|
|
llvm/include/llvm/Support/VersionTuple.h | 39 ---
|
|
llvm/include/llvm/Support/raw_ostream.h | 127 +--------
|
|
llvm/lib/Support/raw_ostream.cpp | 329 -----------------------
|
|
5 files changed, 10 insertions(+), 579 deletions(-)
|
|
|
|
diff --git a/llvm/include/llvm/ADT/SmallString.h b/llvm/include/llvm/ADT/SmallString.h
|
|
index 4d673cc8b1c49cf8a3f19653de53881cd12662ee..bfa965fd68a09d7ca3b332e38585ae37a5982ed0 100644
|
|
--- a/llvm/include/llvm/ADT/SmallString.h
|
|
+++ b/llvm/include/llvm/ADT/SmallString.h
|
|
@@ -88,49 +88,12 @@ public:
|
|
/// @name String Comparison
|
|
/// @{
|
|
|
|
- /// Check for string equality. This is more efficient than compare() when
|
|
- /// the relative ordering of inequal strings isn't needed.
|
|
- bool equals(std::string_view RHS) const {
|
|
- return str().equals(RHS);
|
|
- }
|
|
-
|
|
- /// Check for string equality, ignoring case.
|
|
- bool equals_insensitive(std::string_view RHS) const {
|
|
- return str().equals_insensitive(RHS);
|
|
- }
|
|
-
|
|
- /// compare - Compare two strings; the result is negative, zero, or positive
|
|
- /// if this string is lexicographically less than, equal to, or greater than
|
|
- /// the \p RHS.
|
|
+ /// Compare two strings; the result is -1, 0, or 1 if this string is
|
|
+ /// lexicographically less than, equal to, or greater than the \p RHS.
|
|
int compare(std::string_view RHS) const {
|
|
return str().compare(RHS);
|
|
}
|
|
|
|
- /// compare_insensitive - Compare two strings, ignoring case.
|
|
- int compare_insensitive(std::string_view RHS) const {
|
|
- return str().compare_insensitive(RHS);
|
|
- }
|
|
-
|
|
- /// compare_numeric - Compare two strings, treating sequences of digits as
|
|
- /// numbers.
|
|
- int compare_numeric(std::string_view RHS) const {
|
|
- return str().compare_numeric(RHS);
|
|
- }
|
|
-
|
|
- /// @}
|
|
- /// @name String Predicates
|
|
- /// @{
|
|
-
|
|
- /// startswith - Check if this string starts with the given \p Prefix.
|
|
- bool startswith(std::string_view Prefix) const {
|
|
- return str().startswith(Prefix);
|
|
- }
|
|
-
|
|
- /// endswith - Check if this string ends with the given \p Suffix.
|
|
- bool endswith(std::string_view Suffix) const {
|
|
- return str().endswith(Suffix);
|
|
- }
|
|
-
|
|
/// @}
|
|
/// @name String Searching
|
|
/// @{
|
|
@@ -211,50 +174,6 @@ public:
|
|
}
|
|
|
|
/// @}
|
|
- /// @name Helpful Algorithms
|
|
- /// @{
|
|
-
|
|
- /// Return the number of occurrences of \p C in the string.
|
|
- size_t count(char C) const {
|
|
- return str().count(C);
|
|
- }
|
|
-
|
|
- /// Return the number of non-overlapped occurrences of \p Str in the
|
|
- /// string.
|
|
- size_t count(std::string_view Str) const {
|
|
- return str().count(Str);
|
|
- }
|
|
-
|
|
- /// @}
|
|
- /// @name Substring Operations
|
|
- /// @{
|
|
-
|
|
- /// Return a reference to the substring from [Start, Start + N).
|
|
- ///
|
|
- /// \param Start The index of the starting character in the substring; if
|
|
- /// the index is npos or greater than the length of the string then the
|
|
- /// empty substring will be returned.
|
|
- ///
|
|
- /// \param N The number of characters to included in the substring. If \p N
|
|
- /// exceeds the number of characters remaining in the string, the string
|
|
- /// suffix (starting with \p Start) will be returned.
|
|
- std::string_view substr(size_t Start, size_t N = std::string_view::npos) const {
|
|
- return str().substr(Start, N);
|
|
- }
|
|
-
|
|
- /// Return a reference to the substring from [Start, End).
|
|
- ///
|
|
- /// \param Start The index of the starting character in the substring; if
|
|
- /// the index is npos or greater than the length of the string then the
|
|
- /// empty substring will be returned.
|
|
- ///
|
|
- /// \param End The index following the last character to include in the
|
|
- /// substring. If this is npos, or less than \p Start, or exceeds the
|
|
- /// number of characters remaining in the string, the string suffix
|
|
- /// (starting with \p Start) will be returned.
|
|
- std::string_view slice(size_t Start, size_t End) const {
|
|
- return str().slice(Start, End);
|
|
- }
|
|
|
|
// Extra methods.
|
|
|
|
diff --git a/llvm/include/llvm/Support/Errno.h b/llvm/include/llvm/Support/Errno.h
|
|
index e095c66b90860001d90b5c2eb74f6032de6de454..787805dac6c5e3c8cb85dabeb80254443d60806c 100644
|
|
--- a/llvm/include/llvm/Support/Errno.h
|
|
+++ b/llvm/include/llvm/Support/Errno.h
|
|
@@ -19,15 +19,6 @@
|
|
namespace llvm {
|
|
namespace sys {
|
|
|
|
-/// Returns a string representation of the errno value, using whatever
|
|
-/// thread-safe variant of strerror() is available. Be sure to call this
|
|
-/// immediately after the function that set errno, or errno may have been
|
|
-/// overwritten by an intervening call.
|
|
-std::string StrError();
|
|
-
|
|
-/// Like the no-argument version above, but uses \p errnum instead of errno.
|
|
-std::string StrError(int errnum);
|
|
-
|
|
template <typename FailT, typename Fun, typename... Args>
|
|
inline decltype(auto) RetryAfterSignal(const FailT &Fail, const Fun &F,
|
|
const Args &... As) {
|
|
diff --git a/llvm/include/llvm/Support/VersionTuple.h b/llvm/include/llvm/Support/VersionTuple.h
|
|
index 953b40701dc934c1a356b5413c9c6c692d5f5679..30cf717973fb15ff65a47a2d80795c351b0d2768 100644
|
|
--- a/llvm/include/llvm/Support/VersionTuple.h
|
|
+++ b/llvm/include/llvm/Support/VersionTuple.h
|
|
@@ -168,45 +168,6 @@ public:
|
|
friend bool operator>=(const VersionTuple &X, const VersionTuple &Y) {
|
|
return !(X < Y);
|
|
}
|
|
-
|
|
- friend hash_code hash_value(const VersionTuple &VT) {
|
|
- return hash_combine(VT.Major, VT.Minor, VT.Subminor, VT.Build);
|
|
- }
|
|
-
|
|
- template <typename HasherT, llvm::support::endianness Endianness>
|
|
- friend void addHash(HashBuilderImpl<HasherT, Endianness> &HBuilder,
|
|
- const VersionTuple &VT) {
|
|
- HBuilder.add(VT.Major, VT.Minor, VT.Subminor, VT.Build);
|
|
- }
|
|
-
|
|
- /// Retrieve a string representation of the version number.
|
|
- std::string getAsString() const;
|
|
-};
|
|
-
|
|
-/// Print a version number.
|
|
-raw_ostream &operator<<(raw_ostream &Out, const VersionTuple &V);
|
|
-
|
|
-// Provide DenseMapInfo for version tuples.
|
|
-template <> struct DenseMapInfo<VersionTuple> {
|
|
- static inline VersionTuple getEmptyKey() { return VersionTuple(0x7FFFFFFF); }
|
|
- static inline VersionTuple getTombstoneKey() {
|
|
- return VersionTuple(0x7FFFFFFE);
|
|
- }
|
|
- static unsigned getHashValue(const VersionTuple &Value) {
|
|
- unsigned Result = Value.getMajor();
|
|
- if (auto Minor = Value.getMinor())
|
|
- Result = detail::combineHashValue(Result, *Minor);
|
|
- if (auto Subminor = Value.getSubminor())
|
|
- Result = detail::combineHashValue(Result, *Subminor);
|
|
- if (auto Build = Value.getBuild())
|
|
- Result = detail::combineHashValue(Result, *Build);
|
|
-
|
|
- return Result;
|
|
- }
|
|
-
|
|
- static bool isEqual(const VersionTuple &LHS, const VersionTuple &RHS) {
|
|
- return LHS == RHS;
|
|
- }
|
|
};
|
|
|
|
} // end namespace llvm
|
|
diff --git a/llvm/include/llvm/Support/raw_ostream.h b/llvm/include/llvm/Support/raw_ostream.h
|
|
index 0bf165c55921d7e09208a8fa8df7f9f5ad68d1e2..429d1dca24942d16e5c3a551035c0d459e7c5c00 100644
|
|
--- a/llvm/include/llvm/Support/raw_ostream.h
|
|
+++ b/llvm/include/llvm/Support/raw_ostream.h
|
|
@@ -261,32 +261,6 @@ public:
|
|
return write(Str.data(), Str.size());
|
|
}
|
|
|
|
- raw_ostream &operator<<(unsigned long N);
|
|
- raw_ostream &operator<<(long N);
|
|
- raw_ostream &operator<<(unsigned long long N);
|
|
- raw_ostream &operator<<(long long N);
|
|
- raw_ostream &operator<<(const void *P);
|
|
-
|
|
- raw_ostream &operator<<(unsigned int N) {
|
|
- return this->operator<<(static_cast<unsigned long>(N));
|
|
- }
|
|
-
|
|
- raw_ostream &operator<<(int N) {
|
|
- return this->operator<<(static_cast<long>(N));
|
|
- }
|
|
-
|
|
- raw_ostream &operator<<(double N);
|
|
-
|
|
- /// Output \p N in hexadecimal, without any prefix or padding.
|
|
- raw_ostream &write_hex(unsigned long long N);
|
|
-
|
|
- // Change the foreground color of text.
|
|
- raw_ostream &operator<<(Colors C);
|
|
-
|
|
- /// Output a formatted UUID with dash separators.
|
|
- using uuid_t = uint8_t[16];
|
|
- raw_ostream &write_uuid(const uuid_t UUID);
|
|
-
|
|
/// Output \p Str, turning '\\', '\t', '\n', '"', and anything that doesn't
|
|
/// satisfy llvm::isPrint into an escape sequence.
|
|
raw_ostream &write_escaped(std::string_view Str, bool UseHexEscapes = false);
|
|
@@ -294,21 +268,6 @@ public:
|
|
raw_ostream &write(unsigned char C);
|
|
raw_ostream &write(const char *Ptr, size_t Size);
|
|
|
|
- // Formatted output, see the format() function in Support/Format.h.
|
|
- raw_ostream &operator<<(const format_object_base &Fmt);
|
|
-
|
|
- // Formatted output, see the leftJustify() function in Support/Format.h.
|
|
- raw_ostream &operator<<(const FormattedString &);
|
|
-
|
|
- // Formatted output, see the formatHex() function in Support/Format.h.
|
|
- raw_ostream &operator<<(const FormattedNumber &);
|
|
-
|
|
- // Formatted output, see the formatv() function in Support/FormatVariadic.h.
|
|
- raw_ostream &operator<<(const formatv_object_base &);
|
|
-
|
|
- // Formatted output, see the format_bytes() function in Support/Format.h.
|
|
- raw_ostream &operator<<(const FormattedBytes &);
|
|
-
|
|
/// indent - Insert 'NumSpaces' spaces.
|
|
raw_ostream &indent(unsigned NumSpaces);
|
|
|
|
@@ -323,14 +282,19 @@ public:
|
|
/// @param BG if true change the background, default: change foreground
|
|
/// @returns itself so it can be used within << invocations
|
|
virtual raw_ostream &changeColor(enum Colors Color, bool Bold = false,
|
|
- bool BG = false);
|
|
+ bool BG = false) {
|
|
+ (void)Color;
|
|
+ (void)Bold;
|
|
+ (void)BG;
|
|
+ return *this;
|
|
+ }
|
|
|
|
/// Resets the colors to terminal defaults. Call this when you are done
|
|
/// outputting colored text, or before program exit.
|
|
- virtual raw_ostream &resetColor();
|
|
+ virtual raw_ostream &resetColor() { return *this; }
|
|
|
|
/// Reverses the foreground and background colors.
|
|
- virtual raw_ostream &reverseColor();
|
|
+ virtual raw_ostream &reverseColor() { return *this; }
|
|
|
|
/// This function determines if this stream is connected to a "tty" or
|
|
/// "console" window. That is, the output would be displayed to the user
|
|
@@ -405,10 +369,6 @@ private:
|
|
/// unused bytes in the buffer.
|
|
void copy_to_buffer(const char *Ptr, size_t Size);
|
|
|
|
- /// Compute whether colors should be used and do the necessary work such as
|
|
- /// flushing. The result is affected by calls to enable_color().
|
|
- bool prepare_colors();
|
|
-
|
|
/// Flush the tied-to stream (if present) and then write the required data.
|
|
void flush_tied_then_write(const char *Ptr, size_t Size);
|
|
|
|
@@ -460,7 +420,6 @@ class raw_fd_ostream : public raw_pwrite_stream {
|
|
bool ShouldClose;
|
|
bool SupportsSeeking = false;
|
|
bool IsRegularFile = false;
|
|
- mutable std::optional<bool> HasColors;
|
|
|
|
#ifdef _WIN32
|
|
/// True if this fd refers to a Windows console device. Mintty and other
|
|
@@ -536,10 +495,6 @@ public:
|
|
/// to the offset specified from the beginning of the file.
|
|
uint64_t seek(uint64_t off);
|
|
|
|
- bool is_displayed() const override;
|
|
-
|
|
- bool has_colors() const override;
|
|
-
|
|
std::error_code error() const { return EC; }
|
|
|
|
/// Return the value of the flag in this raw_fd_ostream indicating whether an
|
|
@@ -558,38 +513,6 @@ public:
|
|
/// - from The Zen of Python, by Tim Peters
|
|
///
|
|
void clear_error() { EC = std::error_code(); }
|
|
-
|
|
- /// Locks the underlying file.
|
|
- ///
|
|
- /// @returns RAII object that releases the lock upon leaving the scope, if the
|
|
- /// locking was successful. Otherwise returns corresponding
|
|
- /// error code.
|
|
- ///
|
|
- /// The function blocks the current thread until the lock become available or
|
|
- /// error occurs.
|
|
- ///
|
|
- /// Possible use of this function may be as follows:
|
|
- ///
|
|
- /// @code{.cpp}
|
|
- /// if (auto L = stream.lock()) {
|
|
- /// // ... do action that require file to be locked.
|
|
- /// } else {
|
|
- /// handleAllErrors(std::move(L.takeError()), [&](ErrorInfoBase &EIB) {
|
|
- /// // ... handle lock error.
|
|
- /// });
|
|
- /// }
|
|
- /// @endcode
|
|
- [[nodiscard]] Expected<sys::fs::FileLocker> lock();
|
|
-
|
|
- /// Tries to lock the underlying file within the specified period.
|
|
- ///
|
|
- /// @returns RAII object that releases the lock upon leaving the scope, if the
|
|
- /// locking was successful. Otherwise returns corresponding
|
|
- /// error code.
|
|
- ///
|
|
- /// It is used as @ref lock.
|
|
- [[nodiscard]] Expected<sys::fs::FileLocker>
|
|
- tryLockFor(Duration const &Timeout);
|
|
};
|
|
|
|
/// This returns a reference to a raw_fd_ostream for standard output. Use it
|
|
@@ -619,17 +542,6 @@ public:
|
|
/// immediately destroyed.
|
|
raw_fd_stream(std::string_view Filename, std::error_code &EC);
|
|
|
|
- /// This reads the \p Size bytes into a buffer pointed by \p Ptr.
|
|
- ///
|
|
- /// \param Ptr The start of the buffer to hold data to be read.
|
|
- ///
|
|
- /// \param Size The number of bytes to be read.
|
|
- ///
|
|
- /// On success, the number of bytes read is returned, and the file position is
|
|
- /// advanced by this number. On error, -1 is returned, use error() to get the
|
|
- /// error code.
|
|
- ssize_t read(char *Ptr, size_t Size);
|
|
-
|
|
/// Check if \p OS is a pointer of type raw_fd_stream*.
|
|
static bool classof(const raw_ostream *OS);
|
|
};
|
|
@@ -747,29 +659,6 @@ public:
|
|
~buffer_unique_ostream() override { *OS << str(); }
|
|
};
|
|
|
|
-class Error;
|
|
-
|
|
-/// This helper creates an output stream and then passes it to \p Write.
|
|
-/// The stream created is based on the specified \p OutputFileName:
|
|
-/// llvm::outs for "-", raw_null_ostream for "/dev/null", and raw_fd_ostream
|
|
-/// for other names. For raw_fd_ostream instances, the stream writes to
|
|
-/// a temporary file. The final output file is atomically replaced with the
|
|
-/// temporary file after the \p Write function is finished.
|
|
-Error writeToOutput(std::string_view OutputFileName,
|
|
- std::function<Error(raw_ostream &)> Write);
|
|
-
|
|
-raw_ostream &operator<<(raw_ostream &OS, std::nullopt_t);
|
|
-
|
|
-template <typename T, typename = decltype(std::declval<raw_ostream &>()
|
|
- << std::declval<const T &>())>
|
|
-raw_ostream &operator<<(raw_ostream &OS, const std::optional<T> &O) {
|
|
- if (O)
|
|
- OS << *O;
|
|
- else
|
|
- OS << std::nullopt;
|
|
- return OS;
|
|
-}
|
|
-
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_SUPPORT_RAW_OSTREAM_H
|
|
diff --git a/llvm/lib/Support/raw_ostream.cpp b/llvm/lib/Support/raw_ostream.cpp
|
|
index a2778407119ccd73031b22a5a091e21923905aa9..76c32155b4296fbbf3f4b164cd58d63f472ccd5e 100644
|
|
--- a/llvm/lib/Support/raw_ostream.cpp
|
|
+++ b/llvm/lib/Support/raw_ostream.cpp
|
|
@@ -18,7 +18,6 @@
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/Config/config.h"
|
|
#include "llvm/Support/Compiler.h"
|
|
-#include "llvm/Support/Duration.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
#include "llvm/Support/FileSystem.h"
|
|
#include "llvm/Support/Format.h"
|
|
@@ -127,49 +126,6 @@ void raw_ostream::SetBufferAndMode(char *BufferStart, size_t Size,
|
|
assert(OutBufStart <= OutBufEnd && "Invalid size!");
|
|
}
|
|
|
|
-raw_ostream &raw_ostream::operator<<(unsigned long N) {
|
|
- write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(long N) {
|
|
- write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(unsigned long long N) {
|
|
- write_integer(*this, static_cast<uint64_t>(N), 0, IntegerStyle::Integer);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(long long N) {
|
|
- write_integer(*this, static_cast<int64_t>(N), 0, IntegerStyle::Integer);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::write_hex(unsigned long long N) {
|
|
- llvm::write_hex(*this, N, HexPrintStyle::Lower);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(Colors C) {
|
|
- if (C == Colors::RESET)
|
|
- resetColor();
|
|
- else
|
|
- changeColor(C);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::write_uuid(const uuid_t UUID) {
|
|
- for (int Idx = 0; Idx < 16; ++Idx) {
|
|
- *this << format("%02" PRIX32, UUID[Idx]);
|
|
- if (Idx == 3 || Idx == 5 || Idx == 7 || Idx == 9)
|
|
- *this << "-";
|
|
- }
|
|
- return *this;
|
|
-}
|
|
-
|
|
-
|
|
raw_ostream &raw_ostream::write_escaped(std::string_view Str,
|
|
bool UseHexEscapes) {
|
|
for (unsigned char c : Str) {
|
|
@@ -315,173 +271,6 @@ void raw_ostream::flush_tied_then_write(const char *Ptr, size_t Size) {
|
|
write_impl(Ptr, Size);
|
|
}
|
|
|
|
-// Formatted output.
|
|
-raw_ostream &raw_ostream::operator<<(const format_object_base &Fmt) {
|
|
- // If we have more than a few bytes left in our output buffer, try
|
|
- // formatting directly onto its end.
|
|
- size_t NextBufferSize = 127;
|
|
- size_t BufferBytesLeft = OutBufEnd - OutBufCur;
|
|
- if (BufferBytesLeft > 3) {
|
|
- size_t BytesUsed = Fmt.print(OutBufCur, BufferBytesLeft);
|
|
-
|
|
- // Common case is that we have plenty of space.
|
|
- if (BytesUsed <= BufferBytesLeft) {
|
|
- OutBufCur += BytesUsed;
|
|
- return *this;
|
|
- }
|
|
-
|
|
- // Otherwise, we overflowed and the return value tells us the size to try
|
|
- // again with.
|
|
- NextBufferSize = BytesUsed;
|
|
- }
|
|
-
|
|
- // If we got here, we didn't have enough space in the output buffer for the
|
|
- // string. Try printing into a SmallVector that is resized to have enough
|
|
- // space. Iterate until we win.
|
|
- SmallVector<char, 128> V;
|
|
-
|
|
- while (true) {
|
|
- V.resize(NextBufferSize);
|
|
-
|
|
- // Try formatting into the SmallVector.
|
|
- size_t BytesUsed = Fmt.print(V.data(), NextBufferSize);
|
|
-
|
|
- // If BytesUsed fit into the vector, we win.
|
|
- if (BytesUsed <= NextBufferSize)
|
|
- return write(V.data(), BytesUsed);
|
|
-
|
|
- // Otherwise, try again with a new size.
|
|
- assert(BytesUsed > NextBufferSize && "Didn't grow buffer!?");
|
|
- NextBufferSize = BytesUsed;
|
|
- }
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(const formatv_object_base &Obj) {
|
|
- Obj.format(*this);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(const FormattedString &FS) {
|
|
- unsigned LeftIndent = 0;
|
|
- unsigned RightIndent = 0;
|
|
- const ssize_t Difference = FS.Width - FS.Str.size();
|
|
- if (Difference > 0) {
|
|
- switch (FS.Justify) {
|
|
- case FormattedString::JustifyNone:
|
|
- break;
|
|
- case FormattedString::JustifyLeft:
|
|
- RightIndent = Difference;
|
|
- break;
|
|
- case FormattedString::JustifyRight:
|
|
- LeftIndent = Difference;
|
|
- break;
|
|
- case FormattedString::JustifyCenter:
|
|
- LeftIndent = Difference / 2;
|
|
- RightIndent = Difference - LeftIndent;
|
|
- break;
|
|
- }
|
|
- }
|
|
- indent(LeftIndent);
|
|
- (*this) << FS.Str;
|
|
- indent(RightIndent);
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(const FormattedNumber &FN) {
|
|
- if (FN.Hex) {
|
|
- HexPrintStyle Style;
|
|
- if (FN.Upper && FN.HexPrefix)
|
|
- Style = HexPrintStyle::PrefixUpper;
|
|
- else if (FN.Upper && !FN.HexPrefix)
|
|
- Style = HexPrintStyle::Upper;
|
|
- else if (!FN.Upper && FN.HexPrefix)
|
|
- Style = HexPrintStyle::PrefixLower;
|
|
- else
|
|
- Style = HexPrintStyle::Lower;
|
|
- llvm::write_hex(*this, FN.HexValue, Style, FN.Width);
|
|
- } else {
|
|
- llvm::SmallString<16> Buffer;
|
|
- llvm::raw_svector_ostream Stream(Buffer);
|
|
- llvm::write_integer(Stream, FN.DecValue, 0, IntegerStyle::Integer);
|
|
- if (Buffer.size() < FN.Width)
|
|
- indent(FN.Width - Buffer.size());
|
|
- (*this) << Buffer;
|
|
- }
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::operator<<(const FormattedBytes &FB) {
|
|
- if (FB.Bytes.empty())
|
|
- return *this;
|
|
-
|
|
- size_t LineIndex = 0;
|
|
- auto Bytes = FB.Bytes;
|
|
- const size_t Size = Bytes.size();
|
|
- HexPrintStyle HPS = FB.Upper ? HexPrintStyle::Upper : HexPrintStyle::Lower;
|
|
- uint64_t OffsetWidth = 0;
|
|
- if (FB.FirstByteOffset) {
|
|
- // Figure out how many nibbles are needed to print the largest offset
|
|
- // represented by this data set, so that we can align the offset field
|
|
- // to the right width.
|
|
- size_t Lines = Size / FB.NumPerLine;
|
|
- uint64_t MaxOffset = *FB.FirstByteOffset + Lines * FB.NumPerLine;
|
|
- unsigned Power = 0;
|
|
- if (MaxOffset > 0)
|
|
- Power = llvm::Log2_64_Ceil(MaxOffset);
|
|
- OffsetWidth = std::max<uint64_t>(4, llvm::alignTo(Power, 4) / 4);
|
|
- }
|
|
-
|
|
- // The width of a block of data including all spaces for group separators.
|
|
- unsigned NumByteGroups =
|
|
- alignTo(FB.NumPerLine, FB.ByteGroupSize) / FB.ByteGroupSize;
|
|
- unsigned BlockCharWidth = FB.NumPerLine * 2 + NumByteGroups - 1;
|
|
-
|
|
- while (!Bytes.empty()) {
|
|
- indent(FB.IndentLevel);
|
|
-
|
|
- if (FB.FirstByteOffset) {
|
|
- uint64_t Offset = *FB.FirstByteOffset;
|
|
- llvm::write_hex(*this, Offset + LineIndex, HPS, OffsetWidth);
|
|
- *this << ": ";
|
|
- }
|
|
-
|
|
- auto Line = Bytes.take_front(FB.NumPerLine);
|
|
-
|
|
- size_t CharsPrinted = 0;
|
|
- // Print the hex bytes for this line in groups
|
|
- for (size_t I = 0; I < Line.size(); ++I, CharsPrinted += 2) {
|
|
- if (I && (I % FB.ByteGroupSize) == 0) {
|
|
- ++CharsPrinted;
|
|
- *this << " ";
|
|
- }
|
|
- llvm::write_hex(*this, Line[I], HPS, 2);
|
|
- }
|
|
-
|
|
- if (FB.ASCII) {
|
|
- // Print any spaces needed for any bytes that we didn't print on this
|
|
- // line so that the ASCII bytes are correctly aligned.
|
|
- assert(BlockCharWidth >= CharsPrinted);
|
|
- indent(BlockCharWidth - CharsPrinted + 2);
|
|
- *this << "|";
|
|
-
|
|
- // Print the ASCII char values for each byte on this line
|
|
- for (uint8_t Byte : Line) {
|
|
- if (isPrint(Byte))
|
|
- *this << static_cast<char>(Byte);
|
|
- else
|
|
- *this << '.';
|
|
- }
|
|
- *this << '|';
|
|
- }
|
|
-
|
|
- Bytes = Bytes.drop_front(Line.size());
|
|
- LineIndex += Line.size();
|
|
- if (LineIndex < Size)
|
|
- *this << '\n';
|
|
- }
|
|
- return *this;
|
|
-}
|
|
-
|
|
template <char C>
|
|
static raw_ostream &write_padding(raw_ostream &OS, unsigned NumChars) {
|
|
static const char Chars[] = {C, C, C, C, C, C, C, C, C, C, C, C, C, C, C, C,
|
|
@@ -512,63 +301,8 @@ raw_ostream &raw_ostream::write_zeros(unsigned NumZeros) {
|
|
return write_padding<'\0'>(*this, NumZeros);
|
|
}
|
|
|
|
-bool raw_ostream::prepare_colors() {
|
|
- // Colors were explicitly disabled.
|
|
- if (!ColorEnabled)
|
|
- return false;
|
|
-
|
|
- // Colors require changing the terminal but this stream is not going to a
|
|
- // terminal.
|
|
- if (sys::Process::ColorNeedsFlush() && !is_displayed())
|
|
- return false;
|
|
-
|
|
- if (sys::Process::ColorNeedsFlush())
|
|
- flush();
|
|
-
|
|
- return true;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::changeColor(enum Colors colors, bool bold, bool bg) {
|
|
- if (!prepare_colors())
|
|
- return *this;
|
|
-
|
|
- const char *colorcode =
|
|
- (colors == SAVEDCOLOR)
|
|
- ? sys::Process::OutputBold(bg)
|
|
- : sys::Process::OutputColor(static_cast<char>(colors), bold, bg);
|
|
- if (colorcode)
|
|
- write(colorcode, strlen(colorcode));
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::resetColor() {
|
|
- if (!prepare_colors())
|
|
- return *this;
|
|
-
|
|
- if (const char *colorcode = sys::Process::ResetColor())
|
|
- write(colorcode, strlen(colorcode));
|
|
- return *this;
|
|
-}
|
|
-
|
|
-raw_ostream &raw_ostream::reverseColor() {
|
|
- if (!prepare_colors())
|
|
- return *this;
|
|
-
|
|
- if (const char *colorcode = sys::Process::OutputReverse())
|
|
- write(colorcode, strlen(colorcode));
|
|
- return *this;
|
|
-}
|
|
-
|
|
void raw_ostream::anchor() {}
|
|
|
|
-//===----------------------------------------------------------------------===//
|
|
-// Formatted Output
|
|
-//===----------------------------------------------------------------------===//
|
|
-
|
|
-// Out of line virtual method.
|
|
-void format_object_base::home() {
|
|
-}
|
|
-
|
|
//===----------------------------------------------------------------------===//
|
|
// raw_fd_ostream
|
|
//===----------------------------------------------------------------------===//
|
|
@@ -867,31 +601,6 @@ size_t raw_fd_ostream::preferred_buffer_size() const {
|
|
#endif
|
|
}
|
|
|
|
-bool raw_fd_ostream::is_displayed() const {
|
|
- return sys::Process::FileDescriptorIsDisplayed(FD);
|
|
-}
|
|
-
|
|
-bool raw_fd_ostream::has_colors() const {
|
|
- if (!HasColors)
|
|
- HasColors = sys::Process::FileDescriptorHasColors(FD);
|
|
- return *HasColors;
|
|
-}
|
|
-
|
|
-Expected<sys::fs::FileLocker> raw_fd_ostream::lock() {
|
|
- std::error_code EC = sys::fs::lockFile(FD);
|
|
- if (!EC)
|
|
- return sys::fs::FileLocker(FD);
|
|
- return errorCodeToError(EC);
|
|
-}
|
|
-
|
|
-Expected<sys::fs::FileLocker>
|
|
-raw_fd_ostream::tryLockFor(Duration const& Timeout) {
|
|
- std::error_code EC = sys::fs::tryLockFile(FD, Timeout.getDuration());
|
|
- if (!EC)
|
|
- return sys::fs::FileLocker(FD);
|
|
- return errorCodeToError(EC);
|
|
-}
|
|
-
|
|
void raw_fd_ostream::anchor() {}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
@@ -934,16 +643,6 @@ raw_fd_stream::raw_fd_stream(std::string_view Filename, std::error_code &EC)
|
|
EC = std::make_error_code(std::errc::invalid_argument);
|
|
}
|
|
|
|
-ssize_t raw_fd_stream::read(char *Ptr, size_t Size) {
|
|
- assert(get_fd() >= 0 && "File already closed.");
|
|
- ssize_t Ret = ::read(get_fd(), (void *)Ptr, Size);
|
|
- if (Ret >= 0)
|
|
- inc_pos(Ret);
|
|
- else
|
|
- error_detected(std::error_code(errno, std::generic_category()));
|
|
- return Ret;
|
|
-}
|
|
-
|
|
bool raw_fd_stream::classof(const raw_ostream *OS) {
|
|
return OS->get_kind() == OStreamKind::OK_FDStream;
|
|
}
|
|
@@ -999,31 +698,3 @@ void raw_pwrite_stream::anchor() {}
|
|
void buffer_ostream::anchor() {}
|
|
|
|
void buffer_unique_ostream::anchor() {}
|
|
-
|
|
-Error llvm::writeToOutput(std::string_view OutputFileName,
|
|
- std::function<Error(raw_ostream &)> Write) {
|
|
- if (OutputFileName == "-")
|
|
- return Write(outs());
|
|
-
|
|
- if (OutputFileName == "/dev/null") {
|
|
- raw_null_ostream Out;
|
|
- return Write(Out);
|
|
- }
|
|
-
|
|
- unsigned Mode = sys::fs::all_read | sys::fs::all_write | sys::fs::all_exe;
|
|
- Expected<sys::fs::TempFile> Temp =
|
|
- sys::fs::TempFile::create(OutputFileName + ".temp-stream-%%%%%%", Mode);
|
|
- if (!Temp)
|
|
- return createFileError(OutputFileName, Temp.takeError());
|
|
-
|
|
- raw_fd_ostream Out(Temp->FD, false);
|
|
-
|
|
- if (Error E = Write(Out)) {
|
|
- if (Error DiscardError = Temp->discard())
|
|
- return joinErrors(std::move(E), std::move(DiscardError));
|
|
- return E;
|
|
- }
|
|
- Out.flush();
|
|
-
|
|
- return Temp->keep(OutputFileName);
|
|
-}
|