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