25#include "llvm/Support/Threading.h"
63std::optional<const ObjCLanguage::ObjCMethodName>
79 if (name.size() < (5 + (strict ? 1 : 0)) || name.back() !=
']')
84 if (name.starts_with(
"+["))
86 else if (name.starts_with(
"-["))
104 llvm::StringRef full =
m_full;
105 const size_t class_start_pos = (full.front() ==
'[' ? 1 : 2);
106 const size_t paren_pos = full.find(
'(', class_start_pos);
108 if (paren_pos != llvm::StringRef::npos)
109 return full.substr(class_start_pos, paren_pos - class_start_pos);
112 const size_t space_pos = full.find(
' ', class_start_pos);
113 return full.substr(class_start_pos, space_pos - class_start_pos);
117 llvm::StringRef full =
m_full;
118 const size_t class_start_pos = (full.front() ==
'[' ? 1 : 2);
119 const size_t space_pos = full.find(
' ', class_start_pos);
120 return full.substr(class_start_pos, space_pos - class_start_pos);
124 llvm::StringRef full =
m_full;
125 const size_t space_pos = full.find(
' ');
126 if (space_pos == llvm::StringRef::npos)
127 return llvm::StringRef();
128 const size_t closing_bracket = full.find(
']', space_pos);
129 return full.substr(space_pos + 1, closing_bracket - space_pos - 1);
133 llvm::StringRef full =
m_full;
134 const size_t open_paren_pos = full.find(
'(');
135 const size_t close_paren_pos = full.find(
')');
137 if (open_paren_pos == llvm::StringRef::npos ||
138 close_paren_pos == llvm::StringRef::npos)
139 return llvm::StringRef();
141 return full.substr(open_paren_pos + 1,
142 close_paren_pos - (open_paren_pos + 1));
146 llvm::StringRef full =
m_full;
147 const size_t open_paren_pos = full.find(
'(');
148 const size_t close_paren_pos = full.find(
')');
149 if (open_paren_pos == llvm::StringRef::npos ||
150 close_paren_pos == llvm::StringRef::npos)
151 return std::string();
158 size_t total_size = class_name.size() + selector_name.size() + 3;
162 std::string name_sans_category;
163 name_sans_category.reserve(total_size);
166 name_sans_category +=
'+';
168 name_sans_category +=
'-';
170 name_sans_category +=
'[';
171 name_sans_category.append(class_name.data(), class_name.size());
172 name_sans_category +=
' ';
173 name_sans_category.append(selector_name.data(), selector_name.size());
174 name_sans_category +=
']';
176 return name_sans_category;
179std::vector<Language::MethodNameVariant>
181 std::vector<Language::MethodNameVariant> variant_names;
182 std::optional<const ObjCLanguage::ObjCMethodName> objc_method =
185 return variant_names;
187 variant_names.emplace_back(
ConstString(objc_method->GetSelector()),
188 lldb::eFunctionNameTypeSelector);
190 const std::string name_sans_category =
191 objc_method->GetFullNameWithoutCategory();
193 if (objc_method->IsClassMethod() || objc_method->IsInstanceMethod()) {
194 if (!name_sans_category.empty())
195 variant_names.emplace_back(
ConstString(name_sans_category.c_str()),
196 lldb::eFunctionNameTypeFull);
200 strm.
Printf(
"+%s", objc_method->GetFullName().c_str());
202 lldb::eFunctionNameTypeFull);
205 strm.
Printf(
"-%s", objc_method->GetFullName().c_str());
207 lldb::eFunctionNameTypeFull);
210 if (!name_sans_category.empty()) {
211 strm.
Printf(
"+%s", name_sans_category.c_str());
213 lldb::eFunctionNameTypeFull);
216 strm.
Printf(
"-%s", name_sans_category.c_str());
218 lldb::eFunctionNameTypeFull);
222 return variant_names;
225std::pair<FunctionNameType, std::optional<ConstString>>
227 FunctionNameType func_name_type = eFunctionNameTypeNone;
230 func_name_type = eFunctionNameTypeFull;
233 func_name_type |= eFunctionNameTypeSelector;
235 return {func_name_type, std::nullopt};
246 if (!objc_category_sp)
272 "SEL summary provider",
"SEL", objc_flags);
275 "SEL summary provider",
"struct objc_selector", objc_flags);
278 "SEL summary provider",
"objc_selector", objc_flags);
281 "SEL summary provider",
"objc_selector *", objc_flags);
284 "SEL summary provider",
"SEL *", objc_flags);
288 "Class summary provider",
"Class", objc_flags);
296 "Class synthetic children",
"Class", class_synth_flags);
303 "__block_literal_generic", objc_flags);
306 "${var.years} years, ${var.months} "
307 "months, ${var.days} days, ${var.hours} "
308 "hours, ${var.minutes} minutes "
309 "${var.seconds} seconds",
310 "CFGregorianUnits", objc_flags);
312 "location=${var.location} length=${var.length}",
"CFRange",
316 "location=${var.location}, length=${var.length}",
"NSRange",
319 "NSRectArray", objc_flags);
330 "red=${var.red} green=${var.green} blue=${var.blue}",
331 "RGBColor", objc_flags);
334 "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
"Rect",
339 "${var.month}/${var.day}/${var.year} ${var.hour} "
340 ":${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
341 "DateTimeRect *", objc_flags);
343 "${var.ld.month}/${var.ld.day}/"
344 "${var.ld.year} ${var.ld.hour} "
345 ":${var.ld.minute} :${var.ld.second} "
346 "dayOfWeek:${var.ld.dayOfWeek}",
347 "LongDateRect", objc_flags);
351 "HIRect", objc_flags);
366 "NSArray summary provider",
"NSArray", appkit_flags);
369 "NSArray summary provider",
"NSConstantArray", appkit_flags);
372 "NSArray summary provider",
"NSMutableArray", appkit_flags);
375 "NSArray summary provider",
"__NSArrayI", appkit_flags);
378 "NSArray summary provider",
"__NSArray0", appkit_flags);
381 "NSArray summary provider",
"__NSSingleObjectArrayI", appkit_flags);
384 "NSArray summary provider",
"__NSArrayM", appkit_flags);
387 "NSArray summary provider",
"__NSCFArray", appkit_flags);
390 "NSArray summary provider",
"_NSCallStackArray", appkit_flags);
393 "NSArray summary provider",
"CFArrayRef", appkit_flags);
396 "NSArray summary provider",
"CFMutableArrayRef", appkit_flags);
400 "NSDictionary summary provider",
"NSDictionary", appkit_flags);
403 "NSDictionary summary provider",
"NSConstantDictionary",
407 "NSDictionary summary provider",
"NSMutableDictionary",
411 "NSDictionary summary provider",
"__NSCFDictionary",
415 "NSDictionary summary provider",
"__NSDictionaryI",
419 "NSDictionary summary provider",
"__NSSingleEntryDictionaryI",
423 "NSDictionary summary provider",
"__NSDictionaryM",
427 "NSDictionary summary provider",
"CFDictionaryRef",
431 "NSDictionary summary provider",
"__CFDictionary",
435 "NSDictionary summary provider",
"CFMutableDictionaryRef",
440 "NSSet summary",
"NSSet", appkit_flags);
443 "NSMutableSet summary",
"NSMutableSet", appkit_flags);
446 "CFSetRef summary",
"CFSetRef", appkit_flags);
449 "CFMutableSetRef summary",
"CFMutableSetRef", appkit_flags);
452 "__NSCFSet summary",
"__NSCFSet", appkit_flags);
455 "__CFSet summary",
"__CFSet", appkit_flags);
458 "__NSSetI summary",
"__NSSetI", appkit_flags);
461 "__NSSetM summary",
"__NSSetM", appkit_flags);
464 "NSCountedSet summary",
"NSCountedSet", appkit_flags);
467 "NSMutableSet summary",
"NSMutableSet", appkit_flags);
470 "NSOrderedSet summary",
"NSOrderedSet", appkit_flags);
473 "__NSOrderedSetI summary",
"__NSOrderedSetI", appkit_flags);
476 "__NSOrderedSetM summary",
"__NSOrderedSetM", appkit_flags);
480 "NSError summary provider",
"NSError", appkit_flags);
483 "NSException summary provider",
"NSException", appkit_flags);
492 "NSArray synthetic children",
"__NSArrayM",
496 "NSArray synthetic children",
"__NSArrayI",
500 "NSArray synthetic children",
"__NSArray0",
504 "NSArray synthetic children",
"__NSSingleObjectArrayI",
508 "NSArray synthetic children",
"NSArray",
512 "NSArray synthetic children",
"NSConstantArray",
516 "NSArray synthetic children",
"NSMutableArray",
520 "NSArray synthetic children",
"__NSCFArray",
524 "NSArray synthetic children",
"_NSCallStackArray",
528 "NSArray synthetic children",
"CFMutableArrayRef",
532 "NSArray synthetic children",
"CFArrayRef",
538 "NSDictionary synthetic children",
"__NSDictionaryM",
543 "NSDictionary synthetic children",
"NSConstantDictionary",
548 "NSDictionary synthetic children",
"__NSDictionaryI",
553 "NSDictionary synthetic children",
"__NSSingleEntryDictionaryI",
558 "NSDictionary synthetic children",
"__NSCFDictionary",
563 "NSDictionary synthetic children",
"NSDictionary",
568 "NSDictionary synthetic children",
"NSMutableDictionary",
573 "NSDictionary synthetic children",
"CFDictionaryRef",
578 "NSDictionary synthetic children",
"CFMutableDictionaryRef",
583 "NSDictionary synthetic children",
"__CFDictionary",
588 "NSError synthetic children",
"NSError",
592 "NSException synthetic children",
"NSException",
600 "__NSSetI synthetic children",
"__NSSetI",
604 "__NSSetM synthetic children",
"__NSSetM",
608 "__NSCFSet synthetic children",
"__NSCFSet",
612 "CFSetRef synthetic children",
"CFSetRef",
617 "NSMutableSet synthetic children",
"NSMutableSet",
621 "NSOrderedSet synthetic children",
"NSOrderedSet",
625 "__NSOrderedSetI synthetic children",
"__NSOrderedSetI",
629 "__NSOrderedSetM synthetic children",
"__NSOrderedSetM",
633 "__CFSet synthetic children",
"__CFSet",
638 "NSIndexPath synthetic children",
"NSIndexPath",
643 "CFBag summary provider",
"CFBagRef", appkit_flags);
646 "CFBag summary provider",
"__CFBag", appkit_flags);
649 "CFBag summary provider",
"const struct __CFBag", appkit_flags);
652 "CFBag summary provider",
"CFMutableBagRef", appkit_flags);
656 "CFBinaryHeap summary provider",
"CFBinaryHeapRef", appkit_flags);
659 "CFBinaryHeap summary provider",
"__CFBinaryHeap", appkit_flags);
663 "NSString summary provider",
"NSString", appkit_flags);
666 "NSString summary provider",
"CFStringRef", appkit_flags);
669 "NSString summary provider",
"__CFString", appkit_flags);
672 "NSString summary provider",
"CFMutableStringRef", appkit_flags);
675 "NSString summary provider",
"NSMutableString", appkit_flags);
678 "NSString summary provider",
"__NSCFConstantString", appkit_flags);
681 "NSString summary provider",
"__NSCFString", appkit_flags);
684 "NSString summary provider",
"NSCFConstantString", appkit_flags);
687 "NSString summary provider",
"NSCFString", appkit_flags);
690 "NSString summary provider",
"NSPathStore2", appkit_flags);
693 "NSString summary provider",
"NSTaggedPointerString", appkit_flags);
696 "NSString summary provider",
"NSIndirectTaggedPointerString",
701 "NSAttributedString summary provider",
"NSAttributedString",
706 "NSMutableAttributedString summary provider",
"NSMutableAttributedString",
711 "NSMutableAttributedString summary provider",
712 "NSConcreteMutableAttributedString", appkit_flags);
716 "NSBundle summary provider",
"NSBundle", appkit_flags);
720 "NSData summary provider",
"NSData", appkit_flags);
723 "NSData summary provider",
"_NSInlineData", appkit_flags);
726 "NSData summary provider",
"NSConcreteData", appkit_flags);
729 "NSData summary provider",
"NSConcreteMutableData", appkit_flags);
732 "NSData summary provider",
"NSMutableData", appkit_flags);
735 "NSData summary provider",
"__NSCFData", appkit_flags);
738 "NSData summary provider",
"CFDataRef", appkit_flags);
741 "NSData summary provider",
"CFMutableDataRef", appkit_flags);
745 "NSMachPort summary provider",
"NSMachPort", appkit_flags);
749 "NSNotification summary provider",
"NSNotification", appkit_flags);
752 "NSNotification summary provider",
"NSConcreteNotification",
757 "NSNumber summary provider",
"NSNumber", appkit_flags);
760 "NSNumber summary provider",
"NSConstantIntegerNumber", appkit_flags);
763 "NSNumber summary provider",
"NSConstantDoubleNumber", appkit_flags);
766 "NSNumber summary provider",
"NSConstantFloatNumber", appkit_flags);
769 "CFNumberRef summary provider",
"CFNumberRef", appkit_flags);
772 "NSNumber summary provider",
"__NSCFBoolean", appkit_flags);
775 "NSNumber summary provider",
"__NSCFNumber", appkit_flags);
778 "NSNumber summary provider",
"NSCFBoolean", appkit_flags);
781 "NSNumber summary provider",
"NSCFNumber", appkit_flags);
784 "NSDecimalNumber summary provider",
"NSDecimalNumber", appkit_flags);
788 "NSURL summary provider",
"NSURL", appkit_flags);
791 "NSURL summary provider",
"CFURLRef", appkit_flags);
795 "NSDate summary provider",
"NSDate", appkit_flags);
798 "NSDate summary provider",
"__NSDate", appkit_flags);
801 "NSDate summary provider",
"__NSTaggedDate", appkit_flags);
804 "NSDate summary provider",
"NSCalendarDate", appkit_flags);
808 "NSTimeZone summary provider",
"NSTimeZone", appkit_flags);
811 "NSTimeZone summary provider",
"CFTimeZoneRef", appkit_flags);
814 "NSTimeZone summary provider",
"__NSTimeZone", appkit_flags);
822 "CFAbsoluteTime summary provider",
"CFAbsoluteTime", appkit_flags);
827 "NSIndexSet summary provider",
"NSIndexSet", appkit_flags);
830 "NSIndexSet summary provider",
"NSMutableIndexSet", appkit_flags);
833 "@\"${var.month%d}/${var.day%d}/${var.year%d} "
834 "${var.hour%d}:${var.minute%d}:${var.second}\"",
835 "CFGregorianDate", appkit_flags);
839 "CFBitVector summary provider",
"CFBitVectorRef", appkit_flags);
842 "CFBitVector summary provider",
"CFMutableBitVectorRef", appkit_flags);
845 "CFBitVector summary provider",
"__CFBitVector", appkit_flags);
848 "CFBitVector summary provider",
"__CFMutableBitVector", appkit_flags);
852 if (!objc_category_sp)
866 "CMTime summary provider",
"CMTime", cm_flags);
870 static llvm::once_flag g_initialize;
873 llvm::call_once(g_initialize, [
this]() ->
void {
884std::vector<FormattersMatchCandidate>
887 std::vector<FormattersMatchCandidate> result;
894 const bool check_cpp =
false;
895 const bool check_objc =
true;
896 bool canBeObjCDynamic =
905 if (runtime ==
nullptr)
911 if (
ConstString name = objc_class_sp->GetClassName())
913 {name, valobj.
GetTargetSP()->GetDebugger().GetScriptInterpreter(),
928 bool IsValid()
override {
return m_compiler_type.
IsValid(); }
930 bool DumpToStream(
Stream &stream,
bool print_help_if_available)
override {
932 m_compiler_type.DumpTypeDescription(&stream);
946 ResultSet &results)
override {
951 if (
auto *decl_vendor = objc_runtime->GetDeclVendor()) {
956 std::unique_ptr<Language::TypeScavenger::Result> result(
957 new ObjCScavengerResult(type));
958 results.insert(std::move(result));
973 ResultSet &results)
override {
977 auto *persistent_vars = llvm::cast<ClangPersistentVariables>(
978 target->GetPersistentExpressionStateForLanguage(
980 if (std::shared_ptr<ClangModulesDeclVendor> clang_modules_decl_vendor =
981 persistent_vars->GetClangModulesDeclVendor()) {
983 auto types = clang_modules_decl_vendor->FindTypes(
985 if (!types.empty()) {
987 std::unique_ptr<Language::TypeScavenger::Result> result(
988 new ObjCScavengerResult(types.front()));
989 results.insert(std::move(result));
1012 return std::unique_ptr<TypeScavenger>(
1014 ObjCRuntimeScavenger,
1015 ObjCDebugInfoScavenger>());
1018std::pair<llvm::StringRef, llvm::StringRef>
1020 static constexpr llvm::StringRef empty;
1021 static const llvm::StringMap<
1022 std::pair<const llvm::StringRef, const llvm::StringRef>>
1024 {
"CFBag", {
"@", empty}},
1025 {
"CFBinaryHeap", {
"@", empty}},
1026 {
"NSString", {
"@", empty}},
1027 {
"NSString*", {
"@", empty}},
1028 {
"NSNumber:char", {
"(char)", empty}},
1029 {
"NSNumber:short", {
"(short)", empty}},
1030 {
"NSNumber:int", {
"(int)", empty}},
1031 {
"NSNumber:long", {
"(long)", empty}},
1032 {
"NSNumber:int128_t", {
"(int128_t)", empty}},
1033 {
"NSNumber:float", {
"(float)", empty}},
1034 {
"NSNumber:double", {
"(double)", empty}},
1035 {
"NSData", {
"@\"",
"\""}},
1036 {
"NSArray", {
"@\"",
"\""}},
1038 return g_affix_map.lookup(type_hint);
1042 const uint32_t mask = eTypeIsObjC | eTypeIsPointer;
1043 bool isObjCpointer =
1047 bool canReadValue =
true;
1049 return canReadValue && isZero;
1053 const auto suffixes = {
".h",
".m",
".M"};
1054 for (
auto suffix : suffixes) {
1055 if (file_path.ends_with_insensitive(suffix))
1063 return llvm::StringSwitch<std::optional<bool>>(str)
1064 .Case(
"YES", {
true})
1065 .Case(
"NO", {
false})
static void LoadCoreMediaFormatters(TypeCategoryImplSP objc_category_sp)
static void LoadObjCFormatters(TypeCategoryImplSP objc_category_sp)
#define LLDB_PLUGIN_DEFINE(PluginName)
Generic representation of a type in a programming language.
lldb::LanguageType GetMinimumLanguage()
bool IsPossibleDynamicType(CompilerType *target_type, bool check_cplusplus, bool check_objc) const
CompilerType GetTypedefedType() const
If the current object represents a typedef type, get the underlying type.
bool IsTypedefType() const
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
const char * GetCString() const
Get the string value as a C string.
static bool GetCategory(ConstString category, lldb::TypeCategoryImplSP &entry, bool allow_create=true)
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
virtual lldb::ProcessSP CalculateProcess()=0
virtual lldb::TargetSP CalculateTarget()=0
static bool LanguageIsObjC(lldb::LanguageType language)
A class that handles mangled names.
ConstString GetDemangledName() const
Demangled name get accessor.
std::shared_ptr< ClassDescriptor > ClassDescriptorSP
static ObjCLanguageRuntime * Get(Process &process)
virtual ClassDescriptorSP GetClassDescriptor(ValueObject &in_value)
llvm::StringRef GetClassNameWithCategory() const
Returns a reference to the class name with the category.
llvm::StringRef GetSelector() const
Returns a reference to the selector name.
static std::optional< const ObjCMethodName > Create(llvm::StringRef name, bool strict)
The static factory method for creating a ObjCMethodName.
llvm::StringRef GetCategory() const
Returns a reference to the category name.
llvm::StringRef GetClassName() const
Returns a reference to the class name.
std::string GetFullNameWithoutCategory() const
Creates a variation of this method without the category.
llvm::StringRef GetPluginName() override
std::pair< llvm::StringRef, llvm::StringRef > GetFormatterPrefixSuffix(llvm::StringRef type_hint) override
An individual data formatter may apply to several types and cross language boundaries.
static bool IsPossibleObjCSelector(const char *name)
static lldb_private::Language * CreateInstance(lldb::LanguageType language)
std::unique_ptr< TypeScavenger > GetTypeScavenger() override
lldb::TypeCategoryImplSP GetFormatters() override
std::pair< lldb::FunctionNameType, std::optional< ConstString > > GetFunctionNameInfo(ConstString name) const override
bool SymbolNameFitsToLanguage(Mangled mangled) const override
Returns true iff the given symbol name is compatible with the mangling scheme of this language.
bool IsSourceFile(llvm::StringRef file_path) const override
virtual std::optional< bool > GetBooleanFromString(llvm::StringRef str) const override
static llvm::StringRef GetPluginNameStatic()
std::vector< FormattersMatchCandidate > GetPossibleFormattersMatches(ValueObject &valobj, lldb::DynamicValueType use_dynamic) override
std::vector< Language::MethodNameVariant > GetMethodNameVariants(ConstString method_name) const override
bool IsNilReference(ValueObject &valobj) override
static bool IsPossibleObjCMethodName(const char *name)
static bool RegisterPlugin(llvm::StringRef name, llvm::StringRef description, ABICreateInstance create_callback)
static bool UnregisterPlugin(ABICreateInstance create_callback)
llvm::StringRef GetString() const
A stream class that can stream formatted output to a file.
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
size_t EOL()
Output and End of Line character to the stream.
Flags & SetSkipReferences(bool value=true)
Flags & SetSkipPointers(bool value=true)
Flags & SetCascades(bool value=true)
Flags & SetCascades(bool value=true)
Flags & SetSkipPointers(bool value=true)
Flags & SetHideItemNames(bool value=true)
Flags & SetDontShowChildren(bool value=true)
Flags & SetSkipReferences(bool value=true)
Flags & SetShowMembersOneLiner(bool value=true)
Flags & SetDontShowValue(bool value=true)
CompilerType GetCompilerType()
lldb::ProcessSP GetProcessSP() const
virtual uint64_t GetValueAsUnsigned(uint64_t fail_value, bool *success=nullptr)
lldb::TargetSP GetTargetSP() const
A class that represents a running process on the host machine.
std::shared_ptr< lldb_private::TypeSummaryImpl > TypeSummaryImplSP
LanguageType
Programming language type.
@ eLanguageTypeC
Non-standardized C, such as K&R.
@ eLanguageTypeObjC
Objective-C.
std::shared_ptr< lldb_private::Process > ProcessSP
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
static bool IsClangType(const CompilerType &ct)