14fcfc199SEugene Zelenko //===- Formatters.cpp -----------------------------------------------------===// 25ce0f4a9SZachary Turner // 35ce0f4a9SZachary Turner // The LLVM Compiler Infrastructure 45ce0f4a9SZachary Turner // 55ce0f4a9SZachary Turner // This file is distributed under the University of Illinois Open Source 65ce0f4a9SZachary Turner // License. See LICENSE.TXT for details. 75ce0f4a9SZachary Turner // 85ce0f4a9SZachary Turner //===----------------------------------------------------------------------===// 95ce0f4a9SZachary Turner 105ce0f4a9SZachary Turner #include "llvm/DebugInfo/CodeView/Formatters.h" 114fcfc199SEugene Zelenko #include "llvm/ADT/ArrayRef.h" 12*67653ee0SReid Kleckner #include "llvm/DebugInfo/CodeView/GUID.h" 134fcfc199SEugene Zelenko #include "llvm/Support/raw_ostream.h" 144fcfc199SEugene Zelenko #include <algorithm> 154fcfc199SEugene Zelenko #include <cassert> 165ce0f4a9SZachary Turner 175ce0f4a9SZachary Turner using namespace llvm; 185ce0f4a9SZachary Turner using namespace llvm::codeview; 195ce0f4a9SZachary Turner using namespace llvm::codeview::detail; 205ce0f4a9SZachary Turner 215ce0f4a9SZachary Turner GuidAdapter::GuidAdapter(StringRef Guid) 225ce0f4a9SZachary Turner : FormatAdapter(makeArrayRef(Guid.bytes_begin(), Guid.bytes_end())) {} 235ce0f4a9SZachary Turner 245ce0f4a9SZachary Turner GuidAdapter::GuidAdapter(ArrayRef<uint8_t> Guid) 255ce0f4a9SZachary Turner : FormatAdapter(std::move(Guid)) {} 265ce0f4a9SZachary Turner 274fcfc199SEugene Zelenko void GuidAdapter::format(raw_ostream &Stream, StringRef Style) { 285ce0f4a9SZachary Turner static const char *Lookup = "0123456789ABCDEF"; 295ce0f4a9SZachary Turner 305ce0f4a9SZachary Turner assert(Item.size() == 16 && "Expected 16-byte GUID"); 315ce0f4a9SZachary Turner Stream << "{"; 325ce0f4a9SZachary Turner for (int i = 0; i < 16;) { 335ce0f4a9SZachary Turner uint8_t Byte = Item[i]; 345ce0f4a9SZachary Turner uint8_t HighNibble = (Byte >> 4) & 0xF; 355ce0f4a9SZachary Turner uint8_t LowNibble = Byte & 0xF; 365ce0f4a9SZachary Turner Stream << Lookup[HighNibble] << Lookup[LowNibble]; 375ce0f4a9SZachary Turner ++i; 385ce0f4a9SZachary Turner if (i >= 4 && i <= 10 && i % 2 == 0) 395ce0f4a9SZachary Turner Stream << "-"; 405ce0f4a9SZachary Turner } 415ce0f4a9SZachary Turner Stream << "}"; 425ce0f4a9SZachary Turner } 43*67653ee0SReid Kleckner 44*67653ee0SReid Kleckner raw_ostream &llvm::codeview::operator<<(raw_ostream &OS, const GUID &Guid) { 45*67653ee0SReid Kleckner codeview::detail::GuidAdapter A(Guid.Guid); 46*67653ee0SReid Kleckner A.format(OS, ""); 47*67653ee0SReid Kleckner return OS; 48*67653ee0SReid Kleckner } 49