aboutsummaryrefslogtreecommitdiff
path: root/tools/llvm-readobj/StreamWriter.h
diff options
context:
space:
mode:
Diffstat (limited to 'tools/llvm-readobj/StreamWriter.h')
-rw-r--r--tools/llvm-readobj/StreamWriter.h320
1 files changed, 0 insertions, 320 deletions
diff --git a/tools/llvm-readobj/StreamWriter.h b/tools/llvm-readobj/StreamWriter.h
deleted file mode 100644
index d2dbb07af256..000000000000
--- a/tools/llvm-readobj/StreamWriter.h
+++ /dev/null
@@ -1,320 +0,0 @@
-//===-- StreamWriter.h ----------------------------------------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_TOOLS_LLVM_READOBJ_STREAMWRITER_H
-#define LLVM_TOOLS_LLVM_READOBJ_STREAMWRITER_H
-
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/SmallVector.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/DataTypes.h"
-#include "llvm/Support/Endian.h"
-#include "llvm/Support/raw_ostream.h"
-#include <algorithm>
-
-using namespace llvm;
-using namespace llvm::support;
-
-namespace llvm {
-
-template<typename T>
-struct EnumEntry {
- StringRef Name;
- T Value;
-};
-
-struct HexNumber {
- // To avoid sign-extension we have to explicitly cast to the appropriate
- // unsigned type. The overloads are here so that every type that is implicitly
- // convertible to an integer (including enums and endian helpers) can be used
- // without requiring type traits or call-site changes.
- HexNumber(char Value) : Value(static_cast<unsigned char>(Value)) { }
- HexNumber(signed char Value) : Value(static_cast<unsigned char>(Value)) { }
- HexNumber(signed short Value) : Value(static_cast<unsigned short>(Value)) { }
- HexNumber(signed int Value) : Value(static_cast<unsigned int>(Value)) { }
- HexNumber(signed long Value) : Value(static_cast<unsigned long>(Value)) { }
- HexNumber(signed long long Value) : Value(static_cast<unsigned long long>(Value)) { }
- HexNumber(unsigned char Value) : Value(Value) { }
- HexNumber(unsigned short Value) : Value(Value) { }
- HexNumber(unsigned int Value) : Value(Value) { }
- HexNumber(unsigned long Value) : Value(Value) { }
- HexNumber(unsigned long long Value) : Value(Value) { }
- uint64_t Value;
-};
-
-raw_ostream &operator<<(raw_ostream &OS, const HexNumber& Value);
-
-class StreamWriter {
-public:
- StreamWriter(raw_ostream &OS)
- : OS(OS)
- , IndentLevel(0) {
- }
-
- void flush() {
- OS.flush();
- }
-
- void indent(int Levels = 1) {
- IndentLevel += Levels;
- }
-
- void unindent(int Levels = 1) {
- IndentLevel = std::max(0, IndentLevel - Levels);
- }
-
- void printIndent() {
- for (int i = 0; i < IndentLevel; ++i)
- OS << " ";
- }
-
- template<typename T>
- HexNumber hex(T Value) {
- return HexNumber(Value);
- }
-
- template<typename T, typename TEnum>
- void printEnum(StringRef Label, T Value,
- ArrayRef<EnumEntry<TEnum> > EnumValues) {
- StringRef Name;
- bool Found = false;
- for (const auto &EnumItem : EnumValues) {
- if (EnumItem.Value == Value) {
- Name = EnumItem.Name;
- Found = true;
- break;
- }
- }
-
- if (Found) {
- startLine() << Label << ": " << Name << " (" << hex(Value) << ")\n";
- } else {
- startLine() << Label << ": " << hex(Value) << "\n";
- }
- }
-
- template <typename T, typename TFlag>
- void printFlags(StringRef Label, T Value, ArrayRef<EnumEntry<TFlag>> Flags,
- TFlag EnumMask1 = {}, TFlag EnumMask2 = {},
- TFlag EnumMask3 = {}) {
- typedef EnumEntry<TFlag> FlagEntry;
- typedef SmallVector<FlagEntry, 10> FlagVector;
- FlagVector SetFlags;
-
- for (const auto &Flag : Flags) {
- if (Flag.Value == 0)
- continue;
-
- TFlag EnumMask{};
- if (Flag.Value & EnumMask1)
- EnumMask = EnumMask1;
- else if (Flag.Value & EnumMask2)
- EnumMask = EnumMask2;
- else if (Flag.Value & EnumMask3)
- EnumMask = EnumMask3;
- bool IsEnum = (Flag.Value & EnumMask) != 0;
- if ((!IsEnum && (Value & Flag.Value) == Flag.Value) ||
- (IsEnum && (Value & EnumMask) == Flag.Value)) {
- SetFlags.push_back(Flag);
- }
- }
-
- std::sort(SetFlags.begin(), SetFlags.end(), &flagName<TFlag>);
-
- startLine() << Label << " [ (" << hex(Value) << ")\n";
- for (const auto &Flag : SetFlags) {
- startLine() << " " << Flag.Name << " (" << hex(Flag.Value) << ")\n";
- }
- startLine() << "]\n";
- }
-
- template<typename T>
- void printFlags(StringRef Label, T Value) {
- startLine() << Label << " [ (" << hex(Value) << ")\n";
- uint64_t Flag = 1;
- uint64_t Curr = Value;
- while (Curr > 0) {
- if (Curr & 1)
- startLine() << " " << hex(Flag) << "\n";
- Curr >>= 1;
- Flag <<= 1;
- }
- startLine() << "]\n";
- }
-
- void printNumber(StringRef Label, uint64_t Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printNumber(StringRef Label, uint32_t Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printNumber(StringRef Label, uint16_t Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printNumber(StringRef Label, uint8_t Value) {
- startLine() << Label << ": " << unsigned(Value) << "\n";
- }
-
- void printNumber(StringRef Label, int64_t Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printNumber(StringRef Label, int32_t Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printNumber(StringRef Label, int16_t Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printNumber(StringRef Label, int8_t Value) {
- startLine() << Label << ": " << int(Value) << "\n";
- }
-
- void printBoolean(StringRef Label, bool Value) {
- startLine() << Label << ": " << (Value ? "Yes" : "No") << '\n';
- }
-
- template <typename T>
- void printList(StringRef Label, const T &List) {
- startLine() << Label << ": [";
- bool Comma = false;
- for (const auto &Item : List) {
- if (Comma)
- OS << ", ";
- OS << Item;
- Comma = true;
- }
- OS << "]\n";
- }
-
- template <typename T>
- void printHexList(StringRef Label, const T &List) {
- startLine() << Label << ": [";
- bool Comma = false;
- for (const auto &Item : List) {
- if (Comma)
- OS << ", ";
- OS << hex(Item);
- Comma = true;
- }
- OS << "]\n";
- }
-
- template<typename T>
- void printHex(StringRef Label, T Value) {
- startLine() << Label << ": " << hex(Value) << "\n";
- }
-
- template<typename T>
- void printHex(StringRef Label, StringRef Str, T Value) {
- startLine() << Label << ": " << Str << " (" << hex(Value) << ")\n";
- }
-
- void printString(StringRef Label, StringRef Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- void printString(StringRef Label, const std::string &Value) {
- startLine() << Label << ": " << Value << "\n";
- }
-
- template<typename T>
- void printNumber(StringRef Label, StringRef Str, T Value) {
- startLine() << Label << ": " << Str << " (" << Value << ")\n";
- }
-
- void printBinary(StringRef Label, StringRef Str, ArrayRef<uint8_t> Value) {
- printBinaryImpl(Label, Str, Value, false);
- }
-
- void printBinary(StringRef Label, StringRef Str, ArrayRef<char> Value) {
- auto V = makeArrayRef(reinterpret_cast<const uint8_t*>(Value.data()),
- Value.size());
- printBinaryImpl(Label, Str, V, false);
- }
-
- void printBinary(StringRef Label, ArrayRef<uint8_t> Value) {
- printBinaryImpl(Label, StringRef(), Value, false);
- }
-
- void printBinary(StringRef Label, ArrayRef<char> Value) {
- auto V = makeArrayRef(reinterpret_cast<const uint8_t*>(Value.data()),
- Value.size());
- printBinaryImpl(Label, StringRef(), V, false);
- }
-
- void printBinary(StringRef Label, StringRef Value) {
- auto V = makeArrayRef(reinterpret_cast<const uint8_t*>(Value.data()),
- Value.size());
- printBinaryImpl(Label, StringRef(), V, false);
- }
-
- void printBinaryBlock(StringRef Label, StringRef Value) {
- auto V = makeArrayRef(reinterpret_cast<const uint8_t*>(Value.data()),
- Value.size());
- printBinaryImpl(Label, StringRef(), V, true);
- }
-
- raw_ostream& startLine() {
- printIndent();
- return OS;
- }
-
- raw_ostream& getOStream() {
- return OS;
- }
-
-private:
- template<typename T>
- static bool flagName(const EnumEntry<T>& lhs, const EnumEntry<T>& rhs) {
- return lhs.Name < rhs.Name;
- }
-
- void printBinaryImpl(StringRef Label, StringRef Str, ArrayRef<uint8_t> Value,
- bool Block);
-
- raw_ostream &OS;
- int IndentLevel;
-};
-
-struct DictScope {
- DictScope(StreamWriter& W, StringRef N) : W(W) {
- W.startLine() << N << " {\n";
- W.indent();
- }
-
- ~DictScope() {
- W.unindent();
- W.startLine() << "}\n";
- }
-
- StreamWriter& W;
-};
-
-struct ListScope {
- ListScope(StreamWriter& W, StringRef N) : W(W) {
- W.startLine() << N << " [\n";
- W.indent();
- }
-
- ~ListScope() {
- W.unindent();
- W.startLine() << "]\n";
- }
-
- StreamWriter& W;
-};
-
-} // namespace llvm
-
-#endif