1 //===-- UUID.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 LLDB_UTILITY_UUID_H 10 #define LLDB_UTILITY_UUID_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/StringRef.h" 14 #include "llvm/Support/Endian.h" 15 #include <cstddef> 16 #include <cstdint> 17 #include <string> 18 19 namespace lldb_private { 20 21 class Stream; 22 23 class UUID { 24 // Represents UUID's of various sizes. In all cases, a uuid of all zeros is 25 // treated as an "Invalid UUID" marker, and the UUID created from such data 26 // will return false for IsValid. 27 public: 28 UUID() = default; 29 30 /// Creates a uuid from the data pointed to by the bytes argument. UUID(llvm::ArrayRef<uint8_t> bytes)31 UUID(llvm::ArrayRef<uint8_t> bytes) : m_bytes(bytes.begin(), bytes.end()) { 32 if (llvm::all_of(m_bytes, [](uint8_t b) { return b == 0; })) { 33 Clear(); 34 } 35 } 36 37 // Reference: 38 // https://crashpad.chromium.org/doxygen/structcrashpad_1_1CodeViewRecordPDB70.html 39 struct CvRecordPdb70 { 40 struct { 41 llvm::support::ulittle32_t Data1; 42 llvm::support::ulittle16_t Data2; 43 llvm::support::ulittle16_t Data3; 44 uint8_t Data4[8]; 45 } Uuid; 46 llvm::support::ulittle32_t Age; 47 // char PDBFileName[]; 48 }; 49 50 /// Create a UUID from CvRecordPdb70. 51 UUID(CvRecordPdb70 debug_info); 52 53 /// Creates a UUID from the data pointed to by the bytes argument. UUID(const void * bytes,uint32_t num_bytes)54 UUID(const void *bytes, uint32_t num_bytes) { 55 if (!bytes) 56 return; 57 *this 58 = UUID(llvm::ArrayRef<uint8_t>(reinterpret_cast<const uint8_t *>(bytes), 59 num_bytes)); 60 } 61 Clear()62 void Clear() { m_bytes.clear(); } 63 64 void Dump(Stream &s) const; 65 GetBytes()66 llvm::ArrayRef<uint8_t> GetBytes() const { return m_bytes; } 67 68 explicit operator bool() const { return IsValid(); } IsValid()69 bool IsValid() const { return !m_bytes.empty(); } 70 71 std::string GetAsString(llvm::StringRef separator = "-") const; 72 73 bool SetFromStringRef(llvm::StringRef str); 74 75 /// Decode as many UUID bytes as possible from the C string \a cstr. 76 /// 77 /// \param[in] str 78 /// An llvm::StringRef that points at a UUID string value (no leading 79 /// spaces). The string must contain only hex characters and optionally 80 /// can contain the '-' sepearators. 81 /// 82 /// \param[in] uuid_bytes 83 /// A buffer of bytes that will contain a full or partially decoded UUID. 84 /// 85 /// \return 86 /// The original string, with all decoded bytes removed. 87 static llvm::StringRef 88 DecodeUUIDBytesFromString(llvm::StringRef str, 89 llvm::SmallVectorImpl<uint8_t> &uuid_bytes); 90 91 private: 92 // GNU ld generates 20-byte build-ids. Size chosen to avoid heap allocations 93 // for this case. 94 llvm::SmallVector<uint8_t, 20> m_bytes; 95 96 friend bool operator==(const UUID &LHS, const UUID &RHS) { 97 return LHS.m_bytes == RHS.m_bytes; 98 } 99 friend bool operator!=(const UUID &LHS, const UUID &RHS) { 100 return !(LHS == RHS); 101 } 102 friend bool operator<(const UUID &LHS, const UUID &RHS) { 103 return LHS.m_bytes < RHS.m_bytes; 104 } 105 friend bool operator<=(const UUID &LHS, const UUID &RHS) { 106 return !(RHS < LHS); 107 } 108 friend bool operator>(const UUID &LHS, const UUID &RHS) { return RHS < LHS; } 109 friend bool operator>=(const UUID &LHS, const UUID &RHS) { 110 return !(LHS < RHS); 111 } 112 }; 113 } // namespace lldb_private 114 115 #endif // LLDB_UTILITY_UUID_H 116