1//===- Formatters.h ---------------------------------------------*- C++ -*-===//
2//
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
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_DEBUGINFO_CODEVIEW_FORMATTERS_H
10#define LLVM_DEBUGINFO_CODEVIEW_FORMATTERS_H
11
12#include "llvm/ADT/ArrayRef.h"
13#include "llvm/ADT/StringRef.h"
14#include "llvm/DebugInfo/CodeView/GUID.h"
15#include "llvm/DebugInfo/CodeView/TypeIndex.h"
16#include "llvm/Support/FormatAdapters.h"
17#include "llvm/Support/FormatVariadic.h"
18#include "llvm/Support/raw_ostream.h"
19#include <cstdint>
20
21namespace llvm {
22
23namespace codeview {
24
25namespace detail {
26
27class GuidAdapter final : public FormatAdapter<ArrayRef<uint8_t>> {
28  ArrayRef<uint8_t> Guid;
29
30public:
31  explicit GuidAdapter(ArrayRef<uint8_t> Guid);
32  explicit GuidAdapter(StringRef Guid);
33
34  void format(raw_ostream &Stream, StringRef Style) override;
35};
36
37} // end namespace detail
38
39inline detail::GuidAdapter fmt_guid(StringRef Item) {
40  return detail::GuidAdapter(Item);
41}
42
43inline detail::GuidAdapter fmt_guid(ArrayRef<uint8_t> Item) {
44  return detail::GuidAdapter(Item);
45}
46
47} // end namespace codeview
48
49template <> struct format_provider<codeview::TypeIndex> {
50public:
51  static void format(const codeview::TypeIndex &V, raw_ostream &Stream,
52                     StringRef Style) {
53    if (V.isNoneType())
54      Stream << "<no type>";
55    else {
56      Stream << formatv("{0:X+4}", V.getIndex());
57      if (V.isSimple())
58        Stream << " (" << codeview::TypeIndex::simpleTypeName(V) << ")";
59    }
60  }
61};
62
63template <> struct format_provider<codeview::GUID> {
64  static void format(const codeview::GUID &V, llvm::raw_ostream &Stream,
65                     StringRef Style) {
66    Stream << V;
67  }
68};
69
70} // end namespace llvm
71
72#endif // LLVM_DEBUGINFO_CODEVIEW_FORMATTERS_H
73