diff options
Diffstat (limited to 'lldb')
25 files changed, 198 insertions, 201 deletions
diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h index 5b859752b3c..76484c3d606 100644 --- a/lldb/include/lldb/Core/PluginManager.h +++ b/lldb/include/lldb/Core/PluginManager.h @@ -385,10 +385,10 @@ public: GetInstrumentationRuntimeCreateCallbackForPluginName(ConstString name); // TypeSystem - static bool RegisterPlugin(ConstString name, const char *description, - TypeSystemCreateInstance create_callback, - LanguageSet supported_languages_for_types, - LanguageSet supported_languages_for_expressions); + static bool RegisterPlugin( + ConstString name, const char *description, + TypeSystemCreateInstance create_callback, + TypeSystemEnumerateSupportedLanguages enumerate_languages_callback); static bool UnregisterPlugin(TypeSystemCreateInstance create_callback); @@ -398,14 +398,18 @@ public: static TypeSystemCreateInstance GetTypeSystemCreateCallbackForPluginName(ConstString name); - static LanguageSet GetAllTypeSystemSupportedLanguagesForTypes(); + static TypeSystemEnumerateSupportedLanguages + GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(uint32_t idx); - static LanguageSet GetAllTypeSystemSupportedLanguagesForExpressions(); + static TypeSystemEnumerateSupportedLanguages + GetTypeSystemEnumerateSupportedLanguagesCallbackForPluginName( + ConstString name); // REPL - static bool RegisterPlugin(ConstString name, const char *description, - REPLCreateInstance create_callback, - LanguageSet supported_languages); + static bool + RegisterPlugin(ConstString name, const char *description, + REPLCreateInstance create_callback, + REPLEnumerateSupportedLanguages enumerate_languages_callback); static bool UnregisterPlugin(REPLCreateInstance create_callback); @@ -414,7 +418,12 @@ public: static REPLCreateInstance GetREPLCreateCallbackForPluginName(ConstString name); - static LanguageSet GetREPLAllTypeSystemSupportedLanguages(); + static REPLEnumerateSupportedLanguages + GetREPLEnumerateSupportedLanguagesCallbackAtIndex(uint32_t idx); + + static REPLEnumerateSupportedLanguages + GetREPLSystemEnumerateSupportedLanguagesCallbackForPluginName( + ConstString name); // Some plug-ins might register a DebuggerInitializeCallback callback when // registering the plug-in. After a new Debugger instance is created, this @@ -432,28 +441,32 @@ public: ConstString description, bool is_global_property); static lldb::OptionValuePropertiesSP - GetSettingForPlatformPlugin(Debugger &debugger, ConstString setting_name); + GetSettingForPlatformPlugin(Debugger &debugger, + ConstString setting_name); static bool CreateSettingForPlatformPlugin( Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, ConstString description, bool is_global_property); static lldb::OptionValuePropertiesSP - GetSettingForProcessPlugin(Debugger &debugger, ConstString setting_name); + GetSettingForProcessPlugin(Debugger &debugger, + ConstString setting_name); static bool CreateSettingForProcessPlugin( Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, ConstString description, bool is_global_property); static lldb::OptionValuePropertiesSP - GetSettingForSymbolFilePlugin(Debugger &debugger, ConstString setting_name); + GetSettingForSymbolFilePlugin(Debugger &debugger, + ConstString setting_name); static bool CreateSettingForSymbolFilePlugin( Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, ConstString description, bool is_global_property); static lldb::OptionValuePropertiesSP - GetSettingForJITLoaderPlugin(Debugger &debugger, ConstString setting_name); + GetSettingForJITLoaderPlugin(Debugger &debugger, + ConstString setting_name); static bool CreateSettingForJITLoaderPlugin( Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp, diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index f4912050ff9..6b4c5d5e6a7 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -68,8 +68,9 @@ public: static lldb::TypeSystemSP CreateInstance(lldb::LanguageType language, Module *module, Target *target); - static LanguageSet GetSupportedLanguagesForTypes(); - static LanguageSet GetSupportedLanguagesForExpressions(); + static void EnumerateSupportedLanguages( + std::set<lldb::LanguageType> &languages_for_types, + std::set<lldb::LanguageType> &languages_for_expressions); static void Initialize(); diff --git a/lldb/include/lldb/Symbol/SymbolFile.h b/lldb/include/lldb/Symbol/SymbolFile.h index ce8da8014c5..0a5dcc3893c 100644 --- a/lldb/include/lldb/Symbol/SymbolFile.h +++ b/lldb/include/lldb/Symbol/SymbolFile.h @@ -17,7 +17,6 @@ #include "lldb/Symbol/SourceModule.h" #include "lldb/Symbol/Type.h" #include "lldb/Symbol/TypeList.h" -#include "lldb/Symbol/TypeSystem.h" #include "lldb/lldb-private.h" #include "llvm/ADT/DenseSet.h" @@ -190,11 +189,7 @@ public: bool append, uint32_t max_matches, llvm::DenseSet<lldb_private::SymbolFile *> &searched_symbol_files, TypeMap &types); - - /// Find types specified by a CompilerContextPattern. - /// \param languages Only return results in these languages. - virtual size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, + virtual size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, bool append, TypeMap &types); virtual void diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index 60a0376e9a6..9bbdc9cf27e 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -15,7 +15,6 @@ #include <string> #include "llvm/ADT/APSInt.h" -#include "llvm/ADT/SmallBitVector.h" #include "llvm/Support/Casting.h" #include "llvm/Support/Error.h" @@ -31,24 +30,7 @@ class PDBASTParser; namespace lldb_private { -/// A SmallBitVector that represents a set of source languages (\p -/// lldb::LanguageType). Each lldb::LanguageType is represented by -/// the bit with the position of its enumerator. The largest -/// LanguageType is < 64, so this is space-efficient and on 64-bit -/// architectures a LanguageSet can be completely stack-allocated. -struct LanguageSet { - llvm::SmallBitVector bitvector; - LanguageSet() = default; - - /// If the set contains a single language only, return it. - llvm::Optional<lldb::LanguageType> GetSingularLanguage(); - void Insert(lldb::LanguageType language); - bool Empty() const; - size_t Size() const; - bool operator[](unsigned i) const; -}; - -/// Interface for representing the Type Systems in different languages. +// Interface for representing the Type Systems in different languages. class TypeSystem : public PluginInterface { public: // Intrusive type system that allows us to use llvm casting. diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index b49e96eeac1..e18beb4885a 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -267,9 +267,12 @@ public: static std::set<lldb::LanguageType> GetSupportedLanguages(); - static LanguageSet GetLanguagesSupportingTypeSystems(); - static LanguageSet GetLanguagesSupportingTypeSystemsForExpressions(); - static LanguageSet GetLanguagesSupportingREPLs(); + static void GetLanguagesSupportingTypeSystems( + std::set<lldb::LanguageType> &languages, + std::set<lldb::LanguageType> &languages_for_expressions); + + static void + GetLanguagesSupportingREPLs(std::set<lldb::LanguageType> &languages); protected: // Classes that inherit from Language can see and modify these diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h index 04b78bcc19f..717697530b5 100644 --- a/lldb/include/lldb/lldb-private-interfaces.h +++ b/lldb/include/lldb/lldb-private-interfaces.h @@ -102,6 +102,11 @@ typedef lldb::REPLSP (*REPLCreateInstance)(Status &error, lldb::LanguageType language, Debugger *debugger, Target *target, const char *repl_options); +typedef void (*TypeSystemEnumerateSupportedLanguages)( + std::set<lldb::LanguageType> &languages_for_types, + std::set<lldb::LanguageType> &languages_for_expressions); +typedef void (*REPLEnumerateSupportedLanguages)( + std::set<lldb::LanguageType> &languages); typedef int (*ComparisonFunction)(const void *, const void *); typedef void (*DebuggerInitializeCallback)(Debugger &debugger); diff --git a/lldb/lit/SymbolFile/DWARF/compilercontext.ll b/lldb/lit/SymbolFile/DWARF/compilercontext.ll index 6097345bd99..76637baec8c 100644 --- a/lldb/lit/SymbolFile/DWARF/compilercontext.ll +++ b/lldb/lit/SymbolFile/DWARF/compilercontext.ll @@ -1,21 +1,18 @@ ; Test finding types by CompilerContext. ; RUN: llc %s -filetype=obj -o %t.o -; RUN: lldb-test symbols %t.o -find=type --language=C99 \ +; RUN: lldb-test symbols %t.o -find=type \ ; RUN: -compiler-context="Module:CModule,Module:SubModule,Struct:FromSubmoduleX" \ ; RUN: | FileCheck %s --check-prefix=NORESULTS -; RUN: lldb-test symbols %t.o -find=type --language=C++ \ -; RUN: -compiler-context="Module:CModule,Module:SubModule,Struct:FromSubmodule" \ -; RUN: | FileCheck %s --check-prefix=NORESULTS -; RUN: lldb-test symbols %t.o -find=type --language=C99 \ +; RUN: lldb-test symbols %t.o -find=type \ ; RUN: -compiler-context="Module:CModule,Module:SubModule,Struct:FromSubmodule" \ ; RUN: | FileCheck %s -; RUN: lldb-test symbols %t.o -find=type --language=C99 \ +; RUN: lldb-test symbols %t.o -find=type \ ; RUN: -compiler-context="Module:CModule,AnyModule:*,Struct:FromSubmodule" \ ; RUN: | FileCheck %s -; RUN: lldb-test symbols %t.o -find=type --language=C99 \ +; RUN: lldb-test symbols %t.o -find=type \ ; RUN: -compiler-context="AnyModule:*,Struct:FromSubmodule" \ ; RUN: | FileCheck %s -; RUN: lldb-test symbols %t.o -find=type --language=C99 \ +; RUN: lldb-test symbols %t.o -find=type \ ; RUN: -compiler-context="Module:CModule,Module:SubModule,AnyType:FromSubmodule" \ ; RUN: | FileCheck %s ; diff --git a/lldb/source/Core/Debugger.cpp b/lldb/source/Core/Debugger.cpp index 513ea7a0d04..e3cd18aa35e 100644 --- a/lldb/source/Core/Debugger.cpp +++ b/lldb/source/Core/Debugger.cpp @@ -1623,11 +1623,13 @@ Status Debugger::RunREPL(LanguageType language, const char *repl_options) { FileSpec repl_executable; if (language == eLanguageTypeUnknown) { - LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs(); + std::set<LanguageType> repl_languages; - if (auto single_lang = repl_languages.GetSingularLanguage()) { - language = *single_lang; - } else if (repl_languages.Empty()) { + Language::GetLanguagesSupportingREPLs(repl_languages); + + if (repl_languages.size() == 1) { + language = *repl_languages.begin(); + } else if (repl_languages.empty()) { err.SetErrorStringWithFormat( "LLDB isn't configured with REPL support for any languages."); return err; diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp index 80b64fb832f..e0026e3d001 100644 --- a/lldb/source/Core/PluginManager.cpp +++ b/lldb/source/Core/PluginManager.cpp @@ -2083,11 +2083,12 @@ PluginManager::GetInstrumentationRuntimeCreateCallbackForPluginName( #pragma mark TypeSystem struct TypeSystemInstance { + TypeSystemInstance() : name(), description(), create_callback(nullptr) {} + ConstString name; std::string description; TypeSystemCreateInstance create_callback; - LanguageSet supported_languages_for_types; - LanguageSet supported_languages_for_expressions; + TypeSystemEnumerateSupportedLanguages enumerate_callback; }; typedef std::vector<TypeSystemInstance> TypeSystemInstances; @@ -2102,11 +2103,11 @@ static TypeSystemInstances &GetTypeSystemInstances() { return g_instances; } -bool PluginManager::RegisterPlugin( - ConstString name, const char *description, - TypeSystemCreateInstance create_callback, - LanguageSet supported_languages_for_types, - LanguageSet supported_languages_for_expressions) { +bool PluginManager::RegisterPlugin(ConstString name, + const char *description, + TypeSystemCreateInstance create_callback, + TypeSystemEnumerateSupportedLanguages + enumerate_supported_languages_callback) { if (create_callback) { TypeSystemInstance instance; assert((bool)name); @@ -2114,8 +2115,7 @@ bool PluginManager::RegisterPlugin( if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - instance.supported_languages_for_types = supported_languages_for_types; - instance.supported_languages_for_expressions = supported_languages_for_expressions; + instance.enumerate_callback = enumerate_supported_languages_callback; std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex()); GetTypeSystemInstances().push_back(instance); } @@ -2163,22 +2163,30 @@ PluginManager::GetTypeSystemCreateCallbackForPluginName( return nullptr; } -LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForTypes() { +TypeSystemEnumerateSupportedLanguages +PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex( + uint32_t idx) { std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex()); - LanguageSet all; TypeSystemInstances &instances = GetTypeSystemInstances(); - for (unsigned i = 0; i < instances.size(); ++i) - all.bitvector |= instances[i].supported_languages_for_types.bitvector; - return all; + if (idx < instances.size()) + return instances[idx].enumerate_callback; + return nullptr; } -LanguageSet PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions() { - std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex()); - LanguageSet all; - TypeSystemInstances &instances = GetTypeSystemInstances(); - for (unsigned i = 0; i < instances.size(); ++i) - all.bitvector |= instances[i].supported_languages_for_expressions.bitvector; - return all; +TypeSystemEnumerateSupportedLanguages +PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackForPluginName( + ConstString name) { + if (name) { + std::lock_guard<std::recursive_mutex> guard(GetTypeSystemMutex()); + TypeSystemInstances &instances = GetTypeSystemInstances(); + + TypeSystemInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++pos) { + if (name == pos->name) + return pos->enumerate_callback; + } + } + return nullptr; } #pragma mark REPL @@ -2189,7 +2197,7 @@ struct REPLInstance { ConstString name; std::string description; REPLCreateInstance create_callback; - LanguageSet supported_languages; + REPLEnumerateSupportedLanguages enumerate_languages_callback; }; typedef std::vector<REPLInstance> REPLInstances; @@ -2204,9 +2212,10 @@ static REPLInstances &GetREPLInstances() { return g_instances; } -bool PluginManager::RegisterPlugin(ConstString name, const char *description, - REPLCreateInstance create_callback, - LanguageSet supported_languages) { +bool PluginManager::RegisterPlugin( + ConstString name, const char *description, + REPLCreateInstance create_callback, + REPLEnumerateSupportedLanguages enumerate_languages_callback) { if (create_callback) { REPLInstance instance; assert((bool)name); @@ -2214,7 +2223,7 @@ bool PluginManager::RegisterPlugin(ConstString name, const char *description, if (description && description[0]) instance.description = description; instance.create_callback = create_callback; - instance.supported_languages = supported_languages; + instance.enumerate_languages_callback = enumerate_languages_callback; std::lock_guard<std::recursive_mutex> guard(GetREPLMutex()); GetREPLInstances().push_back(instance); } @@ -2260,13 +2269,29 @@ PluginManager::GetREPLCreateCallbackForPluginName(ConstString name) { return nullptr; } -LanguageSet PluginManager::GetREPLAllTypeSystemSupportedLanguages() { +REPLEnumerateSupportedLanguages +PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(uint32_t idx) { std::lock_guard<std::recursive_mutex> guard(GetREPLMutex()); - LanguageSet all; REPLInstances &instances = GetREPLInstances(); - for (unsigned i = 0; i < instances.size(); ++i) - all.bitvector |= instances[i].supported_languages.bitvector; - return all; + if (idx < instances.size()) + return instances[idx].enumerate_languages_callback; + return nullptr; +} + +REPLEnumerateSupportedLanguages +PluginManager::GetREPLSystemEnumerateSupportedLanguagesCallbackForPluginName( + ConstString name) { + if (name) { + std::lock_guard<std::recursive_mutex> guard(GetREPLMutex()); + REPLInstances &instances = GetREPLInstances(); + + REPLInstances::iterator pos, end = instances.end(); + for (pos = instances.begin(); pos != end; ++pos) { + if (name == pos->name) + return pos->enumerate_languages_callback; + } + } + return nullptr; } #pragma mark PluginManager diff --git a/lldb/source/Interpreter/OptionValueLanguage.cpp b/lldb/source/Interpreter/OptionValueLanguage.cpp index 1d7e18868b6..d935d5e2349 100644 --- a/lldb/source/Interpreter/OptionValueLanguage.cpp +++ b/lldb/source/Interpreter/OptionValueLanguage.cpp @@ -10,7 +10,6 @@ #include "lldb/DataFormatters/FormatManager.h" #include "lldb/Target/Language.h" -#include "lldb/Symbol/TypeSystem.h" #include "lldb/Utility/Args.h" #include "lldb/Utility/Stream.h" @@ -40,20 +39,23 @@ Status OptionValueLanguage::SetValueFromString(llvm::StringRef value, case eVarSetOperationReplace: case eVarSetOperationAssign: { ConstString lang_name(value.trim()); - LanguageSet languages_for_types = Language::GetLanguagesSupportingTypeSystems(); + std::set<lldb::LanguageType> languages_for_types; + std::set<lldb::LanguageType> languages_for_expressions; + Language::GetLanguagesSupportingTypeSystems(languages_for_types, + languages_for_expressions); + LanguageType new_type = Language::GetLanguageTypeFromString(lang_name.GetStringRef()); - if (new_type && languages_for_types[new_type]) { + if (new_type && languages_for_types.count(new_type)) { m_value_was_set = true; m_current_value = new_type; } else { StreamString error_strm; error_strm.Printf("invalid language type '%s', ", value.str().c_str()); error_strm.Printf("valid values are:\n"); - for (int bit : languages_for_types.bitvector.set_bits()) { - auto language = (LanguageType)bit; - error_strm.Printf(" %s\n", - Language::GetNameForLanguageType(language)); + for (lldb::LanguageType language : languages_for_types) { + error_strm.Printf("%s%s%s", " ", + Language::GetNameForLanguageType(language), "\n"); } error.SetErrorString(error_strm.GetString()); } diff --git a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp index 494e2d487c7..d5f51458eb1 100644 --- a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp +++ b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.cpp @@ -319,8 +319,7 @@ uint32_t SymbolFileBreakpad::FindTypes( } size_t SymbolFileBreakpad::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, - TypeMap &types) { + bool append, TypeMap &types) { if (!append) types.Clear(); return types.GetSize(); diff --git a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h index c066ae30ec8..def975efc94 100644 --- a/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h +++ b/lldb/source/Plugins/SymbolFile/Breakpad/SymbolFileBreakpad.h @@ -116,8 +116,8 @@ public: llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) override; - size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, TypeMap &types) override; + size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, bool append, + TypeMap &types) override; llvm::Expected<TypeSystem &> GetTypeSystemForLanguage(lldb::LanguageType language) override { diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp index 8956a4f5c0f..5ef46ef3239 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -148,10 +148,7 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) { die.GetDeclContext(decl_context); TypeMap dwo_types; - // The type in the Clang module must have the same langage as the current CU. - LanguageSet languages; - languages.Insert(die.GetCU()->GetLanguageType()); - if (!dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, languages, true, + if (!dwo_module_sp->GetSymbolFile()->FindTypes(decl_context, true, dwo_types)) { if (!IsClangModuleFwdDecl(die)) return TypeSP(); @@ -162,8 +159,8 @@ TypeSP DWARFASTParserClang::ParseTypeFromDWO(const DWARFDIE &die, Log *log) { for (const auto &name_module : sym_file.getExternalTypeModules()) { if (!name_module.second) continue; - if (name_module.second->GetSymbolFile()->FindTypes( - decl_context, languages, true, dwo_types)) + if (name_module.second->GetSymbolFile()->FindTypes(decl_context, true, + dwo_types)) break; } } diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp index 6b357c249ce..ba63b41a581 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2485,8 +2485,7 @@ uint32_t SymbolFileDWARF::FindTypes( } size_t SymbolFileDWARF::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, - TypeMap &types) { + bool append, TypeMap &types) { std::lock_guard<std::recursive_mutex> guard(GetModuleMutex()); if (!append) types.Clear(); @@ -2509,9 +2508,6 @@ size_t SymbolFileDWARF::FindTypes(llvm::ArrayRef<CompilerContext> pattern, DWARFDIE die = GetDIE(die_ref); if (die) { - if (!languages[die.GetCU()->GetLanguageType()]) - continue; - llvm::SmallVector<CompilerContext, 4> die_context; die.GetDeclContext(die_context); if (!contextMatches(die_context, pattern)) diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h index 2a1eb8ab9ab..0d59013b014 100644 --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -185,8 +185,7 @@ public: lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, - lldb_private::LanguageSet languages, bool append, - lldb_private::TypeMap &types) override; + bool append, lldb_private::TypeMap &types) override; size_t GetTypes(lldb_private::SymbolContextScope *sc_scope, lldb::TypeClass type_mask, diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp index 05e48787cbe..32b13c950c0 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.cpp @@ -1270,10 +1270,7 @@ uint32_t SymbolFileNativePDB::FindTypes( } size_t SymbolFileNativePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, - TypeMap &types) { - if (!append) - types.Clear(); + bool append, TypeMap &types) { return 0; } diff --git a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h index f2e840cdfc1..f64fb4f4252 100644 --- a/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h +++ b/lldb/source/Plugins/SymbolFile/NativePDB/SymbolFileNativePDB.h @@ -134,8 +134,8 @@ public: llvm::DenseSet<SymbolFile *> &searched_symbol_files, TypeMap &types) override; - size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, TypeMap &types) override; + size_t FindTypes(llvm::ArrayRef<CompilerContext> pattern, bool append, + TypeMap &types) override; llvm::Expected<TypeSystem &> GetTypeSystemForLanguage(lldb::LanguageType language) override; diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp index efd3b0cc940..51b84c4cae6 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp @@ -1585,10 +1585,7 @@ void SymbolFilePDB::FindTypesByName( } size_t SymbolFilePDB::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, - lldb_private::TypeMap &types) { - if (!append) - types.Clear(); + bool append, lldb_private::TypeMap &types) { return 0; } diff --git a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h index a360a18ae26..15eed0f9f6c 100644 --- a/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h +++ b/lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h @@ -133,8 +133,7 @@ public: lldb_private::TypeMap &types) override; size_t FindTypes(llvm::ArrayRef<lldb_private::CompilerContext> pattern, - lldb_private::LanguageSet languages, bool append, - lldb_private::TypeMap &types) override; + bool append, lldb_private::TypeMap &types) override; void FindTypesByRegex(const lldb_private::RegularExpression ®ex, uint32_t max_matches, lldb_private::TypeMap &types); diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index d1d9a7399f3..43b19fbd42a 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -734,36 +734,32 @@ lldb::TypeSystemSP ClangASTContext::CreateInstance(lldb::LanguageType language, return lldb::TypeSystemSP(); } -LanguageSet ClangASTContext::GetSupportedLanguagesForTypes() { - LanguageSet languages; - languages.Insert(lldb::eLanguageTypeC89); - languages.Insert(lldb::eLanguageTypeC); - languages.Insert(lldb::eLanguageTypeC11); - languages.Insert(lldb::eLanguageTypeC_plus_plus); - languages.Insert(lldb::eLanguageTypeC99); - languages.Insert(lldb::eLanguageTypeObjC); - languages.Insert(lldb::eLanguageTypeObjC_plus_plus); - languages.Insert(lldb::eLanguageTypeC_plus_plus_03); - languages.Insert(lldb::eLanguageTypeC_plus_plus_11); - languages.Insert(lldb::eLanguageTypeC11); - languages.Insert(lldb::eLanguageTypeC_plus_plus_14); - return languages; -} - -LanguageSet ClangASTContext::GetSupportedLanguagesForExpressions() { - LanguageSet languages; - languages.Insert(lldb::eLanguageTypeC_plus_plus); - languages.Insert(lldb::eLanguageTypeObjC_plus_plus); - languages.Insert(lldb::eLanguageTypeC_plus_plus_03); - languages.Insert(lldb::eLanguageTypeC_plus_plus_11); - languages.Insert(lldb::eLanguageTypeC_plus_plus_14); - return languages; +void ClangASTContext::EnumerateSupportedLanguages( + std::set<lldb::LanguageType> &languages_for_types, + std::set<lldb::LanguageType> &languages_for_expressions) { + static std::vector<lldb::LanguageType> s_supported_languages_for_types( + {lldb::eLanguageTypeC89, lldb::eLanguageTypeC, lldb::eLanguageTypeC11, + lldb::eLanguageTypeC_plus_plus, lldb::eLanguageTypeC99, + lldb::eLanguageTypeObjC, lldb::eLanguageTypeObjC_plus_plus, + lldb::eLanguageTypeC_plus_plus_03, lldb::eLanguageTypeC_plus_plus_11, + lldb::eLanguageTypeC11, lldb::eLanguageTypeC_plus_plus_14}); + + static std::vector<lldb::LanguageType> s_supported_languages_for_expressions( + {lldb::eLanguageTypeC_plus_plus, lldb::eLanguageTypeObjC_plus_plus, + lldb::eLanguageTypeC_plus_plus_03, lldb::eLanguageTypeC_plus_plus_11, + lldb::eLanguageTypeC_plus_plus_14}); + + languages_for_types.insert(s_supported_languages_for_types.begin(), + s_supported_languages_for_types.end()); + languages_for_expressions.insert( + s_supported_languages_for_expressions.begin(), + s_supported_languages_for_expressions.end()); } void ClangASTContext::Initialize() { - PluginManager::RegisterPlugin( - GetPluginNameStatic(), "clang base AST context plug-in", CreateInstance, - GetSupportedLanguagesForTypes(), GetSupportedLanguagesForExpressions()); + PluginManager::RegisterPlugin(GetPluginNameStatic(), + "clang base AST context plug-in", + CreateInstance, EnumerateSupportedLanguages); } void ClangASTContext::Terminate() { diff --git a/lldb/source/Symbol/SymbolFile.cpp b/lldb/source/Symbol/SymbolFile.cpp index b1fc8520d76..1cbfb4cb0b0 100644 --- a/lldb/source/Symbol/SymbolFile.cpp +++ b/lldb/source/Symbol/SymbolFile.cpp @@ -150,8 +150,7 @@ uint32_t SymbolFile::FindTypes( } size_t SymbolFile::FindTypes(llvm::ArrayRef<CompilerContext> pattern, - LanguageSet languages, bool append, - TypeMap &types) { + bool append, TypeMap &types) { if (!append) types.Clear(); return 0; diff --git a/lldb/source/Symbol/TypeSystem.cpp b/lldb/source/Symbol/TypeSystem.cpp index 7ce551fcf3e..e5fd7e52980 100644 --- a/lldb/source/Symbol/TypeSystem.cpp +++ b/lldb/source/Symbol/TypeSystem.cpp @@ -25,23 +25,6 @@ using namespace lldb_private; using namespace lldb; -/// A 64-bit SmallBitVector is only small up to 64-7 bits, and the -/// setBitsInMask interface wants to write full bytes. -static const size_t num_small_bitvector_bits = 64 - 8; -static_assert(eNumLanguageTypes < num_small_bitvector_bits, - "Languages bit vector is no longer small on 64 bit systems"); - -llvm::Optional<LanguageType> LanguageSet::GetSingularLanguage() { - if (bitvector.count() == 1) - return (LanguageType)bitvector.find_first(); - return {}; -} - -void LanguageSet::Insert(LanguageType language) { bitvector.set(language); } -size_t LanguageSet::Size() const { return bitvector.count(); } -bool LanguageSet::Empty() const { return bitvector.none(); } -bool LanguageSet::operator[](unsigned i) const { return bitvector[i]; } - TypeSystem::TypeSystem(LLVMCastKind kind) : m_kind(kind), m_sym_file(nullptr) {} TypeSystem::~TypeSystem() {} diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp index 43d0be0f737..3c3ef2841d4 100644 --- a/lldb/source/Target/Language.cpp +++ b/lldb/source/Target/Language.cpp @@ -357,16 +357,26 @@ std::set<lldb::LanguageType> Language::GetSupportedLanguages() { return supported_languages; } -LanguageSet Language::GetLanguagesSupportingTypeSystems() { - return PluginManager::GetAllTypeSystemSupportedLanguagesForTypes(); +void Language::GetLanguagesSupportingTypeSystems( + std::set<lldb::LanguageType> &languages, + std::set<lldb::LanguageType> &languages_for_expressions) { + uint32_t idx = 0; + + while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager:: + GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) { + (*enumerate)(languages, languages_for_expressions); + } } -LanguageSet Language::GetLanguagesSupportingTypeSystemsForExpressions() { - return PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions(); -} +void Language::GetLanguagesSupportingREPLs( + std::set<lldb::LanguageType> &languages) { + uint32_t idx = 0; -LanguageSet Language::GetLanguagesSupportingREPLs() { - return PluginManager::GetREPLAllTypeSystemSupportedLanguages(); + while (REPLEnumerateSupportedLanguages enumerate = + PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex( + idx++)) { + (*enumerate)(languages); + } } std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() { diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index 957b97e429d..2368fa18ce7 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -206,11 +206,13 @@ const lldb::ProcessSP &Target::GetProcessSP() const { return m_process_sp; } lldb::REPLSP Target::GetREPL(Status &err, lldb::LanguageType language, const char *repl_options, bool can_create) { if (language == eLanguageTypeUnknown) { - LanguageSet repl_languages = Language::GetLanguagesSupportingREPLs(); + std::set<LanguageType> repl_languages; - if (auto single_lang = repl_languages.GetSingularLanguage()) { - language = *single_lang; - } else if (repl_languages.Empty()) { + Language::GetLanguagesSupportingREPLs(repl_languages); + + if (repl_languages.size() == 1) { + language = *repl_languages.begin(); + } else if (repl_languages.size() == 0) { err.SetErrorStringWithFormat( "LLDB isn't configured with REPL support for any languages."); return REPLSP(); @@ -2127,18 +2129,23 @@ Target::GetScratchTypeSystemForLanguage(lldb::LanguageType language, if (language == eLanguageTypeMipsAssembler // GNU AS and LLVM use it for all // assembly code || language == eLanguageTypeUnknown) { - LanguageSet languages_for_expressions = - Language::GetLanguagesSupportingTypeSystemsForExpressions(); + std::set<lldb::LanguageType> languages_for_types; + std::set<lldb::LanguageType> languages_for_expressions; + + Language::GetLanguagesSupportingTypeSystems(languages_for_types, + languages_for_expressions); - if (languages_for_expressions[eLanguageTypeC]) { + if (languages_for_expressions.count(eLanguageTypeC)) { language = eLanguageTypeC; // LLDB's default. Override by setting the // target language. } else { - if (languages_for_expressions.Empty()) + if (languages_for_expressions.empty()) { return llvm::make_error<llvm::StringError>( "No expression support for any languages", llvm::inconvertibleErrorCode()); - language = (LanguageType)languages_for_expressions.bitvector.find_first(); + } else { + language = *languages_for_expressions.begin(); + } } } @@ -2152,19 +2159,21 @@ std::vector<TypeSystem *> Target::GetScratchTypeSystems(bool create_on_demand) { std::vector<TypeSystem *> scratch_type_systems; - LanguageSet languages_for_expressions = - Language::GetLanguagesSupportingTypeSystemsForExpressions(); + std::set<lldb::LanguageType> languages_for_types; + std::set<lldb::LanguageType> languages_for_expressions; + + Language::GetLanguagesSupportingTypeSystems(languages_for_types, + languages_for_expressions); - for (auto bit : languages_for_expressions.bitvector.set_bits()) { - auto language = (LanguageType)bit; + for (auto lang : languages_for_expressions) { auto type_system_or_err = - GetScratchTypeSystemForLanguage(language, create_on_demand); + GetScratchTypeSystemForLanguage(lang, create_on_demand); if (!type_system_or_err) LLDB_LOG_ERROR(lldb_private::GetLogIfAnyCategoriesSet(LIBLLDB_LOG_TARGET), type_system_or_err.takeError(), "Language '{}' has expression support but no scratch type " "system available", - Language::GetNameForLanguageType(language)); + Language::GetNameForLanguageType(lang)); else scratch_type_systems.emplace_back(&type_system_or_err.get()); } diff --git a/lldb/tools/lldb-test/lldb-test.cpp b/lldb/tools/lldb-test/lldb-test.cpp index 8459d4b8a28..5eaf006d128 100644 --- a/lldb/tools/lldb-test/lldb-test.cpp +++ b/lldb/tools/lldb-test/lldb-test.cpp @@ -26,7 +26,6 @@ #include "lldb/Symbol/TypeList.h" #include "lldb/Symbol/TypeMap.h" #include "lldb/Symbol/VariableList.h" -#include "lldb/Target/Language.h" #include "lldb/Target/Process.h" #include "lldb/Target/Target.h" #include "lldb/Utility/CleanUp.h" @@ -145,10 +144,6 @@ static cl::opt<std::string> CompilerContext( cl::desc("Specify a compiler context as \"kind:name,...\"."), cl::value_desc("context"), cl::sub(SymbolsSubcommand)); -static cl::opt<std::string> - Language("language", cl::desc("Specify a language type, like C99."), - cl::value_desc("language"), cl::sub(SymbolsSubcommand)); - static cl::list<FunctionNameType> FunctionNameFlags( "function-flags", cl::desc("Function search flags:"), cl::values(clEnumValN(eFunctionNameTypeAuto, "auto", @@ -512,17 +507,13 @@ Error opts::symbols::findTypes(lldb_private::Module &Module) { CompilerDeclContext *ContextPtr = ContextOr->IsValid() ? &*ContextOr : nullptr; - LanguageSet languages; - if (!Language.empty()) - languages.Insert(Language::GetLanguageTypeFromString(Language)); - DenseSet<SymbolFile *> SearchedFiles; TypeMap Map; if (!Name.empty()) Symfile.FindTypes(ConstString(Name), ContextPtr, true, UINT32_MAX, SearchedFiles, Map); else - Symfile.FindTypes(parseCompilerContext(), languages, true, Map); + Symfile.FindTypes(parseCompilerContext(), true, Map); outs() << formatv("Found {0} types:\n", Map.GetSize()); StreamString Stream; |

