[lldb] Remove ProcessStructReader from NSStringSummaryProvider (NFC)

Simplify getting the length of `NSPathStore2` strings.

`NSStringSummaryProvider` uses a single field from `NSPathStore2` instances,
its first ivar: `_lengthAndRefCount`. This change uses
`GetSyntheticChildAtOffset` to replace the use of `ProcessStructReader`, and
removes the hard coded `CompilerType` definition of `NSPathStore2`.

Differential Revision: https://reviews.llvm.org/D116461
This commit is contained in:
Dave Lee 2021-12-30 14:41:27 -08:00
parent 8871d8236a
commit 9d9f3e0ec7
1 changed files with 12 additions and 25 deletions

View File

@ -8,14 +8,13 @@
#include "NSString.h"
#include "Plugins/TypeSystem/Clang/TypeSystemClang.h"
#include "lldb/Core/ValueObject.h"
#include "lldb/Core/ValueObjectConstResult.h"
#include "lldb/DataFormatters/FormattersHelpers.h"
#include "lldb/DataFormatters/StringPrinter.h"
#include "lldb/Target/Language.h"
#include "lldb/Target/ProcessStructReader.h"
#include "lldb/Target/Target.h"
#include "lldb/Utility/ConstString.h"
#include "lldb/Utility/DataBufferHeap.h"
#include "lldb/Utility/Endian.h"
#include "lldb/Utility/Status.h"
@ -31,24 +30,6 @@ NSString_Additionals::GetAdditionalSummaries() {
return g_map;
}
static CompilerType GetNSPathStore2Type(Target &target) {
static ConstString g_type_name("__lldb_autogen_nspathstore2");
TypeSystemClang *ast_ctx = ScratchTypeSystemClang::GetForTarget(target);
if (!ast_ctx)
return CompilerType();
CompilerType voidstar =
ast_ctx->GetBasicType(lldb::eBasicTypeVoid).GetPointerType();
CompilerType uint32 =
ast_ctx->GetBuiltinTypeForEncodingAndBitSize(eEncodingUint, 32);
return ast_ctx->GetOrCreateStructForIdentifier(
g_type_name,
{{"isa", voidstar}, {"lengthAndRef", uint32}, {"buffer", voidstar}});
}
bool lldb_private::formatters::NSStringSummaryProvider(
ValueObject &valobj, Stream &stream,
const TypeSummaryOptions &summary_options) {
@ -229,11 +210,17 @@ bool lldb_private::formatters::NSStringSummaryProvider(
return StringPrinter::ReadStringAndDumpToStream<
StringPrinter::StringElementType::UTF16>(options);
} else if (is_path_store) {
ProcessStructReader reader(valobj.GetProcessSP().get(),
valobj.GetValueAsUnsigned(0),
GetNSPathStore2Type(*valobj.GetTargetSP()));
explicit_length =
reader.GetField<uint32_t>(ConstString("lengthAndRef")) >> 20;
// _lengthAndRefCount is the first ivar of NSPathStore2 (after the isa).
uint64_t length_ivar_offset = 1 * ptr_size;
CompilerType length_type = valobj.GetCompilerType().GetBasicTypeFromAST(
lldb::eBasicTypeUnsignedInt);
ValueObjectSP length_valobj_sp =
valobj.GetSyntheticChildAtOffset(length_ivar_offset, length_type, true,
ConstString("_lengthAndRefCount"));
if (!length_valobj_sp)
return false;
// Get the length out of _lengthAndRefCount.
explicit_length = length_valobj_sp->GetValueAsUnsigned(0) >> 20;
lldb::addr_t location = valobj.GetValueAsUnsigned(0) + ptr_size + 4;
options.SetLocation(location);