1 //===- FormatUtil.h ------------------------------------------- *- C++ --*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_TOOLS_LLVMPDBUTIL_FORMAT_UTIL_H
10 #define LLVM_TOOLS_LLVMPDBUTIL_FORMAT_UTIL_H
12 #include "llvm/ADT/ArrayRef.h"
13 #include "llvm/ADT/StringRef.h"
14 #include "llvm/DebugInfo/CodeView/CodeView.h"
15 #include "llvm/Support/Endian.h"
16 #include "llvm/Support/FormatAdapters.h"
17 #include "llvm/Support/FormatVariadic.h"
20 #include <type_traits>
25 std::string
truncateStringBack(StringRef S
, uint32_t MaxLen
);
26 std::string
truncateStringMiddle(StringRef S
, uint32_t MaxLen
);
27 std::string
truncateStringFront(StringRef S
, uint32_t MaxLen
);
28 std::string
truncateQuotedNameFront(StringRef Label
, StringRef Name
,
30 std::string
truncateQuotedNameBack(StringRef Label
, StringRef Name
,
33 #define PUSH_MASKED_FLAG(Enum, Mask, TheOpt, Value, Text) \
34 if (Enum::TheOpt == (Value & Mask)) \
37 #define PUSH_FLAG(Enum, TheOpt, Value, Text) \
38 PUSH_MASKED_FLAG(Enum, Enum::TheOpt, TheOpt, Value, Text)
40 #define RETURN_CASE(Enum, X, Ret) \
44 template <typename T
> std::string
formatUnknownEnum(T Value
) {
45 return formatv("unknown ({0})",
46 static_cast<typename
std::underlying_type
<T
>::type
>(Value
))
50 std::string
formatSegmentOffset(uint16_t Segment
, uint32_t Offset
);
52 enum class CharacteristicStyle
{
53 HeaderDefinition
, // format as windows header definition
54 Descriptive
, // format as human readable words
56 std::string
formatSectionCharacteristics(
57 uint32_t IndentLevel
, uint32_t C
, uint32_t FlagsPerLine
,
59 CharacteristicStyle Style
= CharacteristicStyle::HeaderDefinition
);
61 std::string
typesetItemList(ArrayRef
<std::string
> Opts
, uint32_t IndentLevel
,
62 uint32_t GroupSize
, StringRef Sep
);
64 std::string
typesetStringList(uint32_t IndentLevel
,
65 ArrayRef
<StringRef
> Strings
);
67 std::string
formatChunkKind(codeview::DebugSubsectionKind Kind
,
68 bool Friendly
= true);
69 std::string
formatSymbolKind(codeview::SymbolKind K
);
70 StringRef
formatTypeLeafKind(codeview::TypeLeafKind K
);
72 /// Returns the number of digits in the given integer.
73 inline int NumDigits(uint64_t N
) {
90 if (N
< 1000000000ULL)
92 if (N
< 10000000000ULL)
94 if (N
< 100000000000ULL)
96 if (N
< 1000000000000ULL)
98 if (N
< 10000000000000ULL)
100 if (N
< 100000000000000ULL)
102 if (N
< 1000000000000000ULL)
104 if (N
< 10000000000000000ULL)
106 if (N
< 100000000000000000ULL)
108 if (N
< 1000000000000000000ULL)
110 if (N
< 10000000000000000000ULL)
116 template <typename T
>
117 struct EndianAdapter final
118 : public FormatAdapter
<support::detail::packed_endian_specific_integral
<
119 T
, support::little
, support::unaligned
>> {
121 support::detail::packed_endian_specific_integral
<T
, support::little
,
124 explicit EndianAdapter(EndianType
&&Item
)
125 : FormatAdapter
<EndianType
>(std::move(Item
)) {}
127 void format(llvm::raw_ostream
&Stream
, StringRef Style
) {
128 format_provider
<T
>::format(static_cast<T
>(this->Item
), Stream
, Style
);
131 } // namespace detail
133 template <typename T
>
134 detail::EndianAdapter
<T
>
135 fmtle(support::detail::packed_endian_specific_integral
<T
, support::little
,
138 return detail::EndianAdapter
<T
>(std::move(Value
));