1435933ddSDimitry Andric //===-- Language.cpp -------------------------------------------------*- C++
2435933ddSDimitry Andric //-*-===//
39f2f44ceSEd Maste //
49f2f44ceSEd Maste // The LLVM Compiler Infrastructure
59f2f44ceSEd Maste //
69f2f44ceSEd Maste // This file is distributed under the University of Illinois Open Source
79f2f44ceSEd Maste // License. See LICENSE.TXT for details.
89f2f44ceSEd Maste //
99f2f44ceSEd Maste //===----------------------------------------------------------------------===//
109f2f44ceSEd Maste
119f2f44ceSEd Maste #include <functional>
129f2f44ceSEd Maste #include <map>
139f2f44ceSEd Maste #include <mutex>
149f2f44ceSEd Maste
159f2f44ceSEd Maste #include "lldb/Target/Language.h"
169f2f44ceSEd Maste
179f2f44ceSEd Maste #include "lldb/Core/PluginManager.h"
18435933ddSDimitry Andric #include "lldb/Symbol/SymbolFile.h"
19435933ddSDimitry Andric #include "lldb/Symbol/TypeList.h"
20435933ddSDimitry Andric #include "lldb/Target/Target.h"
21f678e45dSDimitry Andric #include "lldb/Utility/Stream.h"
22f678e45dSDimitry Andric
23f678e45dSDimitry Andric #include "llvm/Support/Threading.h"
249f2f44ceSEd Maste
259f2f44ceSEd Maste using namespace lldb;
269f2f44ceSEd Maste using namespace lldb_private;
279f2f44ceSEd Maste using namespace lldb_private::formatters;
289f2f44ceSEd Maste
299f2f44ceSEd Maste typedef std::unique_ptr<Language> LanguageUP;
309f2f44ceSEd Maste typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
319f2f44ceSEd Maste
GetLanguagesMap()32435933ddSDimitry Andric static LanguagesMap &GetLanguagesMap() {
339f2f44ceSEd Maste static LanguagesMap *g_map = nullptr;
34f678e45dSDimitry Andric static llvm::once_flag g_initialize;
359f2f44ceSEd Maste
36f678e45dSDimitry Andric llvm::call_once(g_initialize, [] {
37435933ddSDimitry Andric g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
38435933ddSDimitry Andric // destructor chain
399f2f44ceSEd Maste });
409f2f44ceSEd Maste
419f2f44ceSEd Maste return *g_map;
429f2f44ceSEd Maste }
GetLanguagesMutex()43435933ddSDimitry Andric static std::mutex &GetLanguagesMutex() {
444bb0738eSEd Maste static std::mutex *g_mutex = nullptr;
45f678e45dSDimitry Andric static llvm::once_flag g_initialize;
469f2f44ceSEd Maste
47f678e45dSDimitry Andric llvm::call_once(g_initialize, [] {
48435933ddSDimitry Andric g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
49435933ddSDimitry Andric // destructor chain
509f2f44ceSEd Maste });
519f2f44ceSEd Maste
529f2f44ceSEd Maste return *g_mutex;
539f2f44ceSEd Maste }
549f2f44ceSEd Maste
FindPlugin(lldb::LanguageType language)55435933ddSDimitry Andric Language *Language::FindPlugin(lldb::LanguageType language) {
564bb0738eSEd Maste std::lock_guard<std::mutex> guard(GetLanguagesMutex());
579f2f44ceSEd Maste LanguagesMap &map(GetLanguagesMap());
589f2f44ceSEd Maste auto iter = map.find(language), end = map.end();
599f2f44ceSEd Maste if (iter != end)
609f2f44ceSEd Maste return iter->second.get();
619f2f44ceSEd Maste
629f2f44ceSEd Maste Language *language_ptr = nullptr;
639f2f44ceSEd Maste LanguageCreateInstance create_callback;
649f2f44ceSEd Maste
659f2f44ceSEd Maste for (uint32_t idx = 0;
66435933ddSDimitry Andric (create_callback =
67435933ddSDimitry Andric PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
68435933ddSDimitry Andric ++idx) {
699f2f44ceSEd Maste language_ptr = create_callback(language);
709f2f44ceSEd Maste
71435933ddSDimitry Andric if (language_ptr) {
729f2f44ceSEd Maste map[language] = std::unique_ptr<Language>(language_ptr);
739f2f44ceSEd Maste return language_ptr;
749f2f44ceSEd Maste }
759f2f44ceSEd Maste }
769f2f44ceSEd Maste
779f2f44ceSEd Maste return nullptr;
789f2f44ceSEd Maste }
799f2f44ceSEd Maste
FindPlugin(llvm::StringRef file_path)80*b5893f02SDimitry Andric Language *Language::FindPlugin(llvm::StringRef file_path) {
81*b5893f02SDimitry Andric Language *result = nullptr;
82*b5893f02SDimitry Andric ForEach([&result, file_path](Language *language) {
83*b5893f02SDimitry Andric if (language->IsSourceFile(file_path)) {
84*b5893f02SDimitry Andric result = language;
85*b5893f02SDimitry Andric return false;
86*b5893f02SDimitry Andric }
87*b5893f02SDimitry Andric return true;
88*b5893f02SDimitry Andric });
89*b5893f02SDimitry Andric return result;
90*b5893f02SDimitry Andric }
91*b5893f02SDimitry Andric
FindPlugin(LanguageType language,llvm::StringRef file_path)92*b5893f02SDimitry Andric Language *Language::FindPlugin(LanguageType language,
93*b5893f02SDimitry Andric llvm::StringRef file_path) {
94*b5893f02SDimitry Andric Language *result = FindPlugin(language);
95*b5893f02SDimitry Andric // Finding a language by file path is slower, we so we use this as the
96*b5893f02SDimitry Andric // fallback.
97*b5893f02SDimitry Andric if (!result)
98*b5893f02SDimitry Andric result = FindPlugin(file_path);
99*b5893f02SDimitry Andric return result;
100*b5893f02SDimitry Andric }
101*b5893f02SDimitry Andric
ForEach(std::function<bool (Language *)> callback)102435933ddSDimitry Andric void Language::ForEach(std::function<bool(Language *)> callback) {
103*b5893f02SDimitry Andric // If we want to iterate over all languages, we first have to complete the
104*b5893f02SDimitry Andric // LanguagesMap.
105*b5893f02SDimitry Andric static llvm::once_flag g_initialize;
106*b5893f02SDimitry Andric llvm::call_once(g_initialize, [] {
107*b5893f02SDimitry Andric for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes;
108*b5893f02SDimitry Andric ++lang) {
109*b5893f02SDimitry Andric FindPlugin(static_cast<lldb::LanguageType>(lang));
110*b5893f02SDimitry Andric }
111*b5893f02SDimitry Andric });
112*b5893f02SDimitry Andric
1134bb0738eSEd Maste std::lock_guard<std::mutex> guard(GetLanguagesMutex());
1149f2f44ceSEd Maste LanguagesMap &map(GetLanguagesMap());
115435933ddSDimitry Andric for (const auto &entry : map) {
1169f2f44ceSEd Maste if (!callback(entry.second.get()))
1179f2f44ceSEd Maste break;
1189f2f44ceSEd Maste }
1199f2f44ceSEd Maste }
1209f2f44ceSEd Maste
IsTopLevelFunction(Function & function)121435933ddSDimitry Andric bool Language::IsTopLevelFunction(Function &function) { return false; }
1229f2f44ceSEd Maste
GetFormatters()123435933ddSDimitry Andric lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
1249f2f44ceSEd Maste
GetHardcodedFormats()125435933ddSDimitry Andric HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
1269f2f44ceSEd Maste return {};
1279f2f44ceSEd Maste }
1289f2f44ceSEd Maste
GetHardcodedSummaries()129435933ddSDimitry Andric HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
1309f2f44ceSEd Maste return {};
1319f2f44ceSEd Maste }
1329f2f44ceSEd Maste
1339f2f44ceSEd Maste HardcodedFormatters::HardcodedSyntheticFinder
GetHardcodedSynthetics()134435933ddSDimitry Andric Language::GetHardcodedSynthetics() {
1359f2f44ceSEd Maste return {};
1369f2f44ceSEd Maste }
1379f2f44ceSEd Maste
1389f2f44ceSEd Maste HardcodedFormatters::HardcodedValidatorFinder
GetHardcodedValidators()139435933ddSDimitry Andric Language::GetHardcodedValidators() {
1409f2f44ceSEd Maste return {};
1419f2f44ceSEd Maste }
1429f2f44ceSEd Maste
1439f2f44ceSEd Maste std::vector<ConstString>
GetPossibleFormattersMatches(ValueObject & valobj,lldb::DynamicValueType use_dynamic)144435933ddSDimitry Andric Language::GetPossibleFormattersMatches(ValueObject &valobj,
145435933ddSDimitry Andric lldb::DynamicValueType use_dynamic) {
1469f2f44ceSEd Maste return {};
1479f2f44ceSEd Maste }
1489f2f44ceSEd Maste
1499f2f44ceSEd Maste lldb_private::formatters::StringPrinter::EscapingHelper
GetStringPrinterEscapingHelper(lldb_private::formatters::StringPrinter::GetPrintableElementType elem_type)150435933ddSDimitry Andric Language::GetStringPrinterEscapingHelper(
151435933ddSDimitry Andric lldb_private::formatters::StringPrinter::GetPrintableElementType
152435933ddSDimitry Andric elem_type) {
1539f2f44ceSEd Maste return StringPrinter::GetDefaultEscapingHelper(elem_type);
1549f2f44ceSEd Maste }
1559f2f44ceSEd Maste
1569f2f44ceSEd Maste struct language_name_pair {
1579f2f44ceSEd Maste const char *name;
1589f2f44ceSEd Maste LanguageType type;
1599f2f44ceSEd Maste };
1609f2f44ceSEd Maste
161435933ddSDimitry Andric struct language_name_pair language_names[] = {
1629f2f44ceSEd Maste // To allow GetNameForLanguageType to be a simple array lookup, the first
1639f2f44ceSEd Maste // part of this array must follow enum LanguageType exactly.
1649f2f44ceSEd Maste {"unknown", eLanguageTypeUnknown},
1659f2f44ceSEd Maste {"c89", eLanguageTypeC89},
1669f2f44ceSEd Maste {"c", eLanguageTypeC},
1679f2f44ceSEd Maste {"ada83", eLanguageTypeAda83},
1689f2f44ceSEd Maste {"c++", eLanguageTypeC_plus_plus},
1699f2f44ceSEd Maste {"cobol74", eLanguageTypeCobol74},
1709f2f44ceSEd Maste {"cobol85", eLanguageTypeCobol85},
1719f2f44ceSEd Maste {"fortran77", eLanguageTypeFortran77},
1729f2f44ceSEd Maste {"fortran90", eLanguageTypeFortran90},
1739f2f44ceSEd Maste {"pascal83", eLanguageTypePascal83},
1749f2f44ceSEd Maste {"modula2", eLanguageTypeModula2},
1759f2f44ceSEd Maste {"java", eLanguageTypeJava},
1769f2f44ceSEd Maste {"c99", eLanguageTypeC99},
1779f2f44ceSEd Maste {"ada95", eLanguageTypeAda95},
1789f2f44ceSEd Maste {"fortran95", eLanguageTypeFortran95},
1799f2f44ceSEd Maste {"pli", eLanguageTypePLI},
1809f2f44ceSEd Maste {"objective-c", eLanguageTypeObjC},
1819f2f44ceSEd Maste {"objective-c++", eLanguageTypeObjC_plus_plus},
1829f2f44ceSEd Maste {"upc", eLanguageTypeUPC},
1839f2f44ceSEd Maste {"d", eLanguageTypeD},
1849f2f44ceSEd Maste {"python", eLanguageTypePython},
1859f2f44ceSEd Maste {"opencl", eLanguageTypeOpenCL},
1869f2f44ceSEd Maste {"go", eLanguageTypeGo},
1879f2f44ceSEd Maste {"modula3", eLanguageTypeModula3},
1889f2f44ceSEd Maste {"haskell", eLanguageTypeHaskell},
1899f2f44ceSEd Maste {"c++03", eLanguageTypeC_plus_plus_03},
1909f2f44ceSEd Maste {"c++11", eLanguageTypeC_plus_plus_11},
1919f2f44ceSEd Maste {"ocaml", eLanguageTypeOCaml},
1929f2f44ceSEd Maste {"rust", eLanguageTypeRust},
1939f2f44ceSEd Maste {"c11", eLanguageTypeC11},
1949f2f44ceSEd Maste {"swift", eLanguageTypeSwift},
1959f2f44ceSEd Maste {"julia", eLanguageTypeJulia},
1969f2f44ceSEd Maste {"dylan", eLanguageTypeDylan},
1979f2f44ceSEd Maste {"c++14", eLanguageTypeC_plus_plus_14},
1989f2f44ceSEd Maste {"fortran03", eLanguageTypeFortran03},
1999f2f44ceSEd Maste {"fortran08", eLanguageTypeFortran08},
2009f2f44ceSEd Maste // Vendor Extensions
2019f2f44ceSEd Maste {"mipsassem", eLanguageTypeMipsAssembler},
2029f2f44ceSEd Maste {"renderscript", eLanguageTypeExtRenderScript},
2039f2f44ceSEd Maste // Now synonyms, in arbitrary order
2049f2f44ceSEd Maste {"objc", eLanguageTypeObjC},
2059f2f44ceSEd Maste {"objc++", eLanguageTypeObjC_plus_plus},
206435933ddSDimitry Andric {"pascal", eLanguageTypePascal83}};
2079f2f44ceSEd Maste
208435933ddSDimitry Andric static uint32_t num_languages =
209435933ddSDimitry Andric sizeof(language_names) / sizeof(struct language_name_pair);
2109f2f44ceSEd Maste
GetLanguageTypeFromString(llvm::StringRef string)211435933ddSDimitry Andric LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
212435933ddSDimitry Andric for (const auto &L : language_names) {
213435933ddSDimitry Andric if (string.equals_lower(L.name))
214435933ddSDimitry Andric return static_cast<LanguageType>(L.type);
2159f2f44ceSEd Maste }
216435933ddSDimitry Andric
2179f2f44ceSEd Maste return eLanguageTypeUnknown;
2189f2f44ceSEd Maste }
2199f2f44ceSEd Maste
GetNameForLanguageType(LanguageType language)220435933ddSDimitry Andric const char *Language::GetNameForLanguageType(LanguageType language) {
2219f2f44ceSEd Maste if (language < num_languages)
2229f2f44ceSEd Maste return language_names[language].name;
2239f2f44ceSEd Maste else
2249f2f44ceSEd Maste return language_names[eLanguageTypeUnknown].name;
2259f2f44ceSEd Maste }
2269f2f44ceSEd Maste
PrintAllLanguages(Stream & s,const char * prefix,const char * suffix)227435933ddSDimitry Andric void Language::PrintAllLanguages(Stream &s, const char *prefix,
228435933ddSDimitry Andric const char *suffix) {
229435933ddSDimitry Andric for (uint32_t i = 1; i < num_languages; i++) {
2309f2f44ceSEd Maste s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
2319f2f44ceSEd Maste }
2329f2f44ceSEd Maste }
2339f2f44ceSEd Maste
ForAllLanguages(std::function<bool (lldb::LanguageType)> callback)234435933ddSDimitry Andric void Language::ForAllLanguages(
235435933ddSDimitry Andric std::function<bool(lldb::LanguageType)> callback) {
236435933ddSDimitry Andric for (uint32_t i = 1; i < num_languages; i++) {
2379f2f44ceSEd Maste if (!callback(language_names[i].type))
2389f2f44ceSEd Maste break;
2399f2f44ceSEd Maste }
2409f2f44ceSEd Maste }
2419f2f44ceSEd Maste
LanguageIsCPlusPlus(LanguageType language)242435933ddSDimitry Andric bool Language::LanguageIsCPlusPlus(LanguageType language) {
243435933ddSDimitry Andric switch (language) {
2449f2f44ceSEd Maste case eLanguageTypeC_plus_plus:
2459f2f44ceSEd Maste case eLanguageTypeC_plus_plus_03:
2469f2f44ceSEd Maste case eLanguageTypeC_plus_plus_11:
2479f2f44ceSEd Maste case eLanguageTypeC_plus_plus_14:
2484bb0738eSEd Maste case eLanguageTypeObjC_plus_plus:
2499f2f44ceSEd Maste return true;
2509f2f44ceSEd Maste default:
2519f2f44ceSEd Maste return false;
2529f2f44ceSEd Maste }
2539f2f44ceSEd Maste }
2549f2f44ceSEd Maste
LanguageIsObjC(LanguageType language)255435933ddSDimitry Andric bool Language::LanguageIsObjC(LanguageType language) {
256435933ddSDimitry Andric switch (language) {
2579f2f44ceSEd Maste case eLanguageTypeObjC:
2589f2f44ceSEd Maste case eLanguageTypeObjC_plus_plus:
2599f2f44ceSEd Maste return true;
2609f2f44ceSEd Maste default:
2619f2f44ceSEd Maste return false;
2629f2f44ceSEd Maste }
2639f2f44ceSEd Maste }
2649f2f44ceSEd Maste
LanguageIsC(LanguageType language)265435933ddSDimitry Andric bool Language::LanguageIsC(LanguageType language) {
266435933ddSDimitry Andric switch (language) {
2679f2f44ceSEd Maste case eLanguageTypeC:
2689f2f44ceSEd Maste case eLanguageTypeC89:
2699f2f44ceSEd Maste case eLanguageTypeC99:
2709f2f44ceSEd Maste case eLanguageTypeC11:
2719f2f44ceSEd Maste return true;
2729f2f44ceSEd Maste default:
2739f2f44ceSEd Maste return false;
2749f2f44ceSEd Maste }
2759f2f44ceSEd Maste }
2769f2f44ceSEd Maste
LanguageIsPascal(LanguageType language)277435933ddSDimitry Andric bool Language::LanguageIsPascal(LanguageType language) {
278435933ddSDimitry Andric switch (language) {
2799f2f44ceSEd Maste case eLanguageTypePascal83:
2809f2f44ceSEd Maste return true;
2819f2f44ceSEd Maste default:
2829f2f44ceSEd Maste return false;
2839f2f44ceSEd Maste }
2849f2f44ceSEd Maste }
2859f2f44ceSEd Maste
GetPrimaryLanguage(LanguageType language)286435933ddSDimitry Andric LanguageType Language::GetPrimaryLanguage(LanguageType language) {
287435933ddSDimitry Andric switch (language) {
2889f2f44ceSEd Maste case eLanguageTypeC_plus_plus:
2899f2f44ceSEd Maste case eLanguageTypeC_plus_plus_03:
2909f2f44ceSEd Maste case eLanguageTypeC_plus_plus_11:
2919f2f44ceSEd Maste case eLanguageTypeC_plus_plus_14:
2929f2f44ceSEd Maste return eLanguageTypeC_plus_plus;
2939f2f44ceSEd Maste case eLanguageTypeC:
2949f2f44ceSEd Maste case eLanguageTypeC89:
2959f2f44ceSEd Maste case eLanguageTypeC99:
2969f2f44ceSEd Maste case eLanguageTypeC11:
2979f2f44ceSEd Maste return eLanguageTypeC;
2989f2f44ceSEd Maste case eLanguageTypeObjC:
2999f2f44ceSEd Maste case eLanguageTypeObjC_plus_plus:
3009f2f44ceSEd Maste return eLanguageTypeObjC;
3019f2f44ceSEd Maste case eLanguageTypePascal83:
3029f2f44ceSEd Maste case eLanguageTypeCobol74:
3039f2f44ceSEd Maste case eLanguageTypeCobol85:
3049f2f44ceSEd Maste case eLanguageTypeFortran77:
3059f2f44ceSEd Maste case eLanguageTypeFortran90:
3069f2f44ceSEd Maste case eLanguageTypeFortran95:
3079f2f44ceSEd Maste case eLanguageTypeFortran03:
3089f2f44ceSEd Maste case eLanguageTypeFortran08:
3099f2f44ceSEd Maste case eLanguageTypeAda83:
3109f2f44ceSEd Maste case eLanguageTypeAda95:
3119f2f44ceSEd Maste case eLanguageTypeModula2:
3129f2f44ceSEd Maste case eLanguageTypeJava:
3139f2f44ceSEd Maste case eLanguageTypePLI:
3149f2f44ceSEd Maste case eLanguageTypeUPC:
3159f2f44ceSEd Maste case eLanguageTypeD:
3169f2f44ceSEd Maste case eLanguageTypePython:
3179f2f44ceSEd Maste case eLanguageTypeOpenCL:
3189f2f44ceSEd Maste case eLanguageTypeGo:
3199f2f44ceSEd Maste case eLanguageTypeModula3:
3209f2f44ceSEd Maste case eLanguageTypeHaskell:
3219f2f44ceSEd Maste case eLanguageTypeOCaml:
3229f2f44ceSEd Maste case eLanguageTypeRust:
3239f2f44ceSEd Maste case eLanguageTypeSwift:
3249f2f44ceSEd Maste case eLanguageTypeJulia:
3259f2f44ceSEd Maste case eLanguageTypeDylan:
3269f2f44ceSEd Maste case eLanguageTypeMipsAssembler:
3279f2f44ceSEd Maste case eLanguageTypeExtRenderScript:
3289f2f44ceSEd Maste case eLanguageTypeUnknown:
3299f2f44ceSEd Maste default:
3309f2f44ceSEd Maste return language;
3319f2f44ceSEd Maste }
3329f2f44ceSEd Maste }
3339f2f44ceSEd Maste
GetLanguagesSupportingTypeSystems(std::set<lldb::LanguageType> & languages,std::set<lldb::LanguageType> & languages_for_expressions)334435933ddSDimitry Andric void Language::GetLanguagesSupportingTypeSystems(
335435933ddSDimitry Andric std::set<lldb::LanguageType> &languages,
336435933ddSDimitry Andric std::set<lldb::LanguageType> &languages_for_expressions) {
3379f2f44ceSEd Maste uint32_t idx = 0;
3389f2f44ceSEd Maste
339435933ddSDimitry Andric while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::
340435933ddSDimitry Andric GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) {
3419f2f44ceSEd Maste (*enumerate)(languages, languages_for_expressions);
3429f2f44ceSEd Maste }
3439f2f44ceSEd Maste }
3449f2f44ceSEd Maste
GetLanguagesSupportingREPLs(std::set<lldb::LanguageType> & languages)345435933ddSDimitry Andric void Language::GetLanguagesSupportingREPLs(
346435933ddSDimitry Andric std::set<lldb::LanguageType> &languages) {
3479f2f44ceSEd Maste uint32_t idx = 0;
3489f2f44ceSEd Maste
349435933ddSDimitry Andric while (REPLEnumerateSupportedLanguages enumerate =
350435933ddSDimitry Andric PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(
351435933ddSDimitry Andric idx++)) {
3529f2f44ceSEd Maste (*enumerate)(languages);
3539f2f44ceSEd Maste }
3549f2f44ceSEd Maste }
3559f2f44ceSEd Maste
GetTypeScavenger()356435933ddSDimitry Andric std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
3579f2f44ceSEd Maste return nullptr;
3589f2f44ceSEd Maste }
3599f2f44ceSEd Maste
GetLanguageSpecificTypeLookupHelp()360435933ddSDimitry Andric const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
3614bb0738eSEd Maste
Find(ExecutionContextScope * exe_scope,const char * key,ResultSet & results,bool append)362435933ddSDimitry Andric size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
363435933ddSDimitry Andric const char *key, ResultSet &results,
364435933ddSDimitry Andric bool append) {
3659f2f44ceSEd Maste if (!exe_scope || !exe_scope->CalculateTarget().get())
3669f2f44ceSEd Maste return false;
3679f2f44ceSEd Maste
3689f2f44ceSEd Maste if (!key || !key[0])
3699f2f44ceSEd Maste return false;
3709f2f44ceSEd Maste
3719f2f44ceSEd Maste if (!append)
3729f2f44ceSEd Maste results.clear();
3739f2f44ceSEd Maste
3749f2f44ceSEd Maste size_t old_size = results.size();
3759f2f44ceSEd Maste
3769f2f44ceSEd Maste if (this->Find_Impl(exe_scope, key, results))
3779f2f44ceSEd Maste return results.size() - old_size;
3789f2f44ceSEd Maste return 0;
3799f2f44ceSEd Maste }
3809f2f44ceSEd Maste
Find_Impl(ExecutionContextScope * exe_scope,const char * key,ResultSet & results)381435933ddSDimitry Andric bool Language::ImageListTypeScavenger::Find_Impl(
382435933ddSDimitry Andric ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
383435933ddSDimitry Andric bool result = false;
384435933ddSDimitry Andric
385435933ddSDimitry Andric Target *target = exe_scope->CalculateTarget().get();
386435933ddSDimitry Andric if (target) {
387435933ddSDimitry Andric const auto &images(target->GetImages());
388435933ddSDimitry Andric ConstString cs_key(key);
389435933ddSDimitry Andric llvm::DenseSet<SymbolFile *> searched_sym_files;
390435933ddSDimitry Andric TypeList matches;
391*b5893f02SDimitry Andric images.FindTypes(nullptr, cs_key, false, UINT32_MAX, searched_sym_files,
392435933ddSDimitry Andric matches);
393435933ddSDimitry Andric for (const auto &match : matches.Types()) {
394435933ddSDimitry Andric if (match.get()) {
395435933ddSDimitry Andric CompilerType compiler_type(match->GetFullCompilerType());
396435933ddSDimitry Andric compiler_type = AdjustForInclusion(compiler_type);
397435933ddSDimitry Andric if (!compiler_type)
398435933ddSDimitry Andric continue;
399435933ddSDimitry Andric std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
400435933ddSDimitry Andric new Result(compiler_type));
401435933ddSDimitry Andric results.insert(std::move(scavengeresult));
402435933ddSDimitry Andric result = true;
403435933ddSDimitry Andric }
404435933ddSDimitry Andric }
405435933ddSDimitry Andric }
406435933ddSDimitry Andric
407435933ddSDimitry Andric return result;
408435933ddSDimitry Andric }
409435933ddSDimitry Andric
GetFormatterPrefixSuffix(ValueObject & valobj,ConstString type_hint,std::string & prefix,std::string & suffix)410435933ddSDimitry Andric bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
411435933ddSDimitry Andric ConstString type_hint,
412435933ddSDimitry Andric std::string &prefix,
413435933ddSDimitry Andric std::string &suffix) {
4149f2f44ceSEd Maste return false;
4159f2f44ceSEd Maste }
4169f2f44ceSEd Maste
GetDeclPrintingHelper()417435933ddSDimitry Andric DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
4189f2f44ceSEd Maste return nullptr;
4199f2f44ceSEd Maste }
4209f2f44ceSEd Maste
IsLogicalTrue(ValueObject & valobj,Status & error)4215517e702SDimitry Andric LazyBool Language::IsLogicalTrue(ValueObject &valobj, Status &error) {
4229f2f44ceSEd Maste return eLazyBoolCalculate;
4239f2f44ceSEd Maste }
4249f2f44ceSEd Maste
IsNilReference(ValueObject & valobj)425435933ddSDimitry Andric bool Language::IsNilReference(ValueObject &valobj) { return false; }
4269f2f44ceSEd Maste
IsUninitializedReference(ValueObject & valobj)427435933ddSDimitry Andric bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
4289f2f44ceSEd Maste
GetFunctionDisplayName(const SymbolContext * sc,const ExecutionContext * exe_ctx,FunctionNameRepresentation representation,Stream & s)429435933ddSDimitry Andric bool Language::GetFunctionDisplayName(const SymbolContext *sc,
4309f2f44ceSEd Maste const ExecutionContext *exe_ctx,
4319f2f44ceSEd Maste FunctionNameRepresentation representation,
432435933ddSDimitry Andric Stream &s) {
4339f2f44ceSEd Maste return false;
4349f2f44ceSEd Maste }
4359f2f44ceSEd Maste
GetExceptionResolverDescription(bool catch_on,bool throw_on,Stream & s)436435933ddSDimitry Andric void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
437435933ddSDimitry Andric Stream &s) {
4389f2f44ceSEd Maste GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
4399f2f44ceSEd Maste }
4409f2f44ceSEd Maste
GetDefaultExceptionResolverDescription(bool catch_on,bool throw_on,Stream & s)441435933ddSDimitry Andric void Language::GetDefaultExceptionResolverDescription(bool catch_on,
442435933ddSDimitry Andric bool throw_on,
443435933ddSDimitry Andric Stream &s) {
4449f2f44ceSEd Maste s.Printf("Exception breakpoint (catch: %s throw: %s)",
445435933ddSDimitry Andric catch_on ? "on" : "off", throw_on ? "on" : "off");
4469f2f44ceSEd Maste }
4479f2f44ceSEd Maste //----------------------------------------------------------------------
4489f2f44ceSEd Maste // Constructor
4499f2f44ceSEd Maste //----------------------------------------------------------------------
Language()450435933ddSDimitry Andric Language::Language() {}
4519f2f44ceSEd Maste
4529f2f44ceSEd Maste //----------------------------------------------------------------------
4539f2f44ceSEd Maste // Destructor
4549f2f44ceSEd Maste //----------------------------------------------------------------------
~Language()455435933ddSDimitry Andric Language::~Language() {}
456