Author: spyffe Date: Thu Oct 1 11:28:02 2015 New Revision: 249027 URL: http://llvm.org/viewvc/llvm-project?rev=249027&view=rev Log: Made Target hold a map of languages to TypeSystems, and added some accessors. Also added some target-level search functions so that persistent variables and symbols can be searched for without hand-iterating across the map of TypeSystems.
Modified: lldb/trunk/include/lldb/Target/Target.h lldb/trunk/source/Commands/CommandObjectMemory.cpp lldb/trunk/source/Core/ValueObject.cpp lldb/trunk/source/Expression/UserExpression.cpp lldb/trunk/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp lldb/trunk/source/Target/ABI.cpp lldb/trunk/source/Target/Target.cpp Modified: lldb/trunk/include/lldb/Target/Target.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/include/lldb/Target/Target.h (original) +++ lldb/trunk/include/lldb/Target/Target.h Thu Oct 1 11:28:02 2015 @@ -1231,6 +1231,9 @@ public: TypeSystem * GetScratchTypeSystemForLanguage (lldb::LanguageType language, bool create_on_demand = true); + PersistentExpressionState * + GetPersistentExpressionStateForLanguage (lldb::LanguageType language); + // Creates a UserExpression for the given language, the rest of the parameters have the // same meaning as for the UserExpression constructor. // Returns a new-ed object which the caller owns. @@ -1322,6 +1325,9 @@ public: lldb::ExpressionVariableSP GetPersistentVariable(const ConstString &name); + lldb::addr_t + GetPersistentSymbol(const ConstString &name); + //------------------------------------------------------------------ // Target Stop Hooks //------------------------------------------------------------------ @@ -1499,6 +1505,9 @@ public: GetSearchFilterForModuleAndCUList (const FileSpecList *containingModules, const FileSpecList *containingSourceFiles); protected: + ClangASTContext * + GetScratchClangASTContextImpl(); + //------------------------------------------------------------------ // Member variables. //------------------------------------------------------------------ @@ -1519,7 +1528,10 @@ protected: lldb::ProcessSP m_process_sp; lldb::SearchFilterSP m_search_filter_sp; PathMappingList m_image_search_paths; - lldb::ClangASTContextUP m_scratch_ast_context_ap; + + typedef std::map<lldb::LanguageType, lldb::TypeSystemSP> TypeSystemMap; + TypeSystemMap m_scratch_type_system_map; + lldb::ClangASTSourceUP m_scratch_ast_source_ap; lldb::ClangASTImporterUP m_ast_importer_ap; lldb::ClangModulesDeclVendorUP m_clang_modules_decl_vendor_ap; Modified: lldb/trunk/source/Commands/CommandObjectMemory.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectMemory.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectMemory.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectMemory.cpp Thu Oct 1 11:28:02 2015 @@ -530,10 +530,14 @@ protected: if (type_list.GetSize() == 0 && lookup_type_name.GetCString() && *lookup_type_name.GetCString() == '$') { - clang::TypeDecl *tdecl = llvm::cast<ClangPersistentVariables>(target->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC)->GetPersistentExpressionState())->GetPersistentType(ConstString(lookup_type_name)); - if (tdecl) + if (ClangPersistentVariables *persistent_vars = llvm::dyn_cast_or_null<ClangPersistentVariables>(target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))) { - clang_ast_type.SetCompilerType(ClangASTContext::GetASTContext(&tdecl->getASTContext()),(const lldb::opaque_compiler_type_t)tdecl->getTypeForDecl()); + clang::TypeDecl *tdecl = persistent_vars->GetPersistentType(ConstString(lookup_type_name)); + + if (tdecl) + { + clang_ast_type.SetCompilerType(ClangASTContext::GetASTContext(&tdecl->getASTContext()),(const lldb::opaque_compiler_type_t)tdecl->getTypeForDecl()); + } } } Modified: lldb/trunk/source/Core/ValueObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Core/ValueObject.cpp (original) +++ lldb/trunk/source/Core/ValueObject.cpp Thu Oct 1 11:28:02 2015 @@ -4277,7 +4277,7 @@ ValueObject::Persist () if (!target_sp) return nullptr; - PersistentExpressionState *persistent_state = target_sp->GetScratchTypeSystemForLanguage(GetPreferredDisplayLanguage())->GetPersistentExpressionState(); + PersistentExpressionState *persistent_state = target_sp->GetPersistentExpressionStateForLanguage(GetPreferredDisplayLanguage()); if (!persistent_state) return nullptr; Modified: lldb/trunk/source/Expression/UserExpression.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Expression/UserExpression.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Expression/UserExpression.cpp (original) +++ lldb/trunk/source/Expression/UserExpression.cpp Thu Oct 1 11:28:02 2015 @@ -587,7 +587,7 @@ UserExpression::Evaluate (ExecutionConte if (options.GetResultIsInternal() && expr_result && process) { - process->GetTarget().GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC)->GetPersistentExpressionState()->RemovePersistentVariable (expr_result); + process->GetTarget().GetPersistentExpressionStateForLanguage(language)->RemovePersistentVariable (expr_result); } if (execution_results != lldb::eExpressionCompleted) Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp (original) +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ASTResultSynthesizer.cpp Thu Oct 1 11:28:02 2015 @@ -464,7 +464,7 @@ ASTResultSynthesizer::MaybeRecordPersist D); if (TypeDecl *TypeDecl_scratch = dyn_cast<TypeDecl>(D_scratch)) - llvm::cast<ClangPersistentVariables>(m_target.GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC)->GetPersistentExpressionState())->RegisterPersistentType(name_cs, TypeDecl_scratch); + llvm::cast<ClangPersistentVariables>(m_target.GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))->RegisterPersistentType(name_cs, TypeDecl_scratch); } void Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp (original) +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionDeclMap.cpp Thu Oct 1 11:28:02 2015 @@ -104,7 +104,7 @@ ClangExpressionDeclMap::WillParse(Execut if (target) { - m_parser_vars->m_persistent_vars = llvm::cast<ClangPersistentVariables>(target->GetScratchTypeSystemForLanguage(eLanguageTypeC)->GetPersistentExpressionState()); + m_parser_vars->m_persistent_vars = llvm::cast<ClangPersistentVariables>(target->GetPersistentExpressionStateForLanguage(eLanguageTypeC)); if (!target->GetScratchClangASTContext()) return false; Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp (original) +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp Thu Oct 1 11:28:02 2015 @@ -331,7 +331,7 @@ ClangExpressionParser::ClangExpressionPa if (ClangModulesDeclVendor *decl_vendor = target_sp->GetClangModulesDeclVendor()) { - ClangPersistentVariables *clang_persistent_vars = llvm::cast<ClangPersistentVariables>(target_sp->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC)->GetPersistentExpressionState()); + ClangPersistentVariables *clang_persistent_vars = llvm::cast<ClangPersistentVariables>(target_sp->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC)); std::unique_ptr<PPCallbacks> pp_callbacks(new LLDBPreprocessorCallbacks(*decl_vendor, *clang_persistent_vars)); m_pp_callbacks = static_cast<LLDBPreprocessorCallbacks*>(pp_callbacks.get()); m_compiler->getPreprocessor().addPPCallbacks(std::move(pp_callbacks)); Modified: lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp (original) +++ lldb/trunk/source/Plugins/ExpressionParser/Clang/ClangUserExpression.cpp Thu Oct 1 11:28:02 2015 @@ -357,7 +357,7 @@ ClangUserExpression::Parse (Stream &erro if (ClangModulesDeclVendor *decl_vendor = m_target->GetClangModulesDeclVendor()) { - const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = llvm::cast<ClangPersistentVariables>(m_target->GetScratchTypeSystemForLanguage(lldb::eLanguageTypeC)->GetPersistentExpressionState())->GetHandLoadedClangModules(); + const ClangModulesDeclVendor::ModuleVector &hand_imported_modules = llvm::cast<ClangPersistentVariables>(m_target->GetPersistentExpressionStateForLanguage(lldb::eLanguageTypeC))->GetHandLoadedClangModules(); ClangModulesDeclVendor::ModuleVector modules_for_macros; for (ClangModulesDeclVendor::ModuleID module : hand_imported_modules) Modified: lldb/trunk/source/Target/ABI.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/ABI.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Target/ABI.cpp (original) +++ lldb/trunk/source/Target/ABI.cpp Thu Oct 1 11:28:02 2015 @@ -124,7 +124,11 @@ ABI::GetReturnValueObject (Thread &threa if (persistent) { - PersistentExpressionState *persistent_expression_state = thread.CalculateTarget()->GetScratchTypeSystemForLanguage(ast_type.GetMinimumLanguage())->GetPersistentExpressionState(); + PersistentExpressionState *persistent_expression_state = thread.CalculateTarget()->GetPersistentExpressionStateForLanguage(ast_type.GetMinimumLanguage()); + + if (!persistent_expression_state) + return ValueObjectSP(); + ConstString persistent_variable_name (persistent_expression_state->GetNextPersistentVariableName()); lldb::ValueObjectSP const_valobj_sp; Modified: lldb/trunk/source/Target/Target.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=249027&r1=249026&r2=249027&view=diff ============================================================================== --- lldb/trunk/source/Target/Target.cpp (original) +++ lldb/trunk/source/Target/Target.cpp Thu Oct 1 11:28:02 2015 @@ -85,7 +85,6 @@ Target::Target(Debugger &debugger, const m_process_sp (), m_search_filter_sp (), m_image_search_paths (ImageSearchPathsChanged, this), - m_scratch_ast_context_ap (), m_scratch_ast_source_ap (), m_ast_importer_ap (), m_source_manager_ap(), @@ -1123,7 +1122,7 @@ Target::ClearModules(bool delete_locatio ModulesDidUnload (m_images, delete_locations); m_section_load_history.Clear(); m_images.Clear(); - m_scratch_ast_context_ap.reset(); + m_scratch_type_system_map.clear(); m_scratch_ast_source_ap.reset(); m_ast_importer_ap.reset(); } @@ -1893,14 +1892,56 @@ Target::ImageSearchPathsChanged TypeSystem * Target::GetScratchTypeSystemForLanguage (lldb::LanguageType language, bool create_on_demand) { + Mutex::Locker locker (m_mutex); + + if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all assembly code + || language == eLanguageTypeUnknown) { + language = eLanguageTypeC; + } + + TypeSystemMap::iterator pos = m_scratch_type_system_map.find(language); + + if (pos != m_scratch_type_system_map.end()) + return pos->second.get(); + + for (const auto &pair : m_scratch_type_system_map) + { + if (pair.second && pair.second->SupportsLanguage(language)) + { + // Add a new mapping for "language" to point to an already existing + // TypeSystem that supports this language + m_scratch_type_system_map[language] = pair.second; + return pair.second.get(); + } + } + + if (!create_on_demand) + return nullptr; + if (Language::LanguageIsC(language) || Language::LanguageIsObjC(language) - || Language::LanguageIsCPlusPlus(language) - || language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all assembly code - || language == eLanguageTypeUnknown) - return GetScratchClangASTContext(create_on_demand); + || Language::LanguageIsCPlusPlus(language)) + { + m_scratch_type_system_map[language].reset(GetScratchClangASTContextImpl()); + return m_scratch_type_system_map[language].get(); + } + + return nullptr; +} + +PersistentExpressionState * +Target::GetPersistentExpressionStateForLanguage (lldb::LanguageType language) +{ + TypeSystem *type_system = GetScratchTypeSystemForLanguage(language, true); + + if (type_system) + { + return type_system->GetPersistentExpressionState(); + } else - return NULL; + { + return nullptr; + } } UserExpression * @@ -1972,20 +2013,30 @@ Target::GetUtilityFunctionForLanguage (c return utility_fn; } - ClangASTContext * Target::GetScratchClangASTContext(bool create_on_demand) { - // Now see if we know the target triple, and if so, create our scratch AST context: - if (m_scratch_ast_context_ap.get() == NULL && m_arch.IsValid() && create_on_demand) + if (TypeSystem* type_system = GetScratchTypeSystemForLanguage(eLanguageTypeC, create_on_demand)) { - m_scratch_ast_context_ap.reset (new ClangASTContextForExpressions(*this)); - m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this())); - m_scratch_ast_source_ap->InstallASTContext(m_scratch_ast_context_ap->getASTContext()); - llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy()); - m_scratch_ast_context_ap->SetExternalSource(proxy_ast_source); + return llvm::dyn_cast<ClangASTContext>(type_system); + } + else + { + return nullptr; } - return m_scratch_ast_context_ap.get(); +} + +ClangASTContext * +Target::GetScratchClangASTContextImpl() +{ + ClangASTContextForExpressions *ast_context = new ClangASTContextForExpressions(*this); + + m_scratch_ast_source_ap.reset (new ClangASTSource(shared_from_this())); + m_scratch_ast_source_ap->InstallASTContext(ast_context->getASTContext()); + llvm::IntrusiveRefCntPtr<clang::ExternalASTSource> proxy_ast_source(m_scratch_ast_source_ap->CreateProxy()); + ast_context->SetExternalSource(proxy_ast_source); + + return ast_context; } ClangASTImporter * @@ -2144,11 +2195,23 @@ Target::EvaluateExpression lldb::ExpressionVariableSP Target::GetPersistentVariable(const ConstString &name) { - if (ClangASTContext *ast_context = GetScratchClangASTContext(false)) + std::set<TypeSystem *> visited; + + for (const auto &pair : m_scratch_type_system_map) { - if (PersistentExpressionState *persistent_state = ast_context->GetPersistentExpressionState()) + if (pair.second && !visited.count(pair.second.get())) { - return persistent_state->GetVariable(name); + visited.insert(pair.second.get()); + + if (PersistentExpressionState *persistent_state = pair.second->GetPersistentExpressionState()) + { + lldb::ExpressionVariableSP variable_sp = persistent_state->GetVariable(name); + + if (variable_sp) + { + return variable_sp; + } + } } } @@ -2156,6 +2219,32 @@ Target::GetPersistentVariable(const Cons } lldb::addr_t +Target::GetPersistentSymbol(const ConstString &name) +{ + std::set<TypeSystem *> visited; + + for (const auto &pair : m_scratch_type_system_map) + { + if (pair.second && !visited.count(pair.second.get())) + { + visited.insert(pair.second.get()); + + if (PersistentExpressionState *persistent_state = pair.second->GetPersistentExpressionState()) + { + lldb::addr_t address = persistent_state->LookupSymbol(name); + + if (address != LLDB_INVALID_ADDRESS) + { + return address; + } + } + } + } + + return LLDB_INVALID_ADDRESS; +} + +lldb::addr_t Target::GetCallableLoadAddress (lldb::addr_t load_addr, AddressClass addr_class) const { addr_t code_addr = load_addr; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits