1b9c1b51eSKate Stone //===-- Language.cpp -------------------------------------------------*- C++ 2b9c1b51eSKate Stone //-*-===// 35f9d3106SEnrico Granata // 42946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 52946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 62946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 75f9d3106SEnrico Granata // 85f9d3106SEnrico Granata //===----------------------------------------------------------------------===// 95f9d3106SEnrico Granata 105f9d3106SEnrico Granata #include <functional> 115f9d3106SEnrico Granata #include <map> 122996d823SEnrico Granata #include <mutex> 135f9d3106SEnrico Granata 145f9d3106SEnrico Granata #include "lldb/Target/Language.h" 155f9d3106SEnrico Granata 165f9d3106SEnrico Granata #include "lldb/Core/PluginManager.h" 1763db2395SEnrico Granata #include "lldb/Symbol/SymbolFile.h" 1863db2395SEnrico Granata #include "lldb/Symbol/TypeList.h" 1963db2395SEnrico Granata #include "lldb/Target/Target.h" 20bf9a7730SZachary Turner #include "lldb/Utility/Stream.h" 215f9d3106SEnrico Granata 22c5f28e2aSKamil Rytarowski #include "llvm/Support/Threading.h" 23c5f28e2aSKamil Rytarowski 245f9d3106SEnrico Granata using namespace lldb; 255f9d3106SEnrico Granata using namespace lldb_private; 26ac49453bSEnrico Granata using namespace lldb_private::formatters; 275f9d3106SEnrico Granata 285f9d3106SEnrico Granata typedef std::unique_ptr<Language> LanguageUP; 295f9d3106SEnrico Granata typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap; 305f9d3106SEnrico Granata 31b9c1b51eSKate Stone static LanguagesMap &GetLanguagesMap() { 325f9d3106SEnrico Granata static LanguagesMap *g_map = nullptr; 33c5f28e2aSKamil Rytarowski static llvm::once_flag g_initialize; 345f9d3106SEnrico Granata 35c5f28e2aSKamil Rytarowski llvm::call_once(g_initialize, [] { 36b9c1b51eSKate Stone g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global 37b9c1b51eSKate Stone // destructor chain 385f9d3106SEnrico Granata }); 395f9d3106SEnrico Granata 405f9d3106SEnrico Granata return *g_map; 415f9d3106SEnrico Granata } 42b9c1b51eSKate Stone static std::mutex &GetLanguagesMutex() { 4316ff8604SSaleem Abdulrasool static std::mutex *g_mutex = nullptr; 44c5f28e2aSKamil Rytarowski static llvm::once_flag g_initialize; 455f9d3106SEnrico Granata 46c5f28e2aSKamil Rytarowski llvm::call_once(g_initialize, [] { 47b9c1b51eSKate Stone g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global 48b9c1b51eSKate Stone // destructor chain 495f9d3106SEnrico Granata }); 505f9d3106SEnrico Granata 515f9d3106SEnrico Granata return *g_mutex; 525f9d3106SEnrico Granata } 535f9d3106SEnrico Granata 54b9c1b51eSKate Stone Language *Language::FindPlugin(lldb::LanguageType language) { 5516ff8604SSaleem Abdulrasool std::lock_guard<std::mutex> guard(GetLanguagesMutex()); 565f9d3106SEnrico Granata LanguagesMap &map(GetLanguagesMap()); 575f9d3106SEnrico Granata auto iter = map.find(language), end = map.end(); 585f9d3106SEnrico Granata if (iter != end) 595f9d3106SEnrico Granata return iter->second.get(); 605f9d3106SEnrico Granata 615f9d3106SEnrico Granata Language *language_ptr = nullptr; 625f9d3106SEnrico Granata LanguageCreateInstance create_callback; 635f9d3106SEnrico Granata 645f9d3106SEnrico Granata for (uint32_t idx = 0; 65b9c1b51eSKate Stone (create_callback = 66b9c1b51eSKate Stone PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr; 67b9c1b51eSKate Stone ++idx) { 685f9d3106SEnrico Granata language_ptr = create_callback(language); 695f9d3106SEnrico Granata 70b9c1b51eSKate Stone if (language_ptr) { 715f9d3106SEnrico Granata map[language] = std::unique_ptr<Language>(language_ptr); 725f9d3106SEnrico Granata return language_ptr; 735f9d3106SEnrico Granata } 745f9d3106SEnrico Granata } 755f9d3106SEnrico Granata 765f9d3106SEnrico Granata return nullptr; 775f9d3106SEnrico Granata } 785f9d3106SEnrico Granata 79566afa0aSRaphael Isemann Language *Language::FindPlugin(llvm::StringRef file_path) { 80566afa0aSRaphael Isemann Language *result = nullptr; 81566afa0aSRaphael Isemann ForEach([&result, file_path](Language *language) { 82566afa0aSRaphael Isemann if (language->IsSourceFile(file_path)) { 83566afa0aSRaphael Isemann result = language; 84566afa0aSRaphael Isemann return false; 85566afa0aSRaphael Isemann } 86566afa0aSRaphael Isemann return true; 87566afa0aSRaphael Isemann }); 88566afa0aSRaphael Isemann return result; 89566afa0aSRaphael Isemann } 90566afa0aSRaphael Isemann 91566afa0aSRaphael Isemann Language *Language::FindPlugin(LanguageType language, 92566afa0aSRaphael Isemann llvm::StringRef file_path) { 93566afa0aSRaphael Isemann Language *result = FindPlugin(language); 94566afa0aSRaphael Isemann // Finding a language by file path is slower, we so we use this as the 95566afa0aSRaphael Isemann // fallback. 96566afa0aSRaphael Isemann if (!result) 97566afa0aSRaphael Isemann result = FindPlugin(file_path); 98566afa0aSRaphael Isemann return result; 99566afa0aSRaphael Isemann } 100566afa0aSRaphael Isemann 101b9c1b51eSKate Stone void Language::ForEach(std::function<bool(Language *)> callback) { 102566afa0aSRaphael Isemann // If we want to iterate over all languages, we first have to complete the 103566afa0aSRaphael Isemann // LanguagesMap. 104566afa0aSRaphael Isemann static llvm::once_flag g_initialize; 105566afa0aSRaphael Isemann llvm::call_once(g_initialize, [] { 106566afa0aSRaphael Isemann for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes; 107566afa0aSRaphael Isemann ++lang) { 108566afa0aSRaphael Isemann FindPlugin(static_cast<lldb::LanguageType>(lang)); 109566afa0aSRaphael Isemann } 110566afa0aSRaphael Isemann }); 111566afa0aSRaphael Isemann 11216ff8604SSaleem Abdulrasool std::lock_guard<std::mutex> guard(GetLanguagesMutex()); 1135f9d3106SEnrico Granata LanguagesMap &map(GetLanguagesMap()); 114b9c1b51eSKate Stone for (const auto &entry : map) { 1155f9d3106SEnrico Granata if (!callback(entry.second.get())) 1165f9d3106SEnrico Granata break; 1175f9d3106SEnrico Granata } 1185f9d3106SEnrico Granata } 1195f9d3106SEnrico Granata 120b9c1b51eSKate Stone bool Language::IsTopLevelFunction(Function &function) { return false; } 1216754e04fSEnrico Granata 122b9c1b51eSKate Stone lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; } 123980c0484SEnrico Granata 124b9c1b51eSKate Stone HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() { 1257cb59e1aSEnrico Granata return {}; 1267cb59e1aSEnrico Granata } 1277cb59e1aSEnrico Granata 128b9c1b51eSKate Stone HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() { 1297cb59e1aSEnrico Granata return {}; 1307cb59e1aSEnrico Granata } 1317cb59e1aSEnrico Granata 1327cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSyntheticFinder 133b9c1b51eSKate Stone Language::GetHardcodedSynthetics() { 1347cb59e1aSEnrico Granata return {}; 1357cb59e1aSEnrico Granata } 1367cb59e1aSEnrico Granata 1377cb59e1aSEnrico Granata HardcodedFormatters::HardcodedValidatorFinder 138b9c1b51eSKate Stone Language::GetHardcodedValidators() { 1397cb59e1aSEnrico Granata return {}; 1407cb59e1aSEnrico Granata } 1417cb59e1aSEnrico Granata 142d3233c1eSEnrico Granata std::vector<ConstString> 143b9c1b51eSKate Stone Language::GetPossibleFormattersMatches(ValueObject &valobj, 144b9c1b51eSKate Stone lldb::DynamicValueType use_dynamic) { 145d3233c1eSEnrico Granata return {}; 146d3233c1eSEnrico Granata } 147d3233c1eSEnrico Granata 148ac49453bSEnrico Granata lldb_private::formatters::StringPrinter::EscapingHelper 149b9c1b51eSKate Stone Language::GetStringPrinterEscapingHelper( 150b9c1b51eSKate Stone lldb_private::formatters::StringPrinter::GetPrintableElementType 151b9c1b51eSKate Stone elem_type) { 152ac49453bSEnrico Granata return StringPrinter::GetDefaultEscapingHelper(elem_type); 153ac49453bSEnrico Granata } 154ac49453bSEnrico Granata 1550e0984eeSJim Ingham struct language_name_pair { 1560e0984eeSJim Ingham const char *name; 1570e0984eeSJim Ingham LanguageType type; 1580e0984eeSJim Ingham }; 1590e0984eeSJim Ingham 160b9c1b51eSKate Stone struct language_name_pair language_names[] = { 1610e0984eeSJim Ingham // To allow GetNameForLanguageType to be a simple array lookup, the first 1620e0984eeSJim Ingham // part of this array must follow enum LanguageType exactly. 1630e0984eeSJim Ingham {"unknown", eLanguageTypeUnknown}, 1640e0984eeSJim Ingham {"c89", eLanguageTypeC89}, 1650e0984eeSJim Ingham {"c", eLanguageTypeC}, 1660e0984eeSJim Ingham {"ada83", eLanguageTypeAda83}, 1670e0984eeSJim Ingham {"c++", eLanguageTypeC_plus_plus}, 1680e0984eeSJim Ingham {"cobol74", eLanguageTypeCobol74}, 1690e0984eeSJim Ingham {"cobol85", eLanguageTypeCobol85}, 1700e0984eeSJim Ingham {"fortran77", eLanguageTypeFortran77}, 1710e0984eeSJim Ingham {"fortran90", eLanguageTypeFortran90}, 1720e0984eeSJim Ingham {"pascal83", eLanguageTypePascal83}, 1730e0984eeSJim Ingham {"modula2", eLanguageTypeModula2}, 1740e0984eeSJim Ingham {"java", eLanguageTypeJava}, 1750e0984eeSJim Ingham {"c99", eLanguageTypeC99}, 1760e0984eeSJim Ingham {"ada95", eLanguageTypeAda95}, 1770e0984eeSJim Ingham {"fortran95", eLanguageTypeFortran95}, 1780e0984eeSJim Ingham {"pli", eLanguageTypePLI}, 1790e0984eeSJim Ingham {"objective-c", eLanguageTypeObjC}, 1800e0984eeSJim Ingham {"objective-c++", eLanguageTypeObjC_plus_plus}, 1810e0984eeSJim Ingham {"upc", eLanguageTypeUPC}, 1820e0984eeSJim Ingham {"d", eLanguageTypeD}, 1830e0984eeSJim Ingham {"python", eLanguageTypePython}, 1840e0984eeSJim Ingham {"opencl", eLanguageTypeOpenCL}, 1850e0984eeSJim Ingham {"go", eLanguageTypeGo}, 1860e0984eeSJim Ingham {"modula3", eLanguageTypeModula3}, 1870e0984eeSJim Ingham {"haskell", eLanguageTypeHaskell}, 1880e0984eeSJim Ingham {"c++03", eLanguageTypeC_plus_plus_03}, 1890e0984eeSJim Ingham {"c++11", eLanguageTypeC_plus_plus_11}, 1900e0984eeSJim Ingham {"ocaml", eLanguageTypeOCaml}, 1910e0984eeSJim Ingham {"rust", eLanguageTypeRust}, 1920e0984eeSJim Ingham {"c11", eLanguageTypeC11}, 1930e0984eeSJim Ingham {"swift", eLanguageTypeSwift}, 1940e0984eeSJim Ingham {"julia", eLanguageTypeJulia}, 1950e0984eeSJim Ingham {"dylan", eLanguageTypeDylan}, 1960e0984eeSJim Ingham {"c++14", eLanguageTypeC_plus_plus_14}, 1970e0984eeSJim Ingham {"fortran03", eLanguageTypeFortran03}, 1980e0984eeSJim Ingham {"fortran08", eLanguageTypeFortran08}, 1990e0984eeSJim Ingham // Vendor Extensions 2000e0984eeSJim Ingham {"mipsassem", eLanguageTypeMipsAssembler}, 2010e0984eeSJim Ingham {"renderscript", eLanguageTypeExtRenderScript}, 2020e0984eeSJim Ingham // Now synonyms, in arbitrary order 2030e0984eeSJim Ingham {"objc", eLanguageTypeObjC}, 2040e0984eeSJim Ingham {"objc++", eLanguageTypeObjC_plus_plus}, 205b9c1b51eSKate Stone {"pascal", eLanguageTypePascal83}}; 2060e0984eeSJim Ingham 207b9c1b51eSKate Stone static uint32_t num_languages = 208b9c1b51eSKate Stone sizeof(language_names) / sizeof(struct language_name_pair); 2090e0984eeSJim Ingham 2106fa7681bSZachary Turner LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) { 2116fa7681bSZachary Turner for (const auto &L : language_names) { 2126fa7681bSZachary Turner if (string.equals_lower(L.name)) 2136fa7681bSZachary Turner return static_cast<LanguageType>(L.type); 2146fa7681bSZachary Turner } 2156fa7681bSZachary Turner 2160e0984eeSJim Ingham return eLanguageTypeUnknown; 2170e0984eeSJim Ingham } 2180e0984eeSJim Ingham 219b9c1b51eSKate Stone const char *Language::GetNameForLanguageType(LanguageType language) { 2200e0984eeSJim Ingham if (language < num_languages) 2210e0984eeSJim Ingham return language_names[language].name; 2220e0984eeSJim Ingham else 2230e0984eeSJim Ingham return language_names[eLanguageTypeUnknown].name; 2240e0984eeSJim Ingham } 2250e0984eeSJim Ingham 226b9c1b51eSKate Stone void Language::PrintAllLanguages(Stream &s, const char *prefix, 227b9c1b51eSKate Stone const char *suffix) { 228b9c1b51eSKate Stone for (uint32_t i = 1; i < num_languages; i++) { 2290e0984eeSJim Ingham s.Printf("%s%s%s", prefix, language_names[i].name, suffix); 2300e0984eeSJim Ingham } 2310e0984eeSJim Ingham } 2320e0984eeSJim Ingham 233b9c1b51eSKate Stone void Language::ForAllLanguages( 234b9c1b51eSKate Stone std::function<bool(lldb::LanguageType)> callback) { 235b9c1b51eSKate Stone for (uint32_t i = 1; i < num_languages; i++) { 23628b3831eSEnrico Granata if (!callback(language_names[i].type)) 23728b3831eSEnrico Granata break; 23828b3831eSEnrico Granata } 23928b3831eSEnrico Granata } 24028b3831eSEnrico Granata 241b9c1b51eSKate Stone bool Language::LanguageIsCPlusPlus(LanguageType language) { 242b9c1b51eSKate Stone switch (language) { 2430e0984eeSJim Ingham case eLanguageTypeC_plus_plus: 2440e0984eeSJim Ingham case eLanguageTypeC_plus_plus_03: 2450e0984eeSJim Ingham case eLanguageTypeC_plus_plus_11: 2460e0984eeSJim Ingham case eLanguageTypeC_plus_plus_14: 2477b3ef05aSSean Callanan case eLanguageTypeObjC_plus_plus: 2480e0984eeSJim Ingham return true; 2490e0984eeSJim Ingham default: 2500e0984eeSJim Ingham return false; 2510e0984eeSJim Ingham } 2520e0984eeSJim Ingham } 2530e0984eeSJim Ingham 254b9c1b51eSKate Stone bool Language::LanguageIsObjC(LanguageType language) { 255b9c1b51eSKate Stone switch (language) { 2560e0984eeSJim Ingham case eLanguageTypeObjC: 2570e0984eeSJim Ingham case eLanguageTypeObjC_plus_plus: 2580e0984eeSJim Ingham return true; 2590e0984eeSJim Ingham default: 2600e0984eeSJim Ingham return false; 2610e0984eeSJim Ingham } 2620e0984eeSJim Ingham } 2630e0984eeSJim Ingham 264b9c1b51eSKate Stone bool Language::LanguageIsC(LanguageType language) { 265b9c1b51eSKate Stone switch (language) { 2660e0984eeSJim Ingham case eLanguageTypeC: 2670e0984eeSJim Ingham case eLanguageTypeC89: 2680e0984eeSJim Ingham case eLanguageTypeC99: 2690e0984eeSJim Ingham case eLanguageTypeC11: 2700e0984eeSJim Ingham return true; 2710e0984eeSJim Ingham default: 2720e0984eeSJim Ingham return false; 2730e0984eeSJim Ingham } 2740e0984eeSJim Ingham } 2750e0984eeSJim Ingham 276*de2cc012SAdrian Prantl bool Language::LanguageIsCFamily(LanguageType language) { 277*de2cc012SAdrian Prantl switch (language) { 278*de2cc012SAdrian Prantl case eLanguageTypeC: 279*de2cc012SAdrian Prantl case eLanguageTypeC89: 280*de2cc012SAdrian Prantl case eLanguageTypeC99: 281*de2cc012SAdrian Prantl case eLanguageTypeC11: 282*de2cc012SAdrian Prantl case eLanguageTypeC_plus_plus: 283*de2cc012SAdrian Prantl case eLanguageTypeC_plus_plus_03: 284*de2cc012SAdrian Prantl case eLanguageTypeC_plus_plus_11: 285*de2cc012SAdrian Prantl case eLanguageTypeC_plus_plus_14: 286*de2cc012SAdrian Prantl case eLanguageTypeObjC_plus_plus: 287*de2cc012SAdrian Prantl case eLanguageTypeObjC: 288*de2cc012SAdrian Prantl return true; 289*de2cc012SAdrian Prantl default: 290*de2cc012SAdrian Prantl return false; 291*de2cc012SAdrian Prantl } 292*de2cc012SAdrian Prantl } 293*de2cc012SAdrian Prantl 294b9c1b51eSKate Stone bool Language::LanguageIsPascal(LanguageType language) { 295b9c1b51eSKate Stone switch (language) { 2960e0984eeSJim Ingham case eLanguageTypePascal83: 2970e0984eeSJim Ingham return true; 2980e0984eeSJim Ingham default: 2990e0984eeSJim Ingham return false; 3000e0984eeSJim Ingham } 3010e0984eeSJim Ingham } 3020e0984eeSJim Ingham 303b9c1b51eSKate Stone LanguageType Language::GetPrimaryLanguage(LanguageType language) { 304b9c1b51eSKate Stone switch (language) { 305bfd96183SDawn Perchik case eLanguageTypeC_plus_plus: 306bfd96183SDawn Perchik case eLanguageTypeC_plus_plus_03: 307bfd96183SDawn Perchik case eLanguageTypeC_plus_plus_11: 308bfd96183SDawn Perchik case eLanguageTypeC_plus_plus_14: 309bfd96183SDawn Perchik return eLanguageTypeC_plus_plus; 310bfd96183SDawn Perchik case eLanguageTypeC: 311bfd96183SDawn Perchik case eLanguageTypeC89: 312bfd96183SDawn Perchik case eLanguageTypeC99: 313bfd96183SDawn Perchik case eLanguageTypeC11: 314bfd96183SDawn Perchik return eLanguageTypeC; 315bfd96183SDawn Perchik case eLanguageTypeObjC: 316bfd96183SDawn Perchik case eLanguageTypeObjC_plus_plus: 317bfd96183SDawn Perchik return eLanguageTypeObjC; 318bfd96183SDawn Perchik case eLanguageTypePascal83: 319bfd96183SDawn Perchik case eLanguageTypeCobol74: 320bfd96183SDawn Perchik case eLanguageTypeCobol85: 321bfd96183SDawn Perchik case eLanguageTypeFortran77: 322bfd96183SDawn Perchik case eLanguageTypeFortran90: 323bfd96183SDawn Perchik case eLanguageTypeFortran95: 324bfd96183SDawn Perchik case eLanguageTypeFortran03: 325bfd96183SDawn Perchik case eLanguageTypeFortran08: 326bfd96183SDawn Perchik case eLanguageTypeAda83: 327bfd96183SDawn Perchik case eLanguageTypeAda95: 328bfd96183SDawn Perchik case eLanguageTypeModula2: 329bfd96183SDawn Perchik case eLanguageTypeJava: 330bfd96183SDawn Perchik case eLanguageTypePLI: 331bfd96183SDawn Perchik case eLanguageTypeUPC: 332bfd96183SDawn Perchik case eLanguageTypeD: 333bfd96183SDawn Perchik case eLanguageTypePython: 334bfd96183SDawn Perchik case eLanguageTypeOpenCL: 335bfd96183SDawn Perchik case eLanguageTypeGo: 336bfd96183SDawn Perchik case eLanguageTypeModula3: 337bfd96183SDawn Perchik case eLanguageTypeHaskell: 338bfd96183SDawn Perchik case eLanguageTypeOCaml: 339bfd96183SDawn Perchik case eLanguageTypeRust: 340bfd96183SDawn Perchik case eLanguageTypeSwift: 341bfd96183SDawn Perchik case eLanguageTypeJulia: 342bfd96183SDawn Perchik case eLanguageTypeDylan: 343bfd96183SDawn Perchik case eLanguageTypeMipsAssembler: 344bfd96183SDawn Perchik case eLanguageTypeExtRenderScript: 345bfd96183SDawn Perchik case eLanguageTypeUnknown: 346bfd96183SDawn Perchik default: 347bfd96183SDawn Perchik return language; 348bfd96183SDawn Perchik } 349bfd96183SDawn Perchik } 350bfd96183SDawn Perchik 351b9c1b51eSKate Stone void Language::GetLanguagesSupportingTypeSystems( 352b9c1b51eSKate Stone std::set<lldb::LanguageType> &languages, 353b9c1b51eSKate Stone std::set<lldb::LanguageType> &languages_for_expressions) { 354fe38c850SSean Callanan uint32_t idx = 0; 355fe38c850SSean Callanan 356b9c1b51eSKate Stone while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager:: 357b9c1b51eSKate Stone GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) { 358fe38c850SSean Callanan (*enumerate)(languages, languages_for_expressions); 359fe38c850SSean Callanan } 360fe38c850SSean Callanan } 361fe38c850SSean Callanan 362b9c1b51eSKate Stone void Language::GetLanguagesSupportingREPLs( 363b9c1b51eSKate Stone std::set<lldb::LanguageType> &languages) { 36493c0b003SSean Callanan uint32_t idx = 0; 36593c0b003SSean Callanan 366b9c1b51eSKate Stone while (REPLEnumerateSupportedLanguages enumerate = 367b9c1b51eSKate Stone PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex( 368b9c1b51eSKate Stone idx++)) { 36993c0b003SSean Callanan (*enumerate)(languages); 37093c0b003SSean Callanan } 37193c0b003SSean Callanan } 37293c0b003SSean Callanan 373b9c1b51eSKate Stone std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() { 3749b0af1b8SEnrico Granata return nullptr; 3759b0af1b8SEnrico Granata } 3769b0af1b8SEnrico Granata 377b9c1b51eSKate Stone const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; } 378701338a7SEnrico Granata 379b9c1b51eSKate Stone size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope, 380b9c1b51eSKate Stone const char *key, ResultSet &results, 381b9c1b51eSKate Stone bool append) { 3829b0af1b8SEnrico Granata if (!exe_scope || !exe_scope->CalculateTarget().get()) 3839b0af1b8SEnrico Granata return false; 3849b0af1b8SEnrico Granata 3859b0af1b8SEnrico Granata if (!key || !key[0]) 3869b0af1b8SEnrico Granata return false; 3879b0af1b8SEnrico Granata 3889b0af1b8SEnrico Granata if (!append) 3899b0af1b8SEnrico Granata results.clear(); 3909b0af1b8SEnrico Granata 3919b0af1b8SEnrico Granata size_t old_size = results.size(); 3929b0af1b8SEnrico Granata 3939b0af1b8SEnrico Granata if (this->Find_Impl(exe_scope, key, results)) 3949b0af1b8SEnrico Granata return results.size() - old_size; 3959b0af1b8SEnrico Granata return 0; 3969b0af1b8SEnrico Granata } 3979b0af1b8SEnrico Granata 39863db2395SEnrico Granata bool Language::ImageListTypeScavenger::Find_Impl( 39963db2395SEnrico Granata ExecutionContextScope *exe_scope, const char *key, ResultSet &results) { 40063db2395SEnrico Granata bool result = false; 40163db2395SEnrico Granata 40263db2395SEnrico Granata Target *target = exe_scope->CalculateTarget().get(); 40363db2395SEnrico Granata if (target) { 40463db2395SEnrico Granata const auto &images(target->GetImages()); 40563db2395SEnrico Granata ConstString cs_key(key); 40663db2395SEnrico Granata llvm::DenseSet<SymbolFile *> searched_sym_files; 40763db2395SEnrico Granata TypeList matches; 408576495e6SZachary Turner images.FindTypes(nullptr, cs_key, false, UINT32_MAX, searched_sym_files, 40963db2395SEnrico Granata matches); 41063db2395SEnrico Granata for (const auto &match : matches.Types()) { 41170355aceSJonas Devlieghere if (match) { 41263db2395SEnrico Granata CompilerType compiler_type(match->GetFullCompilerType()); 41363db2395SEnrico Granata compiler_type = AdjustForInclusion(compiler_type); 41463db2395SEnrico Granata if (!compiler_type) 41563db2395SEnrico Granata continue; 41663db2395SEnrico Granata std::unique_ptr<Language::TypeScavenger::Result> scavengeresult( 41763db2395SEnrico Granata new Result(compiler_type)); 41863db2395SEnrico Granata results.insert(std::move(scavengeresult)); 41963db2395SEnrico Granata result = true; 42063db2395SEnrico Granata } 42163db2395SEnrico Granata } 42263db2395SEnrico Granata } 42363db2395SEnrico Granata 42463db2395SEnrico Granata return result; 42563db2395SEnrico Granata } 42663db2395SEnrico Granata 427b9c1b51eSKate Stone bool Language::GetFormatterPrefixSuffix(ValueObject &valobj, 428b9c1b51eSKate Stone ConstString type_hint, 429b9c1b51eSKate Stone std::string &prefix, 430b9c1b51eSKate Stone std::string &suffix) { 431675f49bbSEnrico Granata return false; 432675f49bbSEnrico Granata } 433675f49bbSEnrico Granata 434b9c1b51eSKate Stone DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() { 435c8e7649aSEnrico Granata return nullptr; 436c8e7649aSEnrico Granata } 437c8e7649aSEnrico Granata 43897206d57SZachary Turner LazyBool Language::IsLogicalTrue(ValueObject &valobj, Status &error) { 439407b5c62SEnrico Granata return eLazyBoolCalculate; 440407b5c62SEnrico Granata } 441407b5c62SEnrico Granata 442b9c1b51eSKate Stone bool Language::IsNilReference(ValueObject &valobj) { return false; } 443608d67c1SEnrico Granata 444b9c1b51eSKate Stone bool Language::IsUninitializedReference(ValueObject &valobj) { return false; } 445608d67c1SEnrico Granata 446b9c1b51eSKate Stone bool Language::GetFunctionDisplayName(const SymbolContext *sc, 447293207ddSEnrico Granata const ExecutionContext *exe_ctx, 448d4129b47SEnrico Granata FunctionNameRepresentation representation, 449b9c1b51eSKate Stone Stream &s) { 450d4129b47SEnrico Granata return false; 451d4129b47SEnrico Granata } 452d4129b47SEnrico Granata 453b9c1b51eSKate Stone void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on, 454b9c1b51eSKate Stone Stream &s) { 455a2023571SJim Ingham GetDefaultExceptionResolverDescription(catch_on, throw_on, s); 456a2023571SJim Ingham } 457a2023571SJim Ingham 458b9c1b51eSKate Stone void Language::GetDefaultExceptionResolverDescription(bool catch_on, 459b9c1b51eSKate Stone bool throw_on, 460b9c1b51eSKate Stone Stream &s) { 461a2023571SJim Ingham s.Printf("Exception breakpoint (catch: %s throw: %s)", 462b9c1b51eSKate Stone catch_on ? "on" : "off", throw_on ? "on" : "off"); 463a2023571SJim Ingham } 4645f9d3106SEnrico Granata // Constructor 465b9c1b51eSKate Stone Language::Language() {} 4665f9d3106SEnrico Granata 4675f9d3106SEnrico Granata // Destructor 468b9c1b51eSKate Stone Language::~Language() {} 469