diff options
| author | Adrian Prantl <aprantl@apple.com> | 2024-10-28 17:18:34 -0700 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2024-12-10 09:36:38 -0800 |
| commit | 9a9c1d4a6155a96ce9be494cec7e25731d36b33e (patch) | |
| tree | 29fa08734270ab1e00cf7844c34794e273cbf75d /lldb/source/Target/Target.cpp | |
| parent | 1a650fde4a885420c6f2991b41039c4b16ff42e1 (diff) | |
[lldb] Implement a formatter bytecode interpreter in C++
Compared to the python version, this also does type checking and error
handling, so it's slightly longer, however, it's still comfortably
under 500 lines.
Diffstat (limited to 'lldb/source/Target/Target.cpp')
| -rw-r--r-- | lldb/source/Target/Target.cpp | 77 |
1 files changed, 2 insertions, 75 deletions
diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 9ac85ad3ed5e..46216ba2d566 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -24,9 +24,7 @@ #include "lldb/Core/Section.h" #include "lldb/Core/SourceManager.h" #include "lldb/Core/StructuredDataImpl.h" -#include "lldb/Core/ValueObject.h" -#include "lldb/Core/ValueObjectConstResult.h" -#include "lldb/DataFormatters/DataVisualization.h" +#include "lldb/DataFormatters/FormatterSection.h" #include "lldb/Expression/DiagnosticManager.h" #include "lldb/Expression/ExpressionVariable.h" #include "lldb/Expression/REPL.h" @@ -66,8 +64,6 @@ #include "lldb/Utility/State.h" #include "lldb/Utility/StreamString.h" #include "lldb/Utility/Timer.h" -#include "lldb/ValueObject/ValueObject.h" -#include "lldb/ValueObject/ValueObjectConstResult.h" #include "llvm/ADT/ScopeExit.h" #include "llvm/ADT/SetVector.h" @@ -1541,76 +1537,6 @@ static void LoadScriptingResourceForModule(const ModuleSP &module_sp, feedback_stream.GetData()); } -// Load type summaries embedded in the binary. These are type summaries provided -// by the authors of the code. -static void LoadTypeSummariesForModule(ModuleSP module_sp) { - auto *sections = module_sp->GetSectionList(); - if (!sections) - return; - - auto summaries_sp = - sections->FindSectionByType(eSectionTypeLLDBTypeSummaries, true); - if (!summaries_sp) - return; - - Log *log = GetLog(LLDBLog::DataFormatters); - const char *module_name = module_sp->GetObjectName().GetCString(); - - 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 summary string - // * The summary string - // - // 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 extractor; - auto section_size = summaries_sp->GetSectionData(extractor); - lldb::offset_t offset = 0; - while (offset < section_size) { - uint64_t version = extractor.GetULEB128(&offset); - uint64_t record_size = extractor.GetULEB128(&offset); - if (version == 1) { - uint64_t type_size = extractor.GetULEB128(&offset); - llvm::StringRef type_name = extractor.GetCStr(&offset, type_size); - uint64_t summary_size = extractor.GetULEB128(&offset); - llvm::StringRef summary_string = extractor.GetCStr(&offset, summary_size); - if (!type_name.empty() && !summary_string.empty()) { - TypeSummaryImpl::Flags flags; - auto summary_sp = - std::make_shared<StringSummaryFormat>(flags, summary_string.data()); - FormatterMatchType match_type = eFormatterMatchExact; - if (summary_string.front() == '^' && summary_string.back() == '$') - match_type = eFormatterMatchRegex; - category->AddTypeSummary(type_name, match_type, summary_sp); - LLDB_LOGF(log, "Loaded embedded type summary for '%s' from %s.", - type_name.data(), module_name); - } else { - if (type_name.empty()) - LLDB_LOGF(log, "Missing string(s) in embedded type summary in %s.", - module_name); - } - } else { - // Skip unsupported record. - offset += record_size; - LLDB_LOGF( - log, - "Skipping unsupported embedded type summary of version %llu in %s.", - version, module_name); - } - } -} - void Target::ClearModules(bool delete_locations) { ModulesDidUnload(m_images, delete_locations); m_section_load_history.Clear(); @@ -1892,6 +1818,7 @@ void Target::ModulesDidLoad(ModuleList &module_list) { ModuleSP module_sp(module_list.GetModuleAtIndex(idx)); LoadScriptingResourceForModule(module_sp, this); LoadTypeSummariesForModule(module_sp); + LoadFormattersForModule(module_sp); } m_breakpoint_list.UpdateBreakpoints(module_list, true, false); m_internal_breakpoint_list.UpdateBreakpoints(module_list, true, false); |
