1 //===- StringTable.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_GSYM_STRINGTABLE_H 10 #define LLVM_DEBUGINFO_GSYM_STRINGTABLE_H 11 12 #include "llvm/ADT/StringRef.h" 13 #include "llvm/DebugInfo/GSYM/ExtractRanges.h" 14 #include <stdint.h> 15 16 namespace llvm { 17 namespace gsym { 18 19 /// String tables in GSYM files are required to start with an empty 20 /// string at offset zero. Strings must be UTF8 NULL terminated strings. 21 struct StringTable { 22 StringRef Data; 23 StringTable() = default; StringTableStringTable24 StringTable(StringRef D) : Data(D) {} 25 StringRef operator[](size_t Offset) const { return getString(Offset); } getStringStringTable26 StringRef getString(uint32_t Offset) const { 27 if (Offset < Data.size()) { 28 auto End = Data.find('\0', Offset); 29 return Data.substr(Offset, End - Offset); 30 } 31 return StringRef(); 32 } clearStringTable33 void clear() { Data = StringRef(); } 34 }; 35 36 inline raw_ostream &operator<<(raw_ostream &OS, const StringTable &S) { 37 OS << "String table:\n"; 38 uint32_t Offset = 0; 39 const size_t Size = S.Data.size(); 40 while (Offset < Size) { 41 StringRef Str = S.getString(Offset); 42 OS << HEX32(Offset) << ": \"" << Str << "\"\n"; 43 Offset += Str.size() + 1; 44 } 45 return OS; 46 } 47 48 } // namespace gsym 49 } // namespace llvm 50 #endif // LLVM_DEBUGINFO_GSYM_STRINGTABLE_H 51