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