diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2020-01-17 20:45:01 +0000 |
commit | 706b4fc47bbc608932d3b491ae19a3b9cde9497b (patch) | |
tree | 4adf86a776049cbf7f69a1929c4babcbbef925eb /lldb/source/Plugins/Language | |
parent | 7cc9cf2bf09f069cb2dd947ead05d0b54301fb71 (diff) |
Notes
Diffstat (limited to 'lldb/source/Plugins/Language')
13 files changed, 207 insertions, 141 deletions
diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 489fa7d0ad91..4385a60f5862 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -19,6 +19,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Demangle/ItaniumDemangle.h" +#include "lldb/Core/Mangled.h" #include "lldb/Core/PluginManager.h" #include "lldb/Core/UniqueCStringMap.h" #include "lldb/DataFormatters/CXXFunctionPointer.h" @@ -238,18 +239,16 @@ std::string CPlusPlusLanguage::MethodName::GetScopeQualifiedName() { return res; } -bool CPlusPlusLanguage::IsCPPMangledName(const char *name) { +bool CPlusPlusLanguage::IsCPPMangledName(llvm::StringRef name) { // FIXME!! we should really run through all the known C++ Language plugins // and ask each one if this is a C++ mangled name - if (name == nullptr) - return false; + Mangled::ManglingScheme scheme = Mangled::GetManglingScheme(name); - // MSVC style mangling - if (name[0] == '?') - return true; + if (scheme == Mangled::eManglingSchemeNone) + return false; - return (name[0] != '\0' && name[0] == '_' && name[1] == 'Z'); + return true; } bool CPlusPlusLanguage::ExtractContextAndIdentifier( @@ -285,46 +284,34 @@ public: } }; -/// Given a mangled function `Mangled`, replace all the primitive function type -/// arguments of `Search` with type `Replace`. -class TypeSubstitutor - : public llvm::itanium_demangle::AbstractManglingParser<TypeSubstitutor, +template <typename Derived> +class ManglingSubstitutor + : public llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator> { - /// Input character until which we have constructed the respective output - /// already - const char *Written; + using Base = + llvm::itanium_demangle::AbstractManglingParser<Derived, NodeAllocator>; - llvm::StringRef Search; - llvm::StringRef Replace; - llvm::SmallString<128> Result; +public: + ManglingSubstitutor() : Base(nullptr, nullptr) {} - /// Whether we have performed any substitutions. - bool Substituted; + template<typename... Ts> + ConstString substitute(llvm::StringRef Mangled, Ts &&... Vals) { + this->getDerived().reset(Mangled, std::forward<Ts>(Vals)...); + return substituteImpl(Mangled); + } - void reset(llvm::StringRef Mangled, llvm::StringRef Search, - llvm::StringRef Replace) { - AbstractManglingParser::reset(Mangled.begin(), Mangled.end()); + +protected: + void reset(llvm::StringRef Mangled) { + Base::reset(Mangled.begin(), Mangled.end()); Written = Mangled.begin(); - this->Search = Search; - this->Replace = Replace; Result.clear(); Substituted = false; } - void appendUnchangedInput() { - Result += llvm::StringRef(Written, First - Written); - Written = First; - } - -public: - TypeSubstitutor() : AbstractManglingParser(nullptr, nullptr) {} - - ConstString substitute(llvm::StringRef Mangled, llvm::StringRef From, - llvm::StringRef To) { + ConstString substituteImpl(llvm::StringRef Mangled) { Log *log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_LANGUAGE); - - reset(Mangled, From, To); - if (parse() == nullptr) { + if (this->parse() == nullptr) { LLDB_LOG(log, "Failed to substitute mangling in {0}", Mangled); return ConstString(); } @@ -337,20 +324,69 @@ public: return ConstString(Result); } + void trySubstitute(llvm::StringRef From, llvm::StringRef To) { + if (!llvm::StringRef(currentParserPos(), this->numLeft()).startswith(From)) + return; + + // We found a match. Append unmodified input up to this point. + appendUnchangedInput(); + + // And then perform the replacement. + Result += To; + Written += From.size(); + Substituted = true; + } + +private: + /// Input character until which we have constructed the respective output + /// already. + const char *Written; + + llvm::SmallString<128> Result; + + /// Whether we have performed any substitutions. + bool Substituted; + + const char *currentParserPos() const { return this->First; } + + void appendUnchangedInput() { + Result += + llvm::StringRef(Written, std::distance(Written, currentParserPos())); + Written = currentParserPos(); + } + +}; + +/// Given a mangled function `Mangled`, replace all the primitive function type +/// arguments of `Search` with type `Replace`. +class TypeSubstitutor : public ManglingSubstitutor<TypeSubstitutor> { + llvm::StringRef Search; + llvm::StringRef Replace; + +public: + void reset(llvm::StringRef Mangled, llvm::StringRef Search, + llvm::StringRef Replace) { + ManglingSubstitutor::reset(Mangled); + this->Search = Search; + this->Replace = Replace; + } + llvm::itanium_demangle::Node *parseType() { - if (llvm::StringRef(First, numLeft()).startswith(Search)) { - // We found a match. Append unmodified input up to this point. - appendUnchangedInput(); - - // And then perform the replacement. - Result += Replace; - Written += Search.size(); - Substituted = true; - } - return AbstractManglingParser::parseType(); + trySubstitute(Search, Replace); + return ManglingSubstitutor::parseType(); } }; -} + +class CtorDtorSubstitutor : public ManglingSubstitutor<CtorDtorSubstitutor> { +public: + llvm::itanium_demangle::Node * + parseCtorDtorName(llvm::itanium_demangle::Node *&SoFar, NameState *State) { + trySubstitute("C1", "C2"); + trySubstitute("D1", "D2"); + return ManglingSubstitutor::parseCtorDtorName(SoFar, State); + } +}; +} // namespace uint32_t CPlusPlusLanguage::FindAlternateFunctionManglings( const ConstString mangled_name, std::set<ConstString> &alternates) { @@ -398,6 +434,10 @@ uint32_t CPlusPlusLanguage::FindAlternateFunctionManglings( TS.substitute(mangled_name.GetStringRef(), "y", "m")) alternates.insert(ulong_fixup); + if (ConstString ctor_fixup = + CtorDtorSubstitutor().substitute(mangled_name.GetStringRef())) + alternates.insert(ctor_fixup); + return alternates.size() - start_size; } @@ -426,6 +466,13 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { "std::__[[:alnum:]]+::char_traits<char>, " "std::__[[:alnum:]]+::allocator<char> >$"), stl_summary_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxStringSummaryProviderASCII, + "std::string summary provider", + ConstString("^std::__[[:alnum:]]+::basic_string<unsigned char, " + "std::__[[:alnum:]]+::char_traits<unsigned char>, " + "std::__[[:alnum:]]+::allocator<unsigned char> >$"), + stl_summary_flags, true); AddCXXSummary(cpp_category_sp, lldb_private::formatters::LibcxxStringSummaryProviderUTF16, @@ -568,6 +615,11 @@ static void LoadLibCxxFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { "weak_ptr synthetic children", ConstString("^(std::__[[:alnum:]]+::)weak_ptr<.+>(( )?&)?$"), stl_synth_flags, true); + AddCXXSummary(cpp_category_sp, + lldb_private::formatters::LibcxxFunctionSummaryProvider, + "libc++ std::function summary provider", + ConstString("^std::__[[:alnum:]]+::function<.+>$"), + stl_summary_flags, true); stl_summary_flags.SetDontShowChildren(false); stl_summary_flags.SetSkipPointers(false); @@ -719,6 +771,10 @@ static void LoadLibStdcppFormatters(lldb::TypeCategoryImplSP cpp_category_sp) { ConstString("std::__cxx11::basic_string<char, std::char_traits<char>, " "std::allocator<char> >"), cxx11_string_summary_sp); + cpp_category_sp->GetTypeSummariesContainer()->Add( + ConstString("std::__cxx11::basic_string<unsigned char, std::char_traits<unsigned char>, " + "std::allocator<unsigned char> >"), + cxx11_string_summary_sp); // making sure we force-pick the summary for printing wstring (_M_p is a // wchar_t*) diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h index d30e56080732..4ed45bc904ce 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h @@ -101,7 +101,7 @@ public: static lldb_private::ConstString GetPluginNameStatic(); - static bool IsCPPMangledName(const char *name); + static bool IsCPPMangledName(llvm::StringRef name); // Extract C++ context and identifier from a string using heuristic matching // (as opposed to diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp index abe89035c532..ecadaef7a87e 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxx.cpp @@ -572,10 +572,13 @@ bool lldb_private::formatters::LibcxxWStringSummaryProvider( location_sp->GetPointeeData(extractor, 0, size); // std::wstring::size() is measured in 'characters', not bytes - auto wchar_t_size = valobj.GetTargetSP() - ->GetScratchClangASTContext() - ->GetBasicType(lldb::eBasicTypeWChar) - .GetByteSize(nullptr); + ClangASTContext *ast_context = + ClangASTContext::GetScratch(*valobj.GetTargetSP()); + if (!ast_context) + return false; + + auto wchar_t_size = + ast_context->GetBasicType(lldb::eBasicTypeWChar).GetByteSize(nullptr); if (!wchar_t_size) return false; diff --git a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp index 619c718a1c1b..f6d8d4d9a7eb 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/LibCxxMap.cpp @@ -94,6 +94,8 @@ public: MapIterator(ValueObject *entry, size_t depth = 0) : m_entry(entry), m_max_depth(depth), m_error(false) {} + MapIterator &operator=(const MapIterator &) = default; + ValueObjectSP value() { return m_entry.GetEntry(); } ValueObjectSP advance(size_t count) { diff --git a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp b/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp index a9a1b44731f2..3e77b1646739 100644 --- a/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp +++ b/lldb/source/Plugins/Language/ClangCommon/ClangHighlighter.cpp @@ -139,6 +139,22 @@ void ClangHighlighter::Highlight(const HighlightStyle &options, FileManager file_mgr(file_opts, FileSystem::Instance().GetVirtualFileSystem()); + // The line might end in a backslash which would cause Clang to drop the + // backslash and the terminating new line. This makes sense when parsing C++, + // but when highlighting we care about preserving the backslash/newline. To + // not lose this information we remove the new line here so that Clang knows + // this is just a single line we are highlighting. We add back the newline + // after tokenizing. + llvm::StringRef line_ending = ""; + // There are a few legal line endings Clang recognizes and we need to + // temporarily remove from the string. + if (line.consume_back("\r\n")) + line_ending = "\r\n"; + else if (line.consume_back("\n")) + line_ending = "\n"; + else if (line.consume_back("\r")) + line_ending = "\r"; + unsigned line_number = previous_lines.count('\n') + 1U; // Let's build the actual source code Clang needs and setup some utility @@ -227,6 +243,9 @@ void ClangHighlighter::Highlight(const HighlightStyle &options, color.Apply(result, to_print); } + // Add the line ending we trimmed before tokenizing. + result << line_ending; + // If we went over the whole file but couldn't find our own file, then // somehow our setup was wrong. When we're in release mode we just give the // user the normal line and pretend we don't know how to highlight it. In diff --git a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp index ddf3953bb512..8a81abbaedbe 100644 --- a/lldb/source/Plugins/Language/ObjC/Cocoa.cpp +++ b/lldb/source/Plugins/Language/ObjC/Cocoa.cpp @@ -694,32 +694,44 @@ bool lldb_private::formatters::NSURLSummaryProvider( CompilerType type(valobj.GetCompilerType()); ValueObjectSP text(valobj.GetSyntheticChildAtOffset(offset_text, type, true)); ValueObjectSP base(valobj.GetSyntheticChildAtOffset(offset_base, type, true)); - if (!text) - return false; - if (text->GetValueAsUnsigned(0) == 0) + if (!text || text->GetValueAsUnsigned(0) == 0) return false; + + StreamString base_summary; + if (base && base->GetValueAsUnsigned(0)) { + if (!NSURLSummaryProvider(*base, base_summary, options)) + base_summary.Clear(); + } + if (base_summary.Empty()) + return NSStringSummaryProvider(*text, stream, options); + StreamString summary; - if (!NSStringSummaryProvider(*text, summary, options)) + if (!NSStringSummaryProvider(*text, summary, options) || summary.Empty()) return false; - if (base && base->GetValueAsUnsigned(0)) { - std::string summary_str = summary.GetString(); - - if (!summary_str.empty()) - summary_str.pop_back(); - summary_str += " -- "; - StreamString base_summary; - if (NSURLSummaryProvider(*base, base_summary, options) && - !base_summary.Empty()) { - llvm::StringRef base_str = base_summary.GetString(); - if (base_str.size() > 2) - base_str = base_str.drop_front(2); - summary_str += base_str; + + const char quote_char = '"'; + std::string prefix, suffix; + if (Language *language = Language::FindPlugin(options.GetLanguage())) { + if (!language->GetFormatterPrefixSuffix(*text, ConstString("NSString"), + prefix, suffix)) { + prefix.clear(); + suffix.clear(); } - summary.Clear(); - summary.PutCString(summary_str); } - if (!summary.Empty()) { - stream.PutCString(summary.GetString()); + // @"A" -> @"A + llvm::StringRef summary_str = summary.GetString(); + bool back_consumed = summary_str.consume_back(quote_char + suffix); + assert(back_consumed); + UNUSED_IF_ASSERT_DISABLED(back_consumed); + // @"B" -> B" + llvm::StringRef base_summary_str = base_summary.GetString(); + bool front_consumed = base_summary_str.consume_front(prefix + quote_char); + assert(front_consumed); + UNUSED_IF_ASSERT_DISABLED(front_consumed); + // @"A -- B" + if (!summary_str.empty() && !base_summary_str.empty()) { + stream.Printf("%s -- %s", summary_str.str().c_str(), + base_summary_str.str().c_str()); return true; } diff --git a/lldb/source/Plugins/Language/ObjC/NSArray.cpp b/lldb/source/Plugins/Language/ObjC/NSArray.cpp index 7219c016dfd1..73335aff2fd7 100644 --- a/lldb/source/Plugins/Language/ObjC/NSArray.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSArray.cpp @@ -96,31 +96,6 @@ private: D64 *m_data_64; }; -namespace Foundation109 { - struct DataDescriptor_32 { - uint32_t _used; - uint32_t _priv1 : 2; - uint32_t _size : 30; - uint32_t _priv2 : 2; - uint32_t _offset : 30; - uint32_t _priv3; - uint32_t _data; - }; - - struct DataDescriptor_64 { - uint64_t _used; - uint64_t _priv1 : 2; - uint64_t _size : 62; - uint64_t _priv2 : 2; - uint64_t _offset : 62; - uint32_t _priv3; - uint64_t _data; - }; - - using NSArrayMSyntheticFrontEnd = - GenericNSArrayMSyntheticFrontEnd<DataDescriptor_32, DataDescriptor_64>; -} - namespace Foundation1010 { struct DataDescriptor_32 { uint32_t _used; @@ -461,13 +436,12 @@ lldb_private::formatters::NSArrayMSyntheticFrontEndBase::NSArrayMSyntheticFrontE : SyntheticChildrenFrontEnd(*valobj_sp), m_exe_ctx_ref(), m_ptr_size(8), m_id_type() { if (valobj_sp) { - auto *clang_ast_context = valobj_sp->GetExecutionContextRef() - .GetTargetSP() - ->GetScratchClangASTContext(); + auto *clang_ast_context = ClangASTContext::GetScratch( + *valobj_sp->GetExecutionContextRef().GetTargetSP()); if (clang_ast_context) m_id_type = CompilerType( clang_ast_context, - clang_ast_context->getASTContext()->ObjCBuiltinIdTy.getAsOpaquePtr()); + clang_ast_context->getASTContext().ObjCBuiltinIdTy.getAsOpaquePtr()); if (valobj_sp->GetProcessSP()) m_ptr_size = valobj_sp->GetProcessSP()->GetAddressByteSize(); } @@ -610,13 +584,11 @@ lldb_private::formatters::GenericNSArrayISyntheticFrontEnd<D32, D64, Inline>:: if (valobj_sp) { CompilerType type = valobj_sp->GetCompilerType(); if (type) { - auto *clang_ast_context = valobj_sp->GetExecutionContextRef() - .GetTargetSP() - ->GetScratchClangASTContext(); + auto *clang_ast_context = ClangASTContext::GetScratch( + *valobj_sp->GetExecutionContextRef().GetTargetSP()); if (clang_ast_context) - m_id_type = CompilerType(clang_ast_context, - clang_ast_context->getASTContext() - ->ObjCBuiltinIdTy.getAsOpaquePtr()); + m_id_type = clang_ast_context->GetType( + clang_ast_context->getASTContext().ObjCBuiltinIdTy); } } } @@ -780,11 +752,15 @@ lldb_private::formatters::NSArray1SyntheticFrontEnd::GetChildAtIndex( static const ConstString g_zero("[0]"); if (idx == 0) { - CompilerType id_type( - m_backend.GetTargetSP()->GetScratchClangASTContext()->GetBasicType( - lldb::eBasicTypeObjCID)); - return m_backend.GetSyntheticChildAtOffset( - m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true, g_zero); + auto *clang_ast_context = + ClangASTContext::GetScratch(*m_backend.GetTargetSP()); + if (clang_ast_context) { + CompilerType id_type( + clang_ast_context->GetBasicType(lldb::eBasicTypeObjCID)); + return m_backend.GetSyntheticChildAtOffset( + m_backend.GetProcessSP()->GetAddressByteSize(), id_type, true, + g_zero); + } } return lldb::ValueObjectSP(); } @@ -857,8 +833,6 @@ lldb_private::formatters::NSArraySyntheticFrontEndCreator( return (new Foundation1428::NSArrayMSyntheticFrontEnd(valobj_sp)); if (runtime->GetFoundationVersion() >= 1100) return (new Foundation1010::NSArrayMSyntheticFrontEnd(valobj_sp)); - else - return (new Foundation109::NSArrayMSyntheticFrontEnd(valobj_sp)); } else if (class_name == g_NSCallStackArray) { return (new CallStackArray::NSCallStackArraySyntheticFrontEnd(valobj_sp)); } else { diff --git a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp index 10f66c4a37f8..ae00674c49f3 100644 --- a/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSDictionary.cpp @@ -65,7 +65,7 @@ NSDictionary_Additionals::GetAdditionalSynthetics() { static CompilerType GetLLDBNSPairType(TargetSP target_sp) { CompilerType compiler_type; - ClangASTContext *target_ast_context = target_sp->GetScratchClangASTContext(); + ClangASTContext *target_ast_context = ClangASTContext::GetScratch(*target_sp); if (target_ast_context) { ConstString g___lldb_autogen_nspair("__lldb_autogen_nspair"); diff --git a/lldb/source/Plugins/Language/ObjC/NSError.cpp b/lldb/source/Plugins/Language/ObjC/NSError.cpp index 97df3be72c84..94a97c8ad039 100644 --- a/lldb/source/Plugins/Language/ObjC/NSError.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSError.cpp @@ -86,10 +86,10 @@ bool lldb_private::formatters::NSError_SummaryProvider( ValueObjectSP domain_str_sp = ValueObject::CreateValueObjectFromData( "domain_str", isw.GetAsData(process_sp->GetByteOrder()), - valobj.GetExecutionContextRef(), process_sp->GetTarget() - .GetScratchClangASTContext() - ->GetBasicType(lldb::eBasicTypeVoid) - .GetPointerType()); + valobj.GetExecutionContextRef(), + ClangASTContext::GetScratch(process_sp->GetTarget()) + ->GetBasicType(lldb::eBasicTypeVoid) + .GetPointerType()); if (!domain_str_sp) return false; @@ -156,8 +156,8 @@ public: m_child_sp = CreateValueObjectFromData( "_userInfo", isw.GetAsData(process_sp->GetByteOrder()), m_backend.GetExecutionContextRef(), - process_sp->GetTarget().GetScratchClangASTContext()->GetBasicType( - lldb::eBasicTypeObjCID)); + ClangASTContext::GetScratch(process_sp->GetTarget()) + ->GetBasicType(lldb::eBasicTypeObjCID)); return false; } diff --git a/lldb/source/Plugins/Language/ObjC/NSException.cpp b/lldb/source/Plugins/Language/ObjC/NSException.cpp index 931794a12ab1..9150787361c5 100644 --- a/lldb/source/Plugins/Language/ObjC/NSException.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSException.cpp @@ -69,10 +69,12 @@ static bool ExtractFields(ValueObject &valobj, ValueObjectSP *name_sp, InferiorSizedWord userinfo_isw(userinfo, *process_sp); InferiorSizedWord reserved_isw(reserved, *process_sp); - CompilerType voidstar = process_sp->GetTarget() - .GetScratchClangASTContext() - ->GetBasicType(lldb::eBasicTypeVoid) - .GetPointerType(); + auto *clang_ast_context = ClangASTContext::GetScratch(process_sp->GetTarget()); + if (!clang_ast_context) + return false; + + CompilerType voidstar = + clang_ast_context->GetBasicType(lldb::eBasicTypeVoid).GetPointerType(); if (name_sp) *name_sp = ValueObject::CreateValueObjectFromData( @@ -96,21 +98,19 @@ static bool ExtractFields(ValueObject &valobj, ValueObjectSP *name_sp, bool lldb_private::formatters::NSException_SummaryProvider( ValueObject &valobj, Stream &stream, const TypeSummaryOptions &options) { - lldb::ValueObjectSP name_sp; lldb::ValueObjectSP reason_sp; - if (!ExtractFields(valobj, &name_sp, &reason_sp, nullptr, nullptr)) + if (!ExtractFields(valobj, nullptr, &reason_sp, nullptr, nullptr)) return false; - if (!name_sp || !reason_sp) + if (!reason_sp) { + stream.Printf("No reason"); return false; + } - StreamString name_str_summary; StreamString reason_str_summary; - if (NSStringSummaryProvider(*name_sp, name_str_summary, options) && - NSStringSummaryProvider(*reason_sp, reason_str_summary, options) && - !name_str_summary.Empty() && !reason_str_summary.Empty()) { - stream.Printf("name: %s - reason: %s", name_str_summary.GetData(), - reason_str_summary.GetData()); + if (NSStringSummaryProvider(*reason_sp, reason_str_summary, options) && + !reason_str_summary.Empty()) { + stream.Printf("%s", reason_str_summary.GetData()); return true; } else return false; diff --git a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp index 9ee6021ae56b..587dd13870a0 100644 --- a/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSIndexPath.cpp @@ -53,9 +53,8 @@ public: if (!type_system) return false; - ClangASTContext *ast = m_backend.GetExecutionContextRef() - .GetTargetSP() - ->GetScratchClangASTContext(); + ClangASTContext *ast = ClangASTContext::GetScratch( + *m_backend.GetExecutionContextRef().GetTargetSP()); if (!ast) return false; diff --git a/lldb/source/Plugins/Language/ObjC/NSString.cpp b/lldb/source/Plugins/Language/ObjC/NSString.cpp index 55e129b098dc..ce54d657374b 100644 --- a/lldb/source/Plugins/Language/ObjC/NSString.cpp +++ b/lldb/source/Plugins/Language/ObjC/NSString.cpp @@ -35,7 +35,7 @@ NSString_Additionals::GetAdditionalSummaries() { static CompilerType GetNSPathStore2Type(Target &target) { static ConstString g_type_name("__lldb_autogen_nspathstore2"); - ClangASTContext *ast_ctx = target.GetScratchClangASTContext(); + ClangASTContext *ast_ctx = ClangASTContext::GetScratch(target); if (!ast_ctx) return CompilerType(); diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp index c5bfb5747c13..3be548ad4144 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp @@ -15,6 +15,7 @@ #include "lldb/DataFormatters/DataVisualization.h" #include "lldb/DataFormatters/FormattersHelpers.h" #include "lldb/Symbol/ClangASTContext.h" +#include "lldb/Symbol/ClangUtil.h" #include "lldb/Symbol/CompilerType.h" #include "lldb/Target/Target.h" #include "lldb/Utility/ConstString.h" @@ -887,7 +888,7 @@ ObjCLanguage::GetPossibleFormattersMatches(ValueObject &valobj, bool canBeObjCDynamic = compiler_type.IsPossibleDynamicType(nullptr, check_cpp, check_objc); - if (canBeObjCDynamic) { + if (canBeObjCDynamic && ClangUtil::IsClangType(compiler_type)) { do { lldb::ProcessSP process_sp = valobj.GetProcessSP(); if (!process_sp) |