//===- FormatUtil.h ------------------------------------------- *- C++ --*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_TOOLS_LLVMPDBUTIL_FORMAT_UTIL_H #define LLVM_TOOLS_LLVMPDBUTIL_FORMAT_UTIL_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Endian.h" #include "llvm/Support/FormatAdapters.h" #include "llvm/Support/FormatVariadic.h" #include #include namespace llvm { namespace pdb { #define PUSH_MASKED_FLAG(Enum, Mask, TheOpt, Value, Text) \ if (Enum::TheOpt == (Value & Mask)) \ Opts.push_back(Text); #define PUSH_FLAG(Enum, TheOpt, Value, Text) \ PUSH_MASKED_FLAG(Enum, Enum::TheOpt, TheOpt, Value, Text) #define RETURN_CASE(Enum, X, Ret) \ case Enum::X: \ return Ret; template static std::string formatUnknownEnum(T Value) { return formatv("unknown ({0})", static_cast::type>(Value)) .str(); } std::string formatSegmentOffset(uint16_t Segment, uint32_t Offset); std::string typesetItemList(ArrayRef Opts, uint32_t IndentLevel, uint32_t GroupSize, StringRef Sep); std::string typesetStringList(uint32_t IndentLevel, ArrayRef Strings); /// Returns the number of digits in the given integer. inline int NumDigits(uint64_t N) { if (N < 10ULL) return 1; if (N < 100ULL) return 2; if (N < 1000ULL) return 3; if (N < 10000ULL) return 4; if (N < 100000ULL) return 5; if (N < 1000000ULL) return 6; if (N < 10000000ULL) return 7; if (N < 100000000ULL) return 8; if (N < 1000000000ULL) return 9; if (N < 10000000000ULL) return 10; if (N < 100000000000ULL) return 11; if (N < 1000000000000ULL) return 12; if (N < 10000000000000ULL) return 13; if (N < 100000000000000ULL) return 14; if (N < 1000000000000000ULL) return 15; if (N < 10000000000000000ULL) return 16; if (N < 100000000000000000ULL) return 17; if (N < 1000000000000000000ULL) return 18; if (N < 10000000000000000000ULL) return 19; return 20; } namespace detail { template struct EndianAdapter final : public FormatAdapter> { using EndianType = support::detail::packed_endian_specific_integral; explicit EndianAdapter(EndianType &&Item) : FormatAdapter(std::move(Item)) {} void format(llvm::raw_ostream &Stream, StringRef Style) { format_provider::format(static_cast(this->Item), Stream, Style); } }; } // namespace detail template detail::EndianAdapter fmtle(support::detail::packed_endian_specific_integral Value) { return detail::EndianAdapter(std::move(Value)); } } } // namespace llvm #endif