[Lldb-commits] [lldb] [lldb] Implement a formatter bytecode interpreter in C++ (PR #114333)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 31 13:14:07 PDT 2024
================
@@ -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
More information about the lldb-commits
mailing list