diff options
Diffstat (limited to 'source/Symbol')
-rw-r--r-- | source/Symbol/ClangASTContext.cpp | 1 | ||||
-rw-r--r-- | source/Symbol/ClangASTImporter.cpp | 143 | ||||
-rw-r--r-- | source/Symbol/ClangASTType.cpp | 4 | ||||
-rw-r--r-- | source/Symbol/Function.cpp | 54 | ||||
-rw-r--r-- | source/Symbol/Symbol.cpp | 34 | ||||
-rw-r--r-- | source/Symbol/SymbolContext.cpp | 36 | ||||
-rw-r--r-- | source/Symbol/Symtab.cpp | 12 | ||||
-rw-r--r-- | source/Symbol/Variable.cpp | 33 |
8 files changed, 276 insertions, 41 deletions
diff --git a/source/Symbol/ClangASTContext.cpp b/source/Symbol/ClangASTContext.cpp index 3c3e2e51d9af..68bcde8a47c1 100644 --- a/source/Symbol/ClangASTContext.cpp +++ b/source/Symbol/ClangASTContext.cpp @@ -1592,6 +1592,7 @@ ClangASTContext::CreateObjCClass SourceLocation(), &ast->Idents.get(name), nullptr, + nullptr, SourceLocation(), /*isForwardDecl,*/ isInternal); diff --git a/source/Symbol/ClangASTImporter.cpp b/source/Symbol/ClangASTImporter.cpp index 64a7323d25cf..dd73b35d86a9 100644 --- a/source/Symbol/ClangASTImporter.cpp +++ b/source/Symbol/ClangASTImporter.cpp @@ -17,6 +17,7 @@ #include "lldb/Symbol/ClangASTImporter.h" #include "lldb/Symbol/ClangExternalASTSourceCommon.h" #include "lldb/Symbol/ClangNamespaceDecl.h" +#include "lldb/Utility/LLDBAssert.h" using namespace lldb_private; using namespace clang; @@ -109,6 +110,134 @@ ClangASTImporter::CopyDecl (clang::ASTContext *dst_ast, return nullptr; } +class DeclContextOverride +{ +private: + struct Backup + { + clang::DeclContext *decl_context; + clang::DeclContext *lexical_decl_context; + }; + + std::map<clang::Decl *, Backup> m_backups; + + void OverrideOne(clang::Decl *decl) + { + if (m_backups.find(decl) != m_backups.end()) + { + return; + } + + m_backups[decl] = { decl->getDeclContext(), decl->getLexicalDeclContext() }; + + decl->setDeclContext(decl->getASTContext().getTranslationUnitDecl()); + decl->setLexicalDeclContext(decl->getASTContext().getTranslationUnitDecl()); + } + + bool ChainPassesThrough(clang::Decl *decl, + clang::DeclContext *base, + clang::DeclContext *(clang::Decl::*contextFromDecl)(), + clang::DeclContext *(clang::DeclContext::*contextFromContext)()) + { + for (DeclContext *decl_ctx = (decl->*contextFromDecl)(); + decl_ctx; + decl_ctx = (decl_ctx->*contextFromContext)()) + { + if (decl_ctx == base) + { + return true; + } + } + + return false; + } + + clang::Decl *GetEscapedChild(clang::Decl *decl, clang::DeclContext *base = nullptr) + { + if (base) + { + // decl's DeclContext chains must pass through base. + + if (!ChainPassesThrough(decl, base, &clang::Decl::getDeclContext, &clang::DeclContext::getParent) || + !ChainPassesThrough(decl, base, &clang::Decl::getLexicalDeclContext, &clang::DeclContext::getLexicalParent)) + { + return decl; + } + } + else + { + base = clang::dyn_cast<clang::DeclContext>(decl); + + if (!base) + { + return nullptr; + } + } + + if (clang::DeclContext *context = clang::dyn_cast<clang::DeclContext>(decl)) + { + for (clang::Decl *decl : context->decls()) + { + if (clang::Decl *escaped_child = GetEscapedChild(decl)) + { + return escaped_child; + } + } + } + + return nullptr; + } + + void Override(clang::Decl *decl) + { + if (clang::Decl *escaped_child = GetEscapedChild(decl)) + { + Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_EXPRESSIONS)); + + if (log) + log->Printf(" [ClangASTImporter] DeclContextOverride couldn't override (%sDecl*)%p - its child (%sDecl*)%p escapes", + decl->getDeclKindName(), static_cast<void*>(decl), + escaped_child->getDeclKindName(), static_cast<void*>(escaped_child)); + lldbassert(0 && "Couldn't override!"); + } + + OverrideOne(decl); + } + +public: + DeclContextOverride() + { + } + + void OverrideAllDeclsFromContainingFunction(clang::Decl *decl) + { + for (DeclContext *decl_context = decl->getLexicalDeclContext(); + decl_context; + decl_context = decl_context->getLexicalParent()) + { + DeclContext *redecl_context = decl_context->getRedeclContext(); + + if (llvm::isa<FunctionDecl>(redecl_context) && + llvm::isa<TranslationUnitDecl>(redecl_context->getLexicalParent())) + { + for (clang::Decl *child_decl : decl_context->decls()) + { + Override(child_decl); + } + } + } + } + + ~DeclContextOverride() + { + for (const std::pair<clang::Decl *, Backup> &backup : m_backups) + { + backup.first->setDeclContext(backup.second.decl_context); + backup.first->setLexicalDeclContext(backup.second.lexical_decl_context); + } + } +}; + lldb::clang_type_t ClangASTImporter::DeportType (clang::ASTContext *dst_ctx, clang::ASTContext *src_ctx, @@ -122,6 +251,13 @@ ClangASTImporter::DeportType (clang::ASTContext *dst_ctx, std::set<NamedDecl *> decls_to_deport; std::set<NamedDecl *> decls_already_deported; + DeclContextOverride decl_context_override; + + if (const clang::TagType *tag_type = clang::QualType::getFromOpaquePtr(type)->getAs<TagType>()) + { + decl_context_override.OverrideAllDeclsFromContainingFunction(tag_type->getDecl()); + } + minion_sp->InitDeportWorkQueues(&decls_to_deport, &decls_already_deported); @@ -156,6 +292,10 @@ ClangASTImporter::DeportDecl (clang::ASTContext *dst_ctx, std::set<NamedDecl *> decls_to_deport; std::set<NamedDecl *> decls_already_deported; + + DeclContextOverride decl_context_override; + + decl_context_override.OverrideAllDeclsFromContainingFunction(decl); minion_sp->InitDeportWorkQueues(&decls_to_deport, &decls_already_deported); @@ -568,7 +708,8 @@ ClangASTImporter::Minion::ImportDefinitionTo (clang::Decl *to, clang::Decl *from if (!to_objc_interface->hasDefinition()) to_objc_interface->startDefinition(); - to_objc_interface->setSuperClass(imported_from_superclass); + to_objc_interface->setSuperClass( + m_source_ctx->getTrivialTypeSourceInfo(m_source_ctx->getObjCInterfaceType(imported_from_superclass))); } while (0); } diff --git a/source/Symbol/ClangASTType.cpp b/source/Symbol/ClangASTType.cpp index a62cc9f45a6b..6f1002fbd9fc 100644 --- a/source/Symbol/ClangASTType.cpp +++ b/source/Symbol/ClangASTType.cpp @@ -5354,7 +5354,9 @@ ClangASTType::SetObjCSuperClass (const ClangASTType &superclass_clang_type) clang::ObjCInterfaceDecl *super_interface_decl = superclass_clang_type.GetAsObjCInterfaceDecl (); if (class_interface_decl && super_interface_decl) { - class_interface_decl->setSuperClass(super_interface_decl); + + class_interface_decl->setSuperClass( + m_ast->getTrivialTypeSourceInfo(m_ast->getObjCInterfaceType(super_interface_decl))); return true; } } diff --git a/source/Symbol/Function.cpp b/source/Symbol/Function.cpp index 0b7430ad75e3..77448d4f2a22 100644 --- a/source/Symbol/Function.cpp +++ b/source/Symbol/Function.cpp @@ -77,7 +77,7 @@ FunctionInfo::GetDeclaration() const return m_declaration; } -const ConstString& +ConstString FunctionInfo::GetName() const { return m_name; @@ -140,25 +140,32 @@ InlineFunctionInfo::Dump(Stream *s, bool show_fullpaths) const } void -InlineFunctionInfo::DumpStopContext (Stream *s) const +InlineFunctionInfo::DumpStopContext (Stream *s, LanguageType language) const { // s->Indent("[inlined] "); s->Indent(); if (m_mangled) - s->PutCString (m_mangled.GetName().AsCString()); + s->PutCString (m_mangled.GetName(language).AsCString()); else s->PutCString (m_name.AsCString()); } -const ConstString & -InlineFunctionInfo::GetName () const +ConstString +InlineFunctionInfo::GetName (LanguageType language) const { if (m_mangled) - return m_mangled.GetName(); + return m_mangled.GetName(language); return m_name; } +ConstString +InlineFunctionInfo::GetDisplayName (LanguageType language) const +{ + if (m_mangled) + return m_mangled.GetDisplayDemangledName(language); + return m_name; +} Declaration & InlineFunctionInfo::GetCallSite () @@ -459,6 +466,14 @@ Function::MemorySize () const return mem_size; } +ConstString +Function::GetDisplayName () const +{ + if (!m_mangled) + return ConstString(); + return m_mangled.GetDisplayDemangledName(GetLanguage()); +} + clang::DeclContext * Function::GetClangDeclContext() { @@ -602,5 +617,32 @@ Function::GetPrologueByteSize () return m_prologue_byte_size; } +lldb::LanguageType +Function::GetLanguage() const +{ + if (m_comp_unit) + return m_comp_unit->GetLanguage(); + else + return lldb::eLanguageTypeUnknown; +} + +ConstString +Function::GetName() const +{ + LanguageType language = lldb::eLanguageTypeUnknown; + if (m_comp_unit) + language = m_comp_unit->GetLanguage(); + return m_mangled.GetName(language); +} + +ConstString +Function::GetNameNoArguments() const +{ + LanguageType language = lldb::eLanguageTypeUnknown; + if (m_comp_unit) + language = m_comp_unit->GetLanguage(); + return m_mangled.GetName(language, Mangled::ePreferDemangledWithoutArguments); +} + diff --git a/source/Symbol/Symbol.cpp b/source/Symbol/Symbol.cpp index dff15dd92613..5884fcaa551d 100644 --- a/source/Symbol/Symbol.cpp +++ b/source/Symbol/Symbol.cpp @@ -185,6 +185,14 @@ Symbol::ValueIsAddress() const } ConstString +Symbol::GetDisplayName () const +{ + if (!m_mangled) + return ConstString(); + return m_mangled.GetDisplayDemangledName(GetLanguage()); +} + +ConstString Symbol::GetReExportedSymbolName() const { if (m_type == eSymbolTypeReExported) @@ -288,8 +296,9 @@ Symbol::GetDescription (Stream *s, lldb::DescriptionLevel level, Target *target) else s->Printf (", value = 0x%16.16" PRIx64, m_addr_range.GetBaseAddress().GetOffset()); } - if (m_mangled.GetDemangledName()) - s->Printf(", name=\"%s\"", m_mangled.GetDemangledName().AsCString()); + ConstString demangled = m_mangled.GetDemangledName(GetLanguage()); + if (demangled) + s->Printf(", name=\"%s\"", demangled.AsCString()); if (m_mangled.GetMangledName()) s->Printf(", mangled=\"%s\"", m_mangled.GetMangledName().AsCString()); @@ -309,6 +318,7 @@ Symbol::Dump(Stream *s, Target *target, uint32_t index) const // Make sure the size of the symbol is up to date before dumping GetByteSize(); + ConstString name = m_mangled.GetName(GetLanguage()); if (ValueIsAddress()) { if (!m_addr_range.GetBaseAddress().Dump(s, nullptr, Address::DumpStyleFileAddress)) @@ -325,13 +335,13 @@ Symbol::Dump(Stream *s, Target *target, uint32_t index) const s->Printf( format, GetByteSize(), m_flags, - m_mangled.GetName().AsCString("")); + name.AsCString("")); } else if (m_type == eSymbolTypeReExported) { s->Printf (" 0x%8.8x %s", m_flags, - m_mangled.GetName().AsCString("")); + name.AsCString("")); ConstString reexport_name = GetReExportedSymbolName(); intptr_t shlib = m_addr_range.GetByteSize(); @@ -349,7 +359,7 @@ Symbol::Dump(Stream *s, Target *target, uint32_t index) const m_addr_range.GetBaseAddress().GetOffset(), GetByteSize(), m_flags, - m_mangled.GetName().AsCString("")); + name.AsCString("")); } } @@ -439,7 +449,7 @@ bool Symbol::Compare(const ConstString& name, SymbolType type) const { if (type == eSymbolTypeAny || m_type == type) - return m_mangled.GetMangledName() == name || m_mangled.GetDemangledName() == name; + return m_mangled.GetMangledName() == name || m_mangled.GetDemangledName(GetLanguage()) == name; return false; } @@ -635,6 +645,18 @@ Symbol::GetLoadAddress (Target *target) const return LLDB_INVALID_ADDRESS; } +ConstString +Symbol::GetName () const +{ + return m_mangled.GetName(GetLanguage()); +} + +ConstString +Symbol::GetNameNoArguments () const +{ + return m_mangled.GetName(GetLanguage(), Mangled::ePreferDemangledWithoutArguments); +} + lldb::addr_t Symbol::ResolveCallableAddress(Target &target) const diff --git a/source/Symbol/SymbolContext.cpp b/source/Symbol/SymbolContext.cpp index 8e4240a4587d..4fb0dbc237c8 100644 --- a/source/Symbol/SymbolContext.cpp +++ b/source/Symbol/SymbolContext.cpp @@ -160,15 +160,15 @@ SymbolContext::DumpStopContext ( s->Printf("<"); dumped_something = true; } - else if (show_function_arguments == false && function->GetMangled().GetName(Mangled::ePreferDemangledWithoutArguments)) - { - dumped_something = true; - function->GetMangled().GetName(Mangled::ePreferDemangledWithoutArguments).Dump(s); - } - else if (function->GetMangled().GetName()) + else { - dumped_something = true; - function->GetMangled().GetName().Dump(s); + ConstString name; + if (show_function_arguments == false) + name = function->GetNameNoArguments(); + if (!name) + name = function->GetName(); + if (name) + name.Dump(s); } if (addr.IsValid()) @@ -192,7 +192,7 @@ SymbolContext::DumpStopContext ( dumped_something = true; Block *inlined_block = block->GetContainingInlinedBlock(); const InlineFunctionInfo* inlined_block_info = inlined_block->GetInlinedFunctionInfo(); - s->Printf (" [inlined] %s", inlined_block_info->GetName().GetCString()); + s->Printf (" [inlined] %s", inlined_block_info->GetName(function->GetLanguage()).GetCString()); lldb_private::AddressRange block_range; if (inlined_block->GetRangeContainingAddress(addr, block_range)) @@ -235,12 +235,12 @@ SymbolContext::DumpStopContext ( s->Printf("<"); dumped_something = true; } - else if (symbol->GetMangled().GetName()) + else if (symbol->GetName()) { dumped_something = true; if (symbol->GetType() == eSymbolTypeTrampoline) s->PutCString("symbol stub for: "); - symbol->GetMangled().GetName().Dump(s); + symbol->GetName().Dump(s); } if (addr.IsValid() && symbol->ValueIsAddress()) @@ -438,7 +438,7 @@ SymbolContext::Dump(Stream *s, Target *target) const s->Indent(); *s << "Symbol = " << (void *)symbol; if (symbol != nullptr && symbol->GetMangled()) - *s << ' ' << symbol->GetMangled().GetName().AsCString(); + *s << ' ' << symbol->GetName().AsCString(); s->EOL(); *s << "Variable = " << (void *)variable; if (variable != nullptr) @@ -681,14 +681,14 @@ SymbolContext::GetFunctionName (Mangled::NamePreference preference) const { const InlineFunctionInfo *inline_info = inlined_block->GetInlinedFunctionInfo(); if (inline_info) - return inline_info->GetName(); + return inline_info->GetName(function->GetLanguage()); } } - return function->GetMangled().GetName(preference); + return function->GetMangled().GetName(function->GetLanguage(), preference); } else if (symbol && symbol->ValueIsAddress()) { - return symbol->GetMangled().GetName(preference); + return symbol->GetMangled().GetName(symbol->GetLanguage(), preference); } else { @@ -916,7 +916,7 @@ SymbolContextSpecifier::SymbolContextMatches(SymbolContext &sc) { was_inlined = true; const Mangled &name = inline_info->GetMangled(); - if (!name.NameMatches (func_name)) + if (!name.NameMatches (func_name, sc.function->GetLanguage())) return false; } } @@ -925,12 +925,12 @@ SymbolContextSpecifier::SymbolContextMatches(SymbolContext &sc) { if (sc.function != nullptr) { - if (!sc.function->GetMangled().NameMatches(func_name)) + if (!sc.function->GetMangled().NameMatches(func_name, sc.function->GetLanguage())) return false; } else if (sc.symbol != nullptr) { - if (!sc.symbol->GetMangled().NameMatches(func_name)) + if (!sc.symbol->GetMangled().NameMatches(func_name, sc.function->GetLanguage())) return false; } } diff --git a/source/Symbol/Symtab.cpp b/source/Symbol/Symtab.cpp index 4cc03345d05b..c11efc0d9b24 100644 --- a/source/Symbol/Symtab.cpp +++ b/source/Symbol/Symtab.cpp @@ -136,7 +136,7 @@ Symtab::Dump (Stream *s, Target *target, SortOrder sort_order) CStringToSymbol name_map; for (const_iterator pos = m_symbols.begin(), end = m_symbols.end(); pos != end; ++pos) { - const char *name = pos->GetMangled().GetName(Mangled::ePreferDemangled).AsCString(); + const char *name = pos->GetName().AsCString(); if (name && name[0]) name_map.insert (std::make_pair(name, &(*pos))); } @@ -329,7 +329,7 @@ Symtab::InitNameIndexes() entry.cstring[2] != 'G' && // avoid guard variables entry.cstring[2] != 'Z')) // named local entities (if we eventually handle eSymbolTypeData, we will want this back) { - CPPLanguageRuntime::MethodName cxx_method (mangled.GetDemangledName()); + CPPLanguageRuntime::MethodName cxx_method (mangled.GetDemangledName(lldb::eLanguageTypeC_plus_plus)); entry.cstring = ConstString(cxx_method.GetBasename()).GetCString(); if (entry.cstring && entry.cstring[0]) { @@ -378,7 +378,7 @@ Symtab::InitNameIndexes() } } - entry.cstring = mangled.GetDemangledName().GetCString(); + entry.cstring = mangled.GetDemangledName(symbol->GetLanguage()).GetCString(); if (entry.cstring && entry.cstring[0]) { m_name_to_index.Append (entry); @@ -486,7 +486,7 @@ Symtab::AppendSymbolNamesToMap (const IndexCollection &indexes, const Mangled &mangled = symbol->GetMangled(); if (add_demangled) { - entry.cstring = mangled.GetDemangledName().GetCString(); + entry.cstring = mangled.GetDemangledName(symbol->GetLanguage()).GetCString(); if (entry.cstring && entry.cstring[0]) name_to_index_map.Append (entry); } @@ -746,7 +746,7 @@ Symtab::AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®exp { if (symbol_type == eSymbolTypeAny || m_symbols[i].GetType() == symbol_type) { - const char *name = m_symbols[i].GetMangled().GetName().AsCString(); + const char *name = m_symbols[i].GetName().AsCString(); if (name) { if (regexp.Execute (name)) @@ -773,7 +773,7 @@ Symtab::AppendSymbolIndexesMatchingRegExAndType (const RegularExpression ®exp if (CheckSymbolAtIndex(i, symbol_debug_type, symbol_visibility) == false) continue; - const char *name = m_symbols[i].GetMangled().GetName().AsCString(); + const char *name = m_symbols[i].GetName().AsCString(); if (name) { if (regexp.Execute (name)) diff --git a/source/Symbol/Variable.cpp b/source/Symbol/Variable.cpp index 5665e4702ca6..2490e98ac1e8 100644 --- a/source/Symbol/Variable.cpp +++ b/source/Symbol/Variable.cpp @@ -15,6 +15,7 @@ #include "lldb/Core/ValueObject.h" #include "lldb/Core/ValueObjectVariable.h" #include "lldb/Symbol/Block.h" +#include "lldb/Symbol/CompileUnit.h" #include "lldb/Symbol/Function.h" #include "lldb/Symbol/SymbolContext.h" #include "lldb/Symbol/Type.h" @@ -65,22 +66,48 @@ Variable::~Variable() { } +lldb::LanguageType +Variable::GetLanguage () const +{ + SymbolContext variable_sc; + m_owner_scope->CalculateSymbolContext(&variable_sc); + if (variable_sc.comp_unit) + return variable_sc.comp_unit->GetLanguage(); + return lldb::eLanguageTypeUnknown; +} + -const ConstString& + +ConstString Variable::GetName() const { - const ConstString &name = m_mangled.GetName(); + ConstString name = m_mangled.GetName(GetLanguage()); if (name) return name; return m_name; } bool +Variable::NameMatches (const ConstString &name) const +{ + if (m_name == name) + return true; + SymbolContext variable_sc; + m_owner_scope->CalculateSymbolContext(&variable_sc); + + LanguageType language = eLanguageTypeUnknown; + if (variable_sc.comp_unit) + language = variable_sc.comp_unit->GetLanguage(); + return m_mangled.NameMatches (name, language); +} +bool Variable::NameMatches (const RegularExpression& regex) const { if (regex.Execute (m_name.AsCString())) return true; - return m_mangled.NameMatches (regex); + if (m_mangled) + return m_mangled.NameMatches (regex, GetLanguage()); + return false; } Type * |