14fcfc199SEugene Zelenko //===- Formatters.cpp -----------------------------------------------------===//
25ce0f4a9SZachary Turner //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65ce0f4a9SZachary Turner //
75ce0f4a9SZachary Turner //===----------------------------------------------------------------------===//
85ce0f4a9SZachary Turner 
95ce0f4a9SZachary Turner #include "llvm/DebugInfo/CodeView/Formatters.h"
104fcfc199SEugene Zelenko #include "llvm/ADT/ArrayRef.h"
1167653ee0SReid Kleckner #include "llvm/DebugInfo/CodeView/GUID.h"
124fcfc199SEugene Zelenko #include "llvm/Support/raw_ostream.h"
134fcfc199SEugene Zelenko #include <algorithm>
144fcfc199SEugene Zelenko #include <cassert>
155ce0f4a9SZachary Turner 
165ce0f4a9SZachary Turner using namespace llvm;
175ce0f4a9SZachary Turner using namespace llvm::codeview;
185ce0f4a9SZachary Turner using namespace llvm::codeview::detail;
195ce0f4a9SZachary Turner 
205ce0f4a9SZachary Turner GuidAdapter::GuidAdapter(StringRef Guid)
215ce0f4a9SZachary Turner     : FormatAdapter(makeArrayRef(Guid.bytes_begin(), Guid.bytes_end())) {}
225ce0f4a9SZachary Turner 
235ce0f4a9SZachary Turner GuidAdapter::GuidAdapter(ArrayRef<uint8_t> Guid)
245ce0f4a9SZachary Turner     : FormatAdapter(std::move(Guid)) {}
255ce0f4a9SZachary Turner 
264fcfc199SEugene Zelenko void GuidAdapter::format(raw_ostream &Stream, StringRef Style) {
275ce0f4a9SZachary Turner   static const char *Lookup = "0123456789ABCDEF";
285ce0f4a9SZachary Turner 
295ce0f4a9SZachary Turner   assert(Item.size() == 16 && "Expected 16-byte GUID");
305ce0f4a9SZachary Turner   Stream << "{";
315ce0f4a9SZachary Turner   for (int i = 0; i < 16;) {
325ce0f4a9SZachary Turner     uint8_t Byte = Item[i];
335ce0f4a9SZachary Turner     uint8_t HighNibble = (Byte >> 4) & 0xF;
345ce0f4a9SZachary Turner     uint8_t LowNibble = Byte & 0xF;
355ce0f4a9SZachary Turner     Stream << Lookup[HighNibble] << Lookup[LowNibble];
365ce0f4a9SZachary Turner     ++i;
375ce0f4a9SZachary Turner     if (i >= 4 && i <= 10 && i % 2 == 0)
385ce0f4a9SZachary Turner       Stream << "-";
395ce0f4a9SZachary Turner   }
405ce0f4a9SZachary Turner   Stream << "}";
415ce0f4a9SZachary Turner }
4267653ee0SReid Kleckner 
4367653ee0SReid Kleckner raw_ostream &llvm::codeview::operator<<(raw_ostream &OS, const GUID &Guid) {
4467653ee0SReid Kleckner   codeview::detail::GuidAdapter A(Guid.Guid);
4567653ee0SReid Kleckner   A.format(OS, "");
4667653ee0SReid Kleckner   return OS;
4767653ee0SReid Kleckner }
48