1 //===-- FormatManager.cpp -------------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #include "lldb/lldb-python.h" 11 12 #include "lldb/DataFormatters/FormatManager.h" 13 14 // C Includes 15 // C++ Includes 16 // Other libraries and framework includes 17 // Project includes 18 19 #include "lldb/Core/Debugger.h" 20 #include "lldb/DataFormatters/CXXFormatterFunctions.h" 21 #include "lldb/Interpreter/ScriptInterpreterPython.h" 22 #include "lldb/Target/ExecutionContext.h" 23 #include "lldb/Target/Platform.h" 24 #include "llvm/ADT/STLExtras.h" 25 26 using namespace lldb; 27 using namespace lldb_private; 28 29 30 struct FormatInfo 31 { 32 Format format; 33 const char format_char; // One or more format characters that can be used for this format. 34 const char *format_name; // Long format name that can be used to specify the current format 35 }; 36 37 static FormatInfo 38 g_format_infos[] = 39 { 40 { eFormatDefault , '\0' , "default" }, 41 { eFormatBoolean , 'B' , "boolean" }, 42 { eFormatBinary , 'b' , "binary" }, 43 { eFormatBytes , 'y' , "bytes" }, 44 { eFormatBytesWithASCII , 'Y' , "bytes with ASCII" }, 45 { eFormatChar , 'c' , "character" }, 46 { eFormatCharPrintable , 'C' , "printable character" }, 47 { eFormatComplexFloat , 'F' , "complex float" }, 48 { eFormatCString , 's' , "c-string" }, 49 { eFormatDecimal , 'd' , "decimal" }, 50 { eFormatEnum , 'E' , "enumeration" }, 51 { eFormatHex , 'x' , "hex" }, 52 { eFormatHexUppercase , 'X' , "uppercase hex" }, 53 { eFormatFloat , 'f' , "float" }, 54 { eFormatOctal , 'o' , "octal" }, 55 { eFormatOSType , 'O' , "OSType" }, 56 { eFormatUnicode16 , 'U' , "unicode16" }, 57 { eFormatUnicode32 , '\0' , "unicode32" }, 58 { eFormatUnsigned , 'u' , "unsigned decimal" }, 59 { eFormatPointer , 'p' , "pointer" }, 60 { eFormatVectorOfChar , '\0' , "char[]" }, 61 { eFormatVectorOfSInt8 , '\0' , "int8_t[]" }, 62 { eFormatVectorOfUInt8 , '\0' , "uint8_t[]" }, 63 { eFormatVectorOfSInt16 , '\0' , "int16_t[]" }, 64 { eFormatVectorOfUInt16 , '\0' , "uint16_t[]" }, 65 { eFormatVectorOfSInt32 , '\0' , "int32_t[]" }, 66 { eFormatVectorOfUInt32 , '\0' , "uint32_t[]" }, 67 { eFormatVectorOfSInt64 , '\0' , "int64_t[]" }, 68 { eFormatVectorOfUInt64 , '\0' , "uint64_t[]" }, 69 { eFormatVectorOfFloat32, '\0' , "float32[]" }, 70 { eFormatVectorOfFloat64, '\0' , "float64[]" }, 71 { eFormatVectorOfUInt128, '\0' , "uint128_t[]" }, 72 { eFormatComplexInteger , 'I' , "complex integer" }, 73 { eFormatCharArray , 'a' , "character array" }, 74 { eFormatAddressInfo , 'A' , "address" }, 75 { eFormatHexFloat , '\0' , "hex float" }, 76 { eFormatInstruction , 'i' , "instruction" }, 77 { eFormatVoid , 'v' , "void" } 78 }; 79 80 static uint32_t g_num_format_infos = llvm::array_lengthof(g_format_infos); 81 82 static bool 83 GetFormatFromFormatChar (char format_char, Format &format) 84 { 85 for (uint32_t i=0; i<g_num_format_infos; ++i) 86 { 87 if (g_format_infos[i].format_char == format_char) 88 { 89 format = g_format_infos[i].format; 90 return true; 91 } 92 } 93 format = eFormatInvalid; 94 return false; 95 } 96 97 static bool 98 GetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format &format) 99 { 100 uint32_t i; 101 for (i=0; i<g_num_format_infos; ++i) 102 { 103 if (strcasecmp (g_format_infos[i].format_name, format_name) == 0) 104 { 105 format = g_format_infos[i].format; 106 return true; 107 } 108 } 109 110 if (partial_match_ok) 111 { 112 for (i=0; i<g_num_format_infos; ++i) 113 { 114 if (strcasestr (g_format_infos[i].format_name, format_name) == g_format_infos[i].format_name) 115 { 116 format = g_format_infos[i].format; 117 return true; 118 } 119 } 120 } 121 format = eFormatInvalid; 122 return false; 123 } 124 125 bool 126 FormatManager::GetFormatFromCString (const char *format_cstr, 127 bool partial_match_ok, 128 lldb::Format &format) 129 { 130 bool success = false; 131 if (format_cstr && format_cstr[0]) 132 { 133 if (format_cstr[1] == '\0') 134 { 135 success = GetFormatFromFormatChar (format_cstr[0], format); 136 if (success) 137 return true; 138 } 139 140 success = GetFormatFromFormatName (format_cstr, partial_match_ok, format); 141 } 142 if (!success) 143 format = eFormatInvalid; 144 return success; 145 } 146 147 char 148 FormatManager::GetFormatAsFormatChar (lldb::Format format) 149 { 150 for (uint32_t i=0; i<g_num_format_infos; ++i) 151 { 152 if (g_format_infos[i].format == format) 153 return g_format_infos[i].format_char; 154 } 155 return '\0'; 156 } 157 158 const char * 159 FormatManager::GetFormatAsCString (Format format) 160 { 161 if (format >= eFormatDefault && format < kNumFormats) 162 return g_format_infos[format].format_name; 163 return NULL; 164 } 165 166 void 167 FormatManager::GetPossibleMatches (ValueObject& valobj, 168 ClangASTType clang_type, 169 uint32_t reason, 170 lldb::DynamicValueType use_dynamic, 171 FormattersMatchVector& entries, 172 bool did_strip_ptr, 173 bool did_strip_ref, 174 bool did_strip_typedef, 175 bool root_level) 176 { 177 clang_type = clang_type.RemoveFastQualifiers(); 178 ConstString type_name(clang_type.GetConstTypeName()); 179 if (valobj.GetBitfieldBitSize() > 0) 180 { 181 StreamString sstring; 182 sstring.Printf("%s:%d",type_name.AsCString(),valobj.GetBitfieldBitSize()); 183 ConstString bitfieldname = ConstString(sstring.GetData()); 184 entries.push_back({bitfieldname,0,did_strip_ptr,did_strip_ref,did_strip_typedef}); 185 reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField; 186 } 187 entries.push_back({type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef}); 188 189 ConstString display_type_name(clang_type.GetDisplayTypeName()); 190 if (display_type_name != type_name) 191 entries.push_back({display_type_name,reason,did_strip_ptr,did_strip_ref,did_strip_typedef}); 192 193 for (bool is_rvalue_ref = true, j = true; j && clang_type.IsReferenceType(nullptr, &is_rvalue_ref); j = false) 194 { 195 ClangASTType non_ref_type = clang_type.GetNonReferenceType(); 196 GetPossibleMatches(valobj, 197 non_ref_type, 198 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference, 199 use_dynamic, 200 entries, 201 did_strip_ptr, 202 true, 203 did_strip_typedef); 204 if (non_ref_type.IsTypedefType()) 205 { 206 ClangASTType deffed_referenced_type = non_ref_type.GetTypedefedType(); 207 deffed_referenced_type = is_rvalue_ref ? deffed_referenced_type.GetRValueReferenceType() : deffed_referenced_type.GetLValueReferenceType(); 208 GetPossibleMatches(valobj, 209 deffed_referenced_type, 210 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, 211 use_dynamic, 212 entries, 213 did_strip_ptr, 214 did_strip_ref, 215 true); // this is not exactly the usual meaning of stripping typedefs 216 } 217 } 218 219 if (clang_type.IsPointerType()) 220 { 221 ClangASTType non_ptr_type = clang_type.GetPointeeType(); 222 GetPossibleMatches(valobj, 223 non_ptr_type, 224 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference, 225 use_dynamic, 226 entries, 227 true, 228 did_strip_ref, 229 did_strip_typedef); 230 if (non_ptr_type.IsTypedefType()) 231 { 232 ClangASTType deffed_pointed_type = non_ptr_type.GetTypedefedType().GetPointerType(); 233 GetPossibleMatches(valobj, 234 deffed_pointed_type, 235 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, 236 use_dynamic, 237 entries, 238 did_strip_ptr, 239 did_strip_ref, 240 true); // this is not exactly the usual meaning of stripping typedefs 241 } 242 } 243 bool canBeObjCDynamic = clang_type.IsPossibleDynamicType (NULL, 244 false, // no C 245 true); // yes ObjC 246 247 if (canBeObjCDynamic) 248 { 249 if (use_dynamic != lldb::eNoDynamicValues) 250 { 251 do 252 { 253 lldb::ProcessSP process_sp = valobj.GetProcessSP(); 254 if (!process_sp) 255 break; 256 ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime(); 257 if (runtime == nullptr) 258 break; 259 ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj)); 260 if (!objc_class_sp) 261 break; 262 ConstString name (objc_class_sp->GetClassName()); 263 entries.push_back({name,reason | lldb_private::eFormatterChoiceCriterionDynamicObjCDiscovery,did_strip_ptr,did_strip_ref,did_strip_typedef}); 264 } while (false); 265 } 266 267 ClangASTType non_ptr_type = clang_type.GetPointeeType(); 268 GetPossibleMatches(valobj, 269 non_ptr_type, 270 reason | lldb_private::eFormatterChoiceCriterionStrippedPointerReference, 271 use_dynamic, 272 entries, 273 true, 274 did_strip_ref, 275 did_strip_typedef); 276 } 277 278 // try to strip typedef chains 279 if (clang_type.IsTypedefType()) 280 { 281 ClangASTType deffed_type = clang_type.GetTypedefedType(); 282 GetPossibleMatches(valobj, 283 deffed_type, 284 reason | lldb_private::eFormatterChoiceCriterionNavigatedTypedefs, 285 use_dynamic, 286 entries, 287 did_strip_ptr, 288 did_strip_ref, 289 true); 290 } 291 292 if (root_level) 293 { 294 do { 295 if (!clang_type.IsValid()) 296 break; 297 298 ClangASTType unqual_clang_ast_type = clang_type.GetFullyUnqualifiedType(); 299 if (!unqual_clang_ast_type.IsValid()) 300 break; 301 if (unqual_clang_ast_type.GetOpaqueQualType() != clang_type.GetOpaqueQualType()) 302 GetPossibleMatches (valobj, 303 unqual_clang_ast_type, 304 reason, 305 use_dynamic, 306 entries, 307 did_strip_ptr, 308 did_strip_ref, 309 did_strip_typedef); 310 } while(false); 311 312 313 // if all else fails, go to static type 314 if (valobj.IsDynamic()) 315 { 316 lldb::ValueObjectSP static_value_sp(valobj.GetStaticValue()); 317 if (static_value_sp) 318 GetPossibleMatches(*static_value_sp.get(), 319 static_value_sp->GetClangType(), 320 reason | lldb_private::eFormatterChoiceCriterionWentToStaticValue, 321 use_dynamic, 322 entries, 323 did_strip_ptr, 324 did_strip_ref, 325 did_strip_typedef, 326 true); 327 } 328 } 329 } 330 331 lldb::TypeFormatImplSP 332 FormatManager::GetFormatForType (lldb::TypeNameSpecifierImplSP type_sp) 333 { 334 if (!type_sp) 335 return lldb::TypeFormatImplSP(); 336 lldb::TypeFormatImplSP format_chosen_sp; 337 uint32_t num_categories = m_categories_map.GetCount(); 338 lldb::TypeCategoryImplSP category_sp; 339 uint32_t prio_category = UINT32_MAX; 340 for (uint32_t category_id = 0; 341 category_id < num_categories; 342 category_id++) 343 { 344 category_sp = GetCategoryAtIndex(category_id); 345 if (category_sp->IsEnabled() == false) 346 continue; 347 lldb::TypeFormatImplSP format_current_sp = category_sp->GetFormatForType(type_sp); 348 if (format_current_sp && (format_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition()))) 349 { 350 prio_category = category_sp->GetEnabledPosition(); 351 format_chosen_sp = format_current_sp; 352 } 353 } 354 return format_chosen_sp; 355 } 356 357 lldb::TypeSummaryImplSP 358 FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp) 359 { 360 if (!type_sp) 361 return lldb::TypeSummaryImplSP(); 362 lldb::TypeSummaryImplSP summary_chosen_sp; 363 uint32_t num_categories = m_categories_map.GetCount(); 364 lldb::TypeCategoryImplSP category_sp; 365 uint32_t prio_category = UINT32_MAX; 366 for (uint32_t category_id = 0; 367 category_id < num_categories; 368 category_id++) 369 { 370 category_sp = GetCategoryAtIndex(category_id); 371 if (category_sp->IsEnabled() == false) 372 continue; 373 lldb::TypeSummaryImplSP summary_current_sp = category_sp->GetSummaryForType(type_sp); 374 if (summary_current_sp && (summary_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition()))) 375 { 376 prio_category = category_sp->GetEnabledPosition(); 377 summary_chosen_sp = summary_current_sp; 378 } 379 } 380 return summary_chosen_sp; 381 } 382 383 lldb::TypeFilterImplSP 384 FormatManager::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp) 385 { 386 if (!type_sp) 387 return lldb::TypeFilterImplSP(); 388 lldb::TypeFilterImplSP filter_chosen_sp; 389 uint32_t num_categories = m_categories_map.GetCount(); 390 lldb::TypeCategoryImplSP category_sp; 391 uint32_t prio_category = UINT32_MAX; 392 for (uint32_t category_id = 0; 393 category_id < num_categories; 394 category_id++) 395 { 396 category_sp = GetCategoryAtIndex(category_id); 397 if (category_sp->IsEnabled() == false) 398 continue; 399 lldb::TypeFilterImplSP filter_current_sp((TypeFilterImpl*)category_sp->GetFilterForType(type_sp).get()); 400 if (filter_current_sp && (filter_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition()))) 401 { 402 prio_category = category_sp->GetEnabledPosition(); 403 filter_chosen_sp = filter_current_sp; 404 } 405 } 406 return filter_chosen_sp; 407 } 408 409 #ifndef LLDB_DISABLE_PYTHON 410 lldb::ScriptedSyntheticChildrenSP 411 FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp) 412 { 413 if (!type_sp) 414 return lldb::ScriptedSyntheticChildrenSP(); 415 lldb::ScriptedSyntheticChildrenSP synth_chosen_sp; 416 uint32_t num_categories = m_categories_map.GetCount(); 417 lldb::TypeCategoryImplSP category_sp; 418 uint32_t prio_category = UINT32_MAX; 419 for (uint32_t category_id = 0; 420 category_id < num_categories; 421 category_id++) 422 { 423 category_sp = GetCategoryAtIndex(category_id); 424 if (category_sp->IsEnabled() == false) 425 continue; 426 lldb::ScriptedSyntheticChildrenSP synth_current_sp((ScriptedSyntheticChildren*)category_sp->GetSyntheticForType(type_sp).get()); 427 if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition()))) 428 { 429 prio_category = category_sp->GetEnabledPosition(); 430 synth_chosen_sp = synth_current_sp; 431 } 432 } 433 return synth_chosen_sp; 434 } 435 #endif 436 437 #ifndef LLDB_DISABLE_PYTHON 438 lldb::SyntheticChildrenSP 439 FormatManager::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp) 440 { 441 if (!type_sp) 442 return lldb::SyntheticChildrenSP(); 443 lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp); 444 lldb::ScriptedSyntheticChildrenSP synth_sp = GetSyntheticForType(type_sp); 445 if (filter_sp->GetRevision() > synth_sp->GetRevision()) 446 return lldb::SyntheticChildrenSP(filter_sp.get()); 447 else 448 return lldb::SyntheticChildrenSP(synth_sp.get()); 449 } 450 #endif 451 452 lldb::TypeValidatorImplSP 453 FormatManager::GetValidatorForType (lldb::TypeNameSpecifierImplSP type_sp) 454 { 455 if (!type_sp) 456 return lldb::TypeValidatorImplSP(); 457 lldb::TypeValidatorImplSP validator_chosen_sp; 458 uint32_t num_categories = m_categories_map.GetCount(); 459 lldb::TypeCategoryImplSP category_sp; 460 uint32_t prio_category = UINT32_MAX; 461 for (uint32_t category_id = 0; 462 category_id < num_categories; 463 category_id++) 464 { 465 category_sp = GetCategoryAtIndex(category_id); 466 if (category_sp->IsEnabled() == false) 467 continue; 468 lldb::TypeValidatorImplSP validator_current_sp(category_sp->GetValidatorForType(type_sp).get()); 469 if (validator_current_sp && (validator_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition()))) 470 { 471 prio_category = category_sp->GetEnabledPosition(); 472 validator_chosen_sp = validator_current_sp; 473 } 474 } 475 return validator_chosen_sp; 476 } 477 478 lldb::TypeCategoryImplSP 479 FormatManager::GetCategory (const ConstString& category_name, 480 bool can_create) 481 { 482 if (!category_name) 483 return GetCategory(m_default_category_name); 484 lldb::TypeCategoryImplSP category; 485 if (m_categories_map.Get(category_name, category)) 486 return category; 487 488 if (!can_create) 489 return lldb::TypeCategoryImplSP(); 490 491 m_categories_map.Add(category_name,lldb::TypeCategoryImplSP(new TypeCategoryImpl(this, category_name))); 492 return GetCategory(category_name); 493 } 494 495 lldb::Format 496 FormatManager::GetSingleItemFormat(lldb::Format vector_format) 497 { 498 switch(vector_format) 499 { 500 case eFormatVectorOfChar: 501 return eFormatCharArray; 502 503 case eFormatVectorOfSInt8: 504 case eFormatVectorOfSInt16: 505 case eFormatVectorOfSInt32: 506 case eFormatVectorOfSInt64: 507 return eFormatDecimal; 508 509 case eFormatVectorOfUInt8: 510 case eFormatVectorOfUInt16: 511 case eFormatVectorOfUInt32: 512 case eFormatVectorOfUInt64: 513 case eFormatVectorOfUInt128: 514 return eFormatHex; 515 516 case eFormatVectorOfFloat32: 517 case eFormatVectorOfFloat64: 518 return eFormatFloat; 519 520 default: 521 return lldb::eFormatInvalid; 522 } 523 } 524 525 bool 526 FormatManager::ShouldPrintAsOneLiner (ValueObject& valobj) 527 { 528 // if settings say no oneline whatsoever 529 if (valobj.GetTargetSP().get() && valobj.GetTargetSP()->GetDebugger().GetAutoOneLineSummaries() == false) 530 return false; // then don't oneline 531 532 // if this object has a summary, then ask the summary 533 if (valobj.GetSummaryFormat().get() != nullptr) 534 return valobj.GetSummaryFormat()->IsOneLiner(); 535 536 // no children, no party 537 if (valobj.GetNumChildren() == 0) 538 return false; 539 540 size_t total_children_name_len = 0; 541 542 for (size_t idx = 0; 543 idx < valobj.GetNumChildren(); 544 idx++) 545 { 546 bool is_synth_val = false; 547 ValueObjectSP child_sp(valobj.GetChildAtIndex(idx, true)); 548 // something is wrong here - bail out 549 if (!child_sp) 550 return false; 551 // if we decided to define synthetic children for a type, we probably care enough 552 // to show them, but avoid nesting children in children 553 if (child_sp->GetSyntheticChildren().get() != nullptr) 554 { 555 ValueObjectSP synth_sp(child_sp->GetSyntheticValue()); 556 // wait.. wat? just get out of here.. 557 if (!synth_sp) 558 return false; 559 // but if we only have them to provide a value, keep going 560 if (synth_sp->MightHaveChildren() == false && synth_sp->DoesProvideSyntheticValue()) 561 is_synth_val = true; 562 else 563 return false; 564 } 565 566 total_children_name_len += child_sp->GetName().GetLength(); 567 568 // 50 itself is a "randomly" chosen number - the idea is that 569 // overly long structs should not get this treatment 570 // FIXME: maybe make this a user-tweakable setting? 571 if (total_children_name_len > 50) 572 return false; 573 574 // if a summary is there.. 575 if (child_sp->GetSummaryFormat()) 576 { 577 // and it wants children, then bail out 578 if (child_sp->GetSummaryFormat()->DoesPrintChildren(child_sp.get())) 579 return false; 580 } 581 582 // if this child has children.. 583 if (child_sp->GetNumChildren()) 584 { 585 // ...and no summary... 586 // (if it had a summary and the summary wanted children, we would have bailed out anyway 587 // so this only makes us bail out if this has no summary and we would then print children) 588 if (!child_sp->GetSummaryFormat() && !is_synth_val) // but again only do that if not a synthetic valued child 589 return false; // then bail out 590 } 591 } 592 return true; 593 } 594 595 ConstString 596 FormatManager::GetValidTypeName (const ConstString& type) 597 { 598 return ::GetValidTypeName_Impl(type); 599 } 600 601 ConstString 602 GetTypeForCache (ValueObject& valobj, 603 lldb::DynamicValueType use_dynamic) 604 { 605 if (use_dynamic == lldb::eNoDynamicValues) 606 { 607 if (valobj.IsDynamic()) 608 { 609 if (valobj.GetStaticValue()) 610 return valobj.GetStaticValue()->GetQualifiedTypeName(); 611 else 612 return ConstString(); 613 } 614 else 615 return valobj.GetQualifiedTypeName(); 616 } 617 if (valobj.IsDynamic()) 618 return valobj.GetQualifiedTypeName(); 619 if (valobj.GetDynamicValue(use_dynamic)) 620 return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName(); 621 return ConstString(); 622 } 623 624 lldb::TypeFormatImplSP 625 FormatManager::GetHardcodedFormat (ValueObject& valobj, 626 lldb::DynamicValueType use_dynamic) 627 { 628 for (const auto& candidate: m_hardcoded_formats) 629 { 630 auto result = candidate(valobj,use_dynamic,*this); 631 if (result) 632 return result; 633 } 634 return nullptr; 635 } 636 637 lldb::TypeFormatImplSP 638 FormatManager::GetFormat (ValueObject& valobj, 639 lldb::DynamicValueType use_dynamic) 640 { 641 TypeFormatImplSP retval; 642 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 643 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); 644 if (valobj_type) 645 { 646 if (log) 647 log->Printf("\n\n[FormatManager::GetFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); 648 if (m_format_cache.GetFormat(valobj_type,retval)) 649 { 650 if (log) 651 { 652 log->Printf("[FormatManager::GetFormat] Cache search success. Returning."); 653 if (log->GetDebug()) 654 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 655 } 656 return retval; 657 } 658 if (log) 659 log->Printf("[FormatManager::GetFormat] Cache search failed. Going normal route"); 660 } 661 retval = m_categories_map.GetFormat(valobj, use_dynamic); 662 if (!retval) 663 { 664 if (log) 665 log->Printf("[FormatManager::GetFormat] Search failed. Giving hardcoded a chance."); 666 retval = GetHardcodedFormat(valobj, use_dynamic); 667 } 668 else if (valobj_type) 669 { 670 if (log) 671 log->Printf("[FormatManager::GetFormat] Caching %p for type %s", 672 static_cast<void*>(retval.get()), 673 valobj_type.AsCString("<invalid>")); 674 m_format_cache.SetFormat(valobj_type,retval); 675 } 676 if (log && log->GetDebug()) 677 log->Printf("[FormatManager::GetFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 678 return retval; 679 } 680 681 lldb::TypeSummaryImplSP 682 FormatManager::GetHardcodedSummaryFormat (ValueObject& valobj, 683 lldb::DynamicValueType use_dynamic) 684 { 685 for (const auto& candidate: m_hardcoded_summaries) 686 { 687 auto result = candidate(valobj,use_dynamic,*this); 688 if (result) 689 return result; 690 } 691 return nullptr; 692 } 693 694 lldb::TypeSummaryImplSP 695 FormatManager::GetSummaryFormat (ValueObject& valobj, 696 lldb::DynamicValueType use_dynamic) 697 { 698 TypeSummaryImplSP retval; 699 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 700 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); 701 if (valobj_type) 702 { 703 if (log) 704 log->Printf("\n\n[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); 705 if (m_format_cache.GetSummary(valobj_type,retval)) 706 { 707 if (log) 708 { 709 log->Printf("[FormatManager::GetSummaryFormat] Cache search success. Returning."); 710 if (log->GetDebug()) 711 log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 712 } 713 return retval; 714 } 715 if (log) 716 log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route"); 717 } 718 retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic); 719 if (!retval) 720 { 721 if (log) 722 log->Printf("[FormatManager::GetSummaryFormat] Search failed. Giving hardcoded a chance."); 723 retval = GetHardcodedSummaryFormat(valobj, use_dynamic); 724 } 725 else if (valobj_type) 726 { 727 if (log) 728 log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s", 729 static_cast<void*>(retval.get()), 730 valobj_type.AsCString("<invalid>")); 731 m_format_cache.SetSummary(valobj_type,retval); 732 } 733 if (log && log->GetDebug()) 734 log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 735 return retval; 736 } 737 738 #ifndef LLDB_DISABLE_PYTHON 739 lldb::SyntheticChildrenSP 740 FormatManager::GetHardcodedSyntheticChildren (ValueObject& valobj, 741 lldb::DynamicValueType use_dynamic) 742 { 743 for (const auto& candidate: m_hardcoded_synthetics) 744 { 745 auto result = candidate(valobj,use_dynamic,*this); 746 if (result) 747 return result; 748 } 749 return nullptr; 750 } 751 752 lldb::SyntheticChildrenSP 753 FormatManager::GetSyntheticChildren (ValueObject& valobj, 754 lldb::DynamicValueType use_dynamic) 755 { 756 SyntheticChildrenSP retval; 757 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 758 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); 759 if (valobj_type) 760 { 761 if (log) 762 log->Printf("\n\n[FormatManager::GetSyntheticChildren] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); 763 if (m_format_cache.GetSynthetic(valobj_type,retval)) 764 { 765 if (log) 766 { 767 log->Printf("[FormatManager::GetSyntheticChildren] Cache search success. Returning."); 768 if (log->GetDebug()) 769 log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 770 } 771 return retval; 772 } 773 if (log) 774 log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route"); 775 } 776 retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic); 777 if (!retval) 778 { 779 if (log) 780 log->Printf("[FormatManager::GetSyntheticChildren] Search failed. Giving hardcoded a chance."); 781 retval = GetHardcodedSyntheticChildren(valobj, use_dynamic); 782 } 783 else if (valobj_type) 784 { 785 if (log) 786 log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s", 787 static_cast<void*>(retval.get()), 788 valobj_type.AsCString("<invalid>")); 789 m_format_cache.SetSynthetic(valobj_type,retval); 790 } 791 if (log && log->GetDebug()) 792 log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 793 return retval; 794 } 795 #endif 796 797 lldb::TypeValidatorImplSP 798 FormatManager::GetValidator (ValueObject& valobj, 799 lldb::DynamicValueType use_dynamic) 800 { 801 TypeValidatorImplSP retval; 802 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES)); 803 ConstString valobj_type(GetTypeForCache(valobj, use_dynamic)); 804 if (valobj_type) 805 { 806 if (log) 807 log->Printf("\n\n[FormatManager::GetValidator] Looking into cache for type %s", valobj_type.AsCString("<invalid>")); 808 if (m_format_cache.GetValidator(valobj_type,retval)) 809 { 810 if (log) 811 { 812 log->Printf("[FormatManager::GetValidator] Cache search success. Returning."); 813 if (log->GetDebug()) 814 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 815 } 816 return retval; 817 } 818 if (log) 819 log->Printf("[FormatManager::GetValidator] Cache search failed. Going normal route"); 820 } 821 retval = m_categories_map.GetValidator(valobj, use_dynamic); 822 if (!retval) 823 { 824 if (log) 825 log->Printf("[FormatManager::GetValidator] Search failed. Giving hardcoded a chance."); 826 retval = GetHardcodedValidator(valobj, use_dynamic); 827 } 828 else if (valobj_type) 829 { 830 if (log) 831 log->Printf("[FormatManager::GetValidator] Caching %p for type %s", 832 static_cast<void*>(retval.get()), 833 valobj_type.AsCString("<invalid>")); 834 m_format_cache.SetValidator(valobj_type,retval); 835 } 836 if (log && log->GetDebug()) 837 log->Printf("[FormatManager::GetValidator] Cache hits: %" PRIu64 " - Cache Misses: %" PRIu64, m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses()); 838 return retval; 839 } 840 841 lldb::TypeValidatorImplSP 842 FormatManager::GetHardcodedValidator (ValueObject& valobj, 843 lldb::DynamicValueType use_dynamic) 844 { 845 for (const auto& candidate: m_hardcoded_validators) 846 { 847 auto result = candidate(valobj,use_dynamic,*this); 848 if (result) 849 return result; 850 } 851 return nullptr; 852 } 853 854 FormatManager::FormatManager() : 855 m_format_cache(), 856 m_named_summaries_map(this), 857 m_last_revision(0), 858 m_categories_map(this), 859 m_default_category_name(ConstString("default")), 860 m_system_category_name(ConstString("system")), 861 m_gnu_cpp_category_name(ConstString("gnu-libstdc++")), 862 m_libcxx_category_name(ConstString("libcxx")), 863 m_objc_category_name(ConstString("objc")), 864 m_corefoundation_category_name(ConstString("CoreFoundation")), 865 m_coregraphics_category_name(ConstString("CoreGraphics")), 866 m_coreservices_category_name(ConstString("CoreServices")), 867 m_vectortypes_category_name(ConstString("VectorTypes")), 868 m_appkit_category_name(ConstString("AppKit")), 869 m_coremedia_category_name(ConstString("CoreMedia")), 870 m_hardcoded_formats(), 871 m_hardcoded_summaries(), 872 m_hardcoded_synthetics(), 873 m_hardcoded_validators() 874 875 { 876 LoadSystemFormatters(); 877 LoadLibStdcppFormatters(); 878 LoadLibcxxFormatters(); 879 LoadObjCFormatters(); 880 LoadCoreMediaFormatters(); 881 LoadHardcodedFormatters(); 882 883 EnableCategory(m_objc_category_name,TypeCategoryMap::Last); 884 EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last); 885 EnableCategory(m_appkit_category_name,TypeCategoryMap::Last); 886 EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last); 887 EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last); 888 EnableCategory(m_coremedia_category_name,TypeCategoryMap::Last); 889 EnableCategory(m_gnu_cpp_category_name,TypeCategoryMap::Last); 890 EnableCategory(m_libcxx_category_name,TypeCategoryMap::Last); 891 EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last); 892 EnableCategory(m_system_category_name,TypeCategoryMap::Last); 893 } 894 895 static void 896 AddFormat (TypeCategoryImpl::SharedPointer category_sp, 897 lldb::Format format, 898 ConstString type_name, 899 TypeFormatImpl::Flags flags, 900 bool regex = false) 901 { 902 lldb::TypeFormatImplSP format_sp(new TypeFormatImpl_Format(format, flags)); 903 904 if (regex) 905 category_sp->GetRegexTypeFormatsContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),format_sp); 906 else 907 category_sp->GetTypeFormatsContainer()->Add(type_name, format_sp); 908 } 909 910 911 static void 912 AddStringSummary(TypeCategoryImpl::SharedPointer category_sp, 913 const char* string, 914 ConstString type_name, 915 TypeSummaryImpl::Flags flags, 916 bool regex = false) 917 { 918 lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, 919 string)); 920 921 if (regex) 922 category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); 923 else 924 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 925 } 926 927 static void 928 AddOneLineSummary (TypeCategoryImpl::SharedPointer category_sp, 929 ConstString type_name, 930 TypeSummaryImpl::Flags flags, 931 bool regex = false) 932 { 933 flags.SetShowMembersOneLiner(true); 934 lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags, "")); 935 936 if (regex) 937 category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); 938 else 939 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 940 } 941 942 #ifndef LLDB_DISABLE_PYTHON 943 static void 944 AddCXXSummary (TypeCategoryImpl::SharedPointer category_sp, 945 CXXFunctionSummaryFormat::Callback funct, 946 const char* description, 947 ConstString type_name, 948 TypeSummaryImpl::Flags flags, 949 bool regex = false) 950 { 951 lldb::TypeSummaryImplSP summary_sp(new CXXFunctionSummaryFormat(flags,funct,description)); 952 if (regex) 953 category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())),summary_sp); 954 else 955 category_sp->GetTypeSummariesContainer()->Add(type_name, summary_sp); 956 } 957 #endif 958 959 #ifndef LLDB_DISABLE_PYTHON 960 static void AddCXXSynthetic (TypeCategoryImpl::SharedPointer category_sp, 961 CXXSyntheticChildren::CreateFrontEndCallback generator, 962 const char* description, 963 ConstString type_name, 964 ScriptedSyntheticChildren::Flags flags, 965 bool regex = false) 966 { 967 lldb::SyntheticChildrenSP synth_sp(new CXXSyntheticChildren(flags,description,generator)); 968 if (regex) 969 category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())), synth_sp); 970 else 971 category_sp->GetTypeSyntheticsContainer()->Add(type_name,synth_sp); 972 } 973 #endif 974 975 #ifndef LLDB_DISABLE_PYTHON 976 static void AddFilter (TypeCategoryImpl::SharedPointer category_sp, 977 std::vector<std::string> children, 978 const char* description, 979 ConstString type_name, 980 ScriptedSyntheticChildren::Flags flags, 981 bool regex = false) 982 { 983 TypeFilterImplSP filter_sp(new TypeFilterImpl(flags)); 984 for (auto child : children) 985 filter_sp->AddExpressionPath(child); 986 if (regex) 987 category_sp->GetRegexTypeFiltersContainer()->Add(RegularExpressionSP(new RegularExpression(type_name.AsCString())), filter_sp); 988 else 989 category_sp->GetTypeFiltersContainer()->Add(type_name,filter_sp); 990 } 991 #endif 992 993 void 994 FormatManager::LoadLibStdcppFormatters() 995 { 996 TypeSummaryImpl::Flags stl_summary_flags; 997 stl_summary_flags.SetCascades(true) 998 .SetSkipPointers(false) 999 .SetSkipReferences(false) 1000 .SetDontShowChildren(true) 1001 .SetDontShowValue(true) 1002 .SetShowMembersOneLiner(false) 1003 .SetHideItemNames(false); 1004 1005 lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(stl_summary_flags, 1006 "${var._M_dataplus._M_p}")); 1007 1008 TypeCategoryImpl::SharedPointer gnu_category_sp = GetCategory(m_gnu_cpp_category_name); 1009 1010 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::string"), 1011 std_string_summary_sp); 1012 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char>"), 1013 std_string_summary_sp); 1014 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"), 1015 std_string_summary_sp); 1016 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"), 1017 std_string_summary_sp); 1018 1019 // making sure we force-pick the summary for printing wstring (_M_p is a wchar_t*) 1020 lldb::TypeSummaryImplSP std_wstring_summary_sp(new StringSummaryFormat(stl_summary_flags, 1021 "${var._M_dataplus._M_p%S}")); 1022 1023 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::wstring"), 1024 std_wstring_summary_sp); 1025 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t>"), 1026 std_wstring_summary_sp); 1027 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"), 1028 std_wstring_summary_sp); 1029 gnu_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"), 1030 std_wstring_summary_sp); 1031 1032 1033 #ifndef LLDB_DISABLE_PYTHON 1034 1035 SyntheticChildren::Flags stl_synth_flags; 1036 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); 1037 1038 gnu_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), 1039 SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, 1040 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider"))); 1041 gnu_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), 1042 SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, 1043 "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider"))); 1044 gnu_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")), 1045 SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, 1046 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider"))); 1047 1048 stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true); 1049 gnu_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")), 1050 TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, 1051 "size=${svar%#}"))); 1052 gnu_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")), 1053 TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, 1054 "size=${svar%#}"))); 1055 gnu_category_sp->GetRegexTypeSummariesContainer()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")), 1056 TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, 1057 "size=${svar%#}"))); 1058 1059 AddCXXSynthetic(gnu_category_sp, lldb_private::formatters::LibStdcppVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^__gnu_cxx::__normal_iterator<.+>$"), stl_synth_flags, true); 1060 1061 AddCXXSynthetic(gnu_category_sp, lldb_private::formatters::LibstdcppMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::_Rb_tree_iterator<.+>$"), stl_synth_flags, true); 1062 #endif 1063 } 1064 1065 void 1066 FormatManager::LoadLibcxxFormatters() 1067 { 1068 TypeSummaryImpl::Flags stl_summary_flags; 1069 stl_summary_flags.SetCascades(true) 1070 .SetSkipPointers(false) 1071 .SetSkipReferences(false) 1072 .SetDontShowChildren(true) 1073 .SetDontShowValue(true) 1074 .SetShowMembersOneLiner(false) 1075 .SetHideItemNames(false); 1076 1077 #ifndef LLDB_DISABLE_PYTHON 1078 //std::string code(" lldb.formatters.cpp.libcxx.stdstring_SummaryProvider(valobj,internal_dict)"); 1079 //lldb::TypeSummaryImplSP std_string_summary_sp(new ScriptSummaryFormat(stl_summary_flags, "lldb.formatters.cpp.libcxx.stdstring_SummaryProvider",code.c_str())); 1080 1081 lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, "std::string summary provider")); 1082 lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider")); 1083 1084 TypeCategoryImpl::SharedPointer libcxx_category_sp = GetCategory(m_libcxx_category_name); 1085 1086 libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::string"), 1087 std_string_summary_sp); 1088 libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >"), 1089 std_string_summary_sp); 1090 1091 libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::wstring"), 1092 std_wstring_summary_sp); 1093 libcxx_category_sp->GetTypeSummariesContainer()->Add(ConstString("std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >"), 1094 std_wstring_summary_sp); 1095 1096 SyntheticChildren::Flags stl_synth_flags; 1097 stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); 1098 1099 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdVectorSyntheticFrontEndCreator, "libc++ std::vector synthetic children", ConstString("^std::__1::vector<.+>(( )?&)?$"), stl_synth_flags, true); 1100 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdListSyntheticFrontEndCreator, "libc++ std::list synthetic children", ConstString("^std::__1::list<.+>(( )?&)?$"), stl_synth_flags, true); 1101 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::map synthetic children", ConstString("^std::__1::map<.+> >(( )?&)?$"), stl_synth_flags, true); 1102 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<std::__1::allocator<bool> >"), stl_synth_flags); 1103 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_synth_flags); 1104 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::set synthetic children", ConstString("^std::__1::set<.+> >(( )?&)?$"), stl_synth_flags, true); 1105 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multiset synthetic children", ConstString("^std::__1::multiset<.+> >(( )?&)?$"), stl_synth_flags, true); 1106 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdMapSyntheticFrontEndCreator, "libc++ std::multimap synthetic children", ConstString("^std::__1::multimap<.+> >(( )?&)?$"), stl_synth_flags, true); 1107 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxStdUnorderedMapSyntheticFrontEndCreator, "libc++ std::unordered containers synthetic children", ConstString("^(std::__1::)unordered_(multi)?(map|set)<.+> >$"), stl_synth_flags, true); 1108 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxInitializerListSyntheticFrontEndCreator, "libc++ std::initializer_list synthetic children", ConstString("^std::initializer_list<.+>(( )?&)?$"), stl_synth_flags, true); 1109 1110 libcxx_category_sp->GetRegexTypeSyntheticsContainer()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)deque<.+>(( )?&)?$")), 1111 SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags, 1112 "lldb.formatters.cpp.libcxx.stddeque_SynthProvider"))); 1113 1114 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "shared_ptr synthetic children", ConstString("^(std::__1::)shared_ptr<.+>(( )?&)?$"), stl_synth_flags, true); 1115 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxSharedPtrSyntheticFrontEndCreator, "weak_ptr synthetic children", ConstString("^(std::__1::)weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true); 1116 1117 stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(false); 1118 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibcxxVectorBoolSyntheticFrontEndCreator, "libc++ std::vector<bool> synthetic children", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_synth_flags); 1119 1120 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector summary provider", ConstString("^std::__1::vector<.+>(( )?&)?$"), stl_summary_flags, true); 1121 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::list summary provider", ConstString("^std::__1::list<.+>(( )?&)?$"), stl_summary_flags, true); 1122 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::map summary provider", ConstString("^std::__1::map<.+>(( )?&)?$"), stl_summary_flags, true); 1123 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::deque summary provider", ConstString("^std::__1::deque<.+>(( )?&)?$"), stl_summary_flags, true); 1124 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<std::__1::allocator<bool> >"), stl_summary_flags); 1125 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_summary_flags); 1126 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::set summary provider", ConstString("^std::__1::set<.+>(( )?&)?$"), stl_summary_flags, true); 1127 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multiset summary provider", ConstString("^std::__1::multiset<.+>(( )?&)?$"), stl_summary_flags, true); 1128 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::multimap summary provider", ConstString("^std::__1::multimap<.+>(( )?&)?$"), stl_summary_flags, true); 1129 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::unordered containers summary provider", ConstString("^(std::__1::)unordered_(multi)?(map|set)<.+> >$"), stl_summary_flags, true); 1130 1131 stl_summary_flags.SetSkipPointers(true); 1132 1133 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::shared_ptr summary provider", ConstString("^std::__1::shared_ptr<.+>(( )?&)?$"), stl_summary_flags, true); 1134 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxSmartPointerSummaryProvider, "libc++ std::weak_ptr summary provider", ConstString("^std::__1::weak_ptr<.+>(( )?&)?$"), stl_summary_flags, true); 1135 1136 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibCxxVectorIteratorSyntheticFrontEndCreator, "std::vector iterator synthetic children", ConstString("^std::__1::__wrap_iter<.+>$"), stl_synth_flags, true); 1137 1138 AddCXXSummary(libcxx_category_sp, lldb_private::formatters::LibcxxContainerSummaryProvider, "libc++ std::vector<bool> summary provider", ConstString("std::__1::vector<bool, std::__1::allocator<bool> >"), stl_summary_flags); 1139 AddCXXSynthetic(libcxx_category_sp, lldb_private::formatters::LibCxxMapIteratorSyntheticFrontEndCreator, "std::map iterator synthetic children", ConstString("^std::__1::__map_iterator<.+>$"), stl_synth_flags, true); 1140 1141 AddFilter(libcxx_category_sp, {"__a_"}, "libc++ std::atomic filter", ConstString("^std::__1::atomic<.*>$"), stl_synth_flags, true); 1142 #endif 1143 } 1144 1145 void 1146 FormatManager::LoadSystemFormatters() 1147 { 1148 1149 TypeSummaryImpl::Flags string_flags; 1150 string_flags.SetCascades(true) 1151 .SetSkipPointers(true) 1152 .SetSkipReferences(false) 1153 .SetDontShowChildren(true) 1154 .SetDontShowValue(false) 1155 .SetShowMembersOneLiner(false) 1156 .SetHideItemNames(false); 1157 1158 lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(string_flags, "${var%s}")); 1159 1160 1161 lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false) 1162 .SetSkipPointers(true) 1163 .SetSkipReferences(false) 1164 .SetDontShowChildren(true) 1165 .SetDontShowValue(true) 1166 .SetShowMembersOneLiner(false) 1167 .SetHideItemNames(false), 1168 "${var%s}")); 1169 1170 lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]")); 1171 1172 TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name); 1173 1174 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("char *"), string_format); 1175 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("unsigned char *"), string_format); 1176 sys_category_sp->GetRegexTypeSummariesContainer()->Add(any_size_char_arr, string_array_format); 1177 1178 lldb::TypeSummaryImplSP ostype_summary(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false) 1179 .SetSkipPointers(true) 1180 .SetSkipReferences(true) 1181 .SetDontShowChildren(true) 1182 .SetDontShowValue(false) 1183 .SetShowMembersOneLiner(false) 1184 .SetHideItemNames(false), 1185 "${var%O}")); 1186 1187 sys_category_sp->GetTypeSummariesContainer()->Add(ConstString("OSType"), ostype_summary); 1188 1189 #ifndef LLDB_DISABLE_PYTHON 1190 // FIXME because of a bug in the FormattersContainer we need to add a summary for both X* and const X* (<rdar://problem/12717717>) 1191 AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("char16_t *"), string_flags); 1192 1193 AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("char32_t *"), string_flags); 1194 1195 AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags); 1196 1197 AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags); 1198 1199 TypeSummaryImpl::Flags widechar_flags; 1200 widechar_flags.SetDontShowValue(true) 1201 .SetSkipPointers(true) 1202 .SetSkipReferences(false) 1203 .SetCascades(true) 1204 .SetDontShowChildren(true) 1205 .SetHideItemNames(true) 1206 .SetShowMembersOneLiner(false); 1207 1208 AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags); 1209 AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags); 1210 AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags); 1211 1212 AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags); 1213 1214 TypeFormatImpl::Flags fourchar_flags; 1215 fourchar_flags.SetCascades(true).SetSkipPointers(true).SetSkipReferences(true); 1216 1217 AddFormat(sys_category_sp, lldb::eFormatOSType, ConstString("FourCharCode"), fourchar_flags); 1218 1219 #endif 1220 } 1221 1222 void 1223 FormatManager::LoadObjCFormatters() 1224 { 1225 TypeSummaryImpl::Flags objc_flags; 1226 objc_flags.SetCascades(false) 1227 .SetSkipPointers(true) 1228 .SetSkipReferences(true) 1229 .SetDontShowChildren(true) 1230 .SetDontShowValue(true) 1231 .SetShowMembersOneLiner(false) 1232 .SetHideItemNames(false); 1233 1234 TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name); 1235 TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name); 1236 TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name); 1237 TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name); 1238 TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name); 1239 1240 lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,"")); 1241 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL"), 1242 ObjC_BOOL_summary); 1243 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL &"), 1244 ObjC_BOOL_summary); 1245 objc_category_sp->GetTypeSummariesContainer()->Add(ConstString("BOOL *"), 1246 ObjC_BOOL_summary); 1247 1248 #ifndef LLDB_DISABLE_PYTHON 1249 // we need to skip pointers here since we are special casing a SEL* when retrieving its value 1250 objc_flags.SetSkipPointers(true); 1251 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags); 1252 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags); 1253 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags); 1254 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags); 1255 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("SEL *"), objc_flags); 1256 1257 AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCClassSummaryProvider, "Class summary provider", ConstString("Class"), objc_flags); 1258 1259 SyntheticChildren::Flags class_synth_flags; 1260 class_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false); 1261 1262 AddCXXSynthetic(objc_category_sp, lldb_private::formatters::ObjCClassSyntheticFrontEndCreator, "Class synthetic children", ConstString("Class"), class_synth_flags); 1263 #endif // LLDB_DISABLE_PYTHON 1264 1265 objc_flags.SetSkipPointers(false); 1266 objc_flags.SetCascades(true); 1267 objc_flags.SetSkipReferences(false); 1268 1269 AddStringSummary (objc_category_sp, 1270 "${var.__FuncPtr%A}", 1271 ConstString("__block_literal_generic"), 1272 objc_flags); 1273 1274 AddStringSummary(corefoundation_category_sp, 1275 "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds", 1276 ConstString("CFGregorianUnits"), 1277 objc_flags); 1278 AddStringSummary(corefoundation_category_sp, 1279 "location=${var.location} length=${var.length}", 1280 ConstString("CFRange"), 1281 objc_flags); 1282 1283 AddStringSummary(appkit_category_sp, 1284 "location=${var.location}, length=${var.length}", 1285 ConstString("NSRange"), 1286 objc_flags); 1287 AddStringSummary(appkit_category_sp, 1288 "(${var.origin}, ${var.size}), ...", 1289 ConstString("NSRectArray"), 1290 objc_flags); 1291 1292 AddOneLineSummary (appkit_category_sp, 1293 ConstString("NSPoint"), 1294 objc_flags); 1295 AddOneLineSummary (appkit_category_sp, 1296 ConstString("NSSize"), 1297 objc_flags); 1298 AddOneLineSummary (appkit_category_sp, 1299 ConstString("NSRect"), 1300 objc_flags); 1301 1302 AddOneLineSummary (coregraphics_category_sp, 1303 ConstString("CGSize"), 1304 objc_flags); 1305 AddOneLineSummary (coregraphics_category_sp, 1306 ConstString("CGPoint"), 1307 objc_flags); 1308 AddOneLineSummary (coregraphics_category_sp, 1309 ConstString("CGRect"), 1310 objc_flags); 1311 1312 AddStringSummary(coreservices_category_sp, 1313 "red=${var.red} green=${var.green} blue=${var.blue}", 1314 ConstString("RGBColor"), 1315 objc_flags); 1316 AddStringSummary(coreservices_category_sp, 1317 "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})", 1318 ConstString("Rect"), 1319 objc_flags); 1320 AddStringSummary(coreservices_category_sp, 1321 "(v=${var.v}, h=${var.h})", 1322 ConstString("Point"), 1323 objc_flags); 1324 AddStringSummary(coreservices_category_sp, 1325 "${var.month}/${var.day}/${var.year} ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}", 1326 ConstString("DateTimeRect *"), 1327 objc_flags); 1328 AddStringSummary(coreservices_category_sp, 1329 "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}", 1330 ConstString("LongDateRect"), 1331 objc_flags); 1332 AddStringSummary(coreservices_category_sp, 1333 "(x=${var.x}, y=${var.y})", 1334 ConstString("HIPoint"), 1335 objc_flags); 1336 AddStringSummary(coreservices_category_sp, 1337 "origin=${var.origin} size=${var.size}", 1338 ConstString("HIRect"), 1339 objc_flags); 1340 1341 TypeSummaryImpl::Flags appkit_flags; 1342 appkit_flags.SetCascades(true) 1343 .SetSkipPointers(false) 1344 .SetSkipReferences(false) 1345 .SetDontShowChildren(true) 1346 .SetDontShowValue(false) 1347 .SetShowMembersOneLiner(false) 1348 .SetHideItemNames(false); 1349 1350 appkit_flags.SetDontShowChildren(false); 1351 1352 1353 #ifndef LLDB_DISABLE_PYTHON 1354 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags); 1355 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags); 1356 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags); 1357 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags); 1358 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags); 1359 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags); 1360 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags); 1361 1362 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags); 1363 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags); 1364 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags); 1365 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags); 1366 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags); 1367 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags); 1368 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags); 1369 1370 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSSet summary", ConstString("NSSet"), appkit_flags); 1371 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); 1372 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFSetRef summary", ConstString("CFSetRef"), appkit_flags); 1373 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<true>, "CFMutableSetRef summary", ConstString("CFMutableSetRef"), appkit_flags); 1374 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSCFSet summary", ConstString("__NSCFSet"), appkit_flags); 1375 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetI summary", ConstString("__NSSetI"), appkit_flags); 1376 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSSetM summary", ConstString("__NSSetM"), appkit_flags); 1377 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSCountedSet summary", ConstString("NSCountedSet"), appkit_flags); 1378 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSMutableSet summary", ConstString("NSMutableSet"), appkit_flags); 1379 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "NSOrderedSet summary", ConstString("NSOrderedSet"), appkit_flags); 1380 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetI summary", ConstString("__NSOrderedSetI"), appkit_flags); 1381 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSSetSummaryProvider<false>, "__NSOrderedSetM summary", ConstString("__NSOrderedSetM"), appkit_flags); 1382 1383 // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags); 1384 1385 appkit_flags.SetDontShowChildren(true); 1386 1387 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags()); 1388 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags()); 1389 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags()); 1390 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags()); 1391 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags()); 1392 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFMutableArrayRef"), ScriptedSyntheticChildren::Flags()); 1393 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("CFArrayRef"), ScriptedSyntheticChildren::Flags()); 1394 1395 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags()); 1396 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags()); 1397 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSCFDictionary"), ScriptedSyntheticChildren::Flags()); 1398 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags()); 1399 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags()); 1400 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags()); 1401 AddCXXSynthetic(corefoundation_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags()); 1402 1403 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSSet synthetic children", ConstString("NSSet"), ScriptedSyntheticChildren::Flags()); 1404 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetI synthetic children", ConstString("__NSSetI"), ScriptedSyntheticChildren::Flags()); 1405 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSSetM synthetic children", ConstString("__NSSetM"), ScriptedSyntheticChildren::Flags()); 1406 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSMutableSet synthetic children", ConstString("NSMutableSet"), ScriptedSyntheticChildren::Flags()); 1407 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "NSOrderedSet synthetic children", ConstString("NSOrderedSet"), ScriptedSyntheticChildren::Flags()); 1408 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetI synthetic children", ConstString("__NSOrderedSetI"), ScriptedSyntheticChildren::Flags()); 1409 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSSetSyntheticFrontEndCreator, "__NSOrderedSetM synthetic children", ConstString("__NSOrderedSetM"), ScriptedSyntheticChildren::Flags()); 1410 1411 AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSIndexPathSyntheticFrontEndCreator, "NSIndexPath synthetic children", ConstString("NSIndexPath"), ScriptedSyntheticChildren::Flags()); 1412 1413 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFBagRef"), appkit_flags); 1414 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("__CFBag"), appkit_flags); 1415 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("const struct __CFBag"), appkit_flags); 1416 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBagSummaryProvider, "CFBag summary provider", ConstString("CFMutableBagRef"), appkit_flags); 1417 1418 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("CFBinaryHeapRef"), appkit_flags); 1419 AddCXXSummary(corefoundation_category_sp,lldb_private::formatters::CFBinaryHeapSummaryProvider, "CFBinaryHeap summary provider", ConstString("__CFBinaryHeap"), appkit_flags); 1420 1421 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags); 1422 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags); 1423 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__CFString"), appkit_flags); 1424 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags); 1425 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSMutableString"), appkit_flags); 1426 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags); 1427 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags); 1428 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags); 1429 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags); 1430 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags); 1431 1432 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSAttributedStringSummaryProvider, "NSAttributedString summary provider", ConstString("NSAttributedString"), appkit_flags); 1433 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSMutableAttributedString"), appkit_flags); 1434 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMutableAttributedStringSummaryProvider, "NSMutableAttributedString summary provider", ConstString("NSConcreteMutableAttributedString"), appkit_flags); 1435 1436 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSBundleSummaryProvider, "NSBundle summary provider", ConstString("NSBundle"), appkit_flags); 1437 1438 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags); 1439 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags); 1440 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags); 1441 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSMutableData"), appkit_flags); 1442 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags); 1443 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags); 1444 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags); 1445 1446 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSMachPortSummaryProvider, "NSMachPort summary provider", ConstString("NSMachPort"), appkit_flags); 1447 1448 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSNotification"), appkit_flags); 1449 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNotificationSummaryProvider, "NSNotification summary provider", ConstString("NSConcreteNotification"), appkit_flags); 1450 1451 AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags); 1452 AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags); 1453 1454 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags); 1455 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "CFNumberRef summary provider", ConstString("CFNumberRef"), appkit_flags); 1456 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags); 1457 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags); 1458 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags); 1459 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags); 1460 1461 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags); 1462 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags); 1463 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags); 1464 AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags); 1465 1466 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("NSURL"), appkit_flags); 1467 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSURLSummaryProvider, "NSURL summary provider", ConstString("CFURLRef"), appkit_flags); 1468 1469 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSDate"), appkit_flags); 1470 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSDate"), appkit_flags); 1471 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("__NSTaggedDate"), appkit_flags); 1472 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDateSummaryProvider, "NSDate summary provider", ConstString("NSCalendarDate"), appkit_flags); 1473 1474 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("NSTimeZone"), appkit_flags); 1475 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("CFTimeZoneRef"), appkit_flags); 1476 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSTimeZoneSummaryProvider, "NSTimeZone summary provider", ConstString("__NSTimeZone"), appkit_flags); 1477 1478 // CFAbsoluteTime is actually a double rather than a pointer to an object 1479 // we do not care about the numeric value, since it is probably meaningless to users 1480 appkit_flags.SetDontShowValue(true); 1481 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFAbsoluteTimeSummaryProvider, "CFAbsoluteTime summary provider", ConstString("CFAbsoluteTime"), appkit_flags); 1482 appkit_flags.SetDontShowValue(false); 1483 1484 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSIndexSet"), appkit_flags); 1485 AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSIndexSetSummaryProvider, "NSIndexSet summary provider", ConstString("NSMutableIndexSet"), appkit_flags); 1486 1487 AddStringSummary(corefoundation_category_sp, 1488 "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"", 1489 ConstString("CFGregorianDate"), 1490 appkit_flags); 1491 1492 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFBitVectorRef"), appkit_flags); 1493 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("CFMutableBitVectorRef"), appkit_flags); 1494 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFBitVector"), appkit_flags); 1495 AddCXXSummary(corefoundation_category_sp, lldb_private::formatters::CFBitVectorSummaryProvider, "CFBitVector summary provider", ConstString("__CFMutableBitVector"), appkit_flags); 1496 #endif // LLDB_DISABLE_PYTHON 1497 1498 TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name); 1499 1500 TypeSummaryImpl::Flags vector_flags; 1501 vector_flags.SetCascades(true) 1502 .SetSkipPointers(true) 1503 .SetSkipReferences(false) 1504 .SetDontShowChildren(true) 1505 .SetDontShowValue(false) 1506 .SetShowMembersOneLiner(true) 1507 .SetHideItemNames(true); 1508 1509 AddStringSummary(vectors_category_sp, 1510 "${var.uint128}", 1511 ConstString("builtin_type_vec128"), 1512 objc_flags); 1513 1514 AddStringSummary(vectors_category_sp, 1515 "", 1516 ConstString("float [4]"), 1517 vector_flags); 1518 AddStringSummary(vectors_category_sp, 1519 "", 1520 ConstString("int32_t [4]"), 1521 vector_flags); 1522 AddStringSummary(vectors_category_sp, 1523 "", 1524 ConstString("int16_t [8]"), 1525 vector_flags); 1526 AddStringSummary(vectors_category_sp, 1527 "", 1528 ConstString("vDouble"), 1529 vector_flags); 1530 AddStringSummary(vectors_category_sp, 1531 "", 1532 ConstString("vFloat"), 1533 vector_flags); 1534 AddStringSummary(vectors_category_sp, 1535 "", 1536 ConstString("vSInt8"), 1537 vector_flags); 1538 AddStringSummary(vectors_category_sp, 1539 "", 1540 ConstString("vSInt16"), 1541 vector_flags); 1542 AddStringSummary(vectors_category_sp, 1543 "", 1544 ConstString("vSInt32"), 1545 vector_flags); 1546 AddStringSummary(vectors_category_sp, 1547 "", 1548 ConstString("vUInt16"), 1549 vector_flags); 1550 AddStringSummary(vectors_category_sp, 1551 "", 1552 ConstString("vUInt8"), 1553 vector_flags); 1554 AddStringSummary(vectors_category_sp, 1555 "", 1556 ConstString("vUInt16"), 1557 vector_flags); 1558 AddStringSummary(vectors_category_sp, 1559 "", 1560 ConstString("vUInt32"), 1561 vector_flags); 1562 AddStringSummary(vectors_category_sp, 1563 "", 1564 ConstString("vBool32"), 1565 vector_flags); 1566 } 1567 1568 void 1569 FormatManager::LoadCoreMediaFormatters() 1570 { 1571 TypeSummaryImpl::Flags cm_flags; 1572 cm_flags.SetCascades(true) 1573 .SetDontShowChildren(false) 1574 .SetDontShowValue(false) 1575 .SetHideItemNames(false) 1576 .SetShowMembersOneLiner(false) 1577 .SetSkipPointers(false) 1578 .SetSkipReferences(false); 1579 1580 TypeCategoryImpl::SharedPointer cm_category_sp = GetCategory(m_coremedia_category_name); 1581 1582 #ifndef LLDB_DISABLE_PYTHON 1583 AddCXXSummary(cm_category_sp, lldb_private::formatters::CMTimeSummaryProvider, "CMTime summary provider", ConstString("CMTime"), cm_flags); 1584 #endif // LLDB_DISABLE_PYTHON 1585 } 1586 1587 void 1588 FormatManager::LoadHardcodedFormatters() 1589 { 1590 { 1591 // insert code to load formats here 1592 } 1593 { 1594 // insert code to load summaries here 1595 m_hardcoded_summaries.push_back( 1596 [](lldb_private::ValueObject& valobj, 1597 lldb::DynamicValueType, 1598 FormatManager&) -> TypeSummaryImpl::SharedPointer { 1599 static CXXFunctionSummaryFormat::SharedPointer formatter_sp(new CXXFunctionSummaryFormat(TypeSummaryImpl::Flags(), lldb_private::formatters::FunctionPointerSummaryProvider, "Function pointer summary provider")); 1600 if (valobj.GetClangType().IsFunctionPointerType()) 1601 { 1602 return formatter_sp; 1603 } 1604 return nullptr; 1605 }); 1606 } 1607 { 1608 // insert code to load synthetics here 1609 } 1610 { 1611 // insert code to load validators here 1612 } 1613 } 1614