summaryrefslogtreecommitdiff
path: root/lldb/source/Target/Target.cpp
diff options
context:
space:
mode:
authorAdrian Prantl <aprantl@apple.com>2024-12-10 16:37:23 -0800
committerAdrian Prantl <aprantl@apple.com>2024-12-10 16:37:53 -0800
commit87659a17d0703c1244211d9f8d1f0c21e816f0e1 (patch)
treecfa86eb79866551dcbea12967b392c70b7ebb9e7 /lldb/source/Target/Target.cpp
parent918d4558b0bad366ecadd411ed48cf64728c68d7 (diff)
Reland: [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. Relanding with more explicit type conversions.
Diffstat (limited to 'lldb/source/Target/Target.cpp')
-rw-r--r--lldb/source/Target/Target.cpp77
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);