mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-02 16:56:50 +00:00
2448e9f766
We wish to re-use this from llvm-pdbdump, and it provides a nice way to print structured data in scoped format that could prove useful for many other dumping tools as well. Moving to support and changing name to ScopedPrinter to better reflect its purpose. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268342 91177308-0d34-0410-b5e6-96231b3b80d8
73 lines
1.8 KiB
C++
73 lines
1.8 KiB
C++
#include "llvm/Support/ScopedPrinter.h"
|
|
|
|
#include "llvm/ADT/StringExtras.h"
|
|
#include "llvm/Support/Format.h"
|
|
#include <cctype>
|
|
|
|
using namespace llvm::support;
|
|
|
|
namespace llvm {
|
|
|
|
raw_ostream &operator<<(raw_ostream &OS, const HexNumber &Value) {
|
|
OS << "0x" << to_hexString(Value.Value);
|
|
return OS;
|
|
}
|
|
|
|
const std::string to_hexString(uint64_t Value, bool UpperCase) {
|
|
std::string number;
|
|
llvm::raw_string_ostream stream(number);
|
|
stream << format_hex_no_prefix(Value, 1, UpperCase);
|
|
return stream.str();
|
|
}
|
|
|
|
void ScopedPrinter::printBinaryImpl(StringRef Label, StringRef Str,
|
|
ArrayRef<uint8_t> Data, bool Block) {
|
|
if (Data.size() > 16)
|
|
Block = true;
|
|
|
|
if (Block) {
|
|
startLine() << Label;
|
|
if (Str.size() > 0)
|
|
OS << ": " << Str;
|
|
OS << " (\n";
|
|
for (size_t addr = 0, end = Data.size(); addr < end; addr += 16) {
|
|
startLine() << format(" %04" PRIX64 ": ", uint64_t(addr));
|
|
// Dump line of hex.
|
|
for (size_t i = 0; i < 16; ++i) {
|
|
if (i != 0 && i % 4 == 0)
|
|
OS << ' ';
|
|
if (addr + i < end)
|
|
OS << hexdigit((Data[addr + i] >> 4) & 0xF, false)
|
|
<< hexdigit(Data[addr + i] & 0xF, false);
|
|
else
|
|
OS << " ";
|
|
}
|
|
// Print ascii.
|
|
OS << " |";
|
|
for (std::size_t i = 0; i < 16 && addr + i < end; ++i) {
|
|
if (std::isprint(Data[addr + i] & 0xFF))
|
|
OS << Data[addr + i];
|
|
else
|
|
OS << ".";
|
|
}
|
|
OS << "|\n";
|
|
}
|
|
|
|
startLine() << ")\n";
|
|
} else {
|
|
startLine() << Label << ":";
|
|
if (Str.size() > 0)
|
|
OS << " " << Str;
|
|
OS << " (";
|
|
for (size_t i = 0; i < Data.size(); ++i) {
|
|
if (i > 0)
|
|
OS << " ";
|
|
|
|
OS << format("%02X", static_cast<int>(Data[i]));
|
|
}
|
|
OS << ")\n";
|
|
}
|
|
}
|
|
|
|
} // namespace llvm
|