================ @@ -1537,6 +1538,154 @@ static void LoadScriptingResourceForModule(const ModuleSP &module_sp, feedback_stream.GetData()); } +static void ForEachFormatterInModule( + Module &module, SectionType section_type, + std::function<void(llvm::DataExtractor, llvm::StringRef)> fn) { + auto *sections = module.GetSectionList(); + if (!sections) + return; + + auto section_sp = sections->FindSectionByType(section_type, true); + if (!section_sp) + return; + + TypeCategoryImplSP category; + DataVisualization::Categories::GetCategory(ConstString("default"), category); + + // The type summary record is serialized as follows. + // + // Each record contains, in order: + // * Version number of the record format + // * The remaining size of the record + // * The size of the type identifier + // * The type identifier, either a type name, or a regex + // * The size of the entry + // * The entry + // + // Integers are encoded using ULEB. + // + // Strings are encoded with first a length (ULEB), then the string contents, + // and lastly a null terminator. The length includes the null. + + DataExtractor lldb_extractor; + auto section_size = section_sp->GetSectionData(lldb_extractor); + llvm::DataExtractor section = lldb_extractor.GetAsLLVM(); + bool le = section.isLittleEndian(); + uint8_t addr_size = section.getAddressSize(); + llvm::DataExtractor::Cursor cursor(0); + while (cursor && cursor.tell() < section_size) { + uint64_t version = section.getULEB128(cursor); + uint64_t record_size = section.getULEB128(cursor); + if (version == 1) { + llvm::DataExtractor record(section.getData().drop_front(cursor.tell()), + le, addr_size); + llvm::DataExtractor::Cursor cursor(0); + uint64_t type_size = record.getULEB128(cursor); + llvm::StringRef type_name = record.getBytes(cursor, type_size); + llvm::Error error = cursor.takeError(); + if (!error) + fn(llvm::DataExtractor(record.getData().drop_front(cursor.tell()), le, + addr_size), type_name); + else + LLDB_LOG_ERROR(GetLog(LLDBLog::DataFormatters), std::move(error), ---------------- JDevlieghere wrote:
```suggestion LLDB_LOG_ERROR(GetLog(LLDBLog::Target), std::move(error), ``` I was going to suggest switching this to target, but this code does really belong to the data formatters. Maybe that's a better place for this code to live. https://github.com/llvm/llvm-project/pull/114333 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits