15ffd83dbSDimitry Andric //===-- Language.cpp ------------------------------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include <functional>
100b57cec5SDimitry Andric #include <map>
110b57cec5SDimitry Andric #include <mutex>
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric #include "lldb/Target/Language.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #include "lldb/Core/PluginManager.h"
160b57cec5SDimitry Andric #include "lldb/Symbol/SymbolFile.h"
170b57cec5SDimitry Andric #include "lldb/Symbol/TypeList.h"
180b57cec5SDimitry Andric #include "lldb/Target/Target.h"
190b57cec5SDimitry Andric #include "lldb/Utility/Stream.h"
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric #include "llvm/Support/Threading.h"
220b57cec5SDimitry Andric 
230b57cec5SDimitry Andric using namespace lldb;
240b57cec5SDimitry Andric using namespace lldb_private;
250b57cec5SDimitry Andric using namespace lldb_private::formatters;
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric typedef std::unique_ptr<Language> LanguageUP;
280b57cec5SDimitry Andric typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
290b57cec5SDimitry Andric 
GetLanguagesMap()300b57cec5SDimitry Andric static LanguagesMap &GetLanguagesMap() {
310b57cec5SDimitry Andric   static LanguagesMap *g_map = nullptr;
320b57cec5SDimitry Andric   static llvm::once_flag g_initialize;
330b57cec5SDimitry Andric 
340b57cec5SDimitry Andric   llvm::call_once(g_initialize, [] {
350b57cec5SDimitry Andric     g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
360b57cec5SDimitry Andric                                 // destructor chain
370b57cec5SDimitry Andric   });
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   return *g_map;
400b57cec5SDimitry Andric }
GetLanguagesMutex()410b57cec5SDimitry Andric static std::mutex &GetLanguagesMutex() {
420b57cec5SDimitry Andric   static std::mutex *g_mutex = nullptr;
430b57cec5SDimitry Andric   static llvm::once_flag g_initialize;
440b57cec5SDimitry Andric 
450b57cec5SDimitry Andric   llvm::call_once(g_initialize, [] {
460b57cec5SDimitry Andric     g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
470b57cec5SDimitry Andric                                 // destructor chain
480b57cec5SDimitry Andric   });
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric   return *g_mutex;
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
FindPlugin(lldb::LanguageType language)530b57cec5SDimitry Andric Language *Language::FindPlugin(lldb::LanguageType language) {
540b57cec5SDimitry Andric   std::lock_guard<std::mutex> guard(GetLanguagesMutex());
550b57cec5SDimitry Andric   LanguagesMap &map(GetLanguagesMap());
560b57cec5SDimitry Andric   auto iter = map.find(language), end = map.end();
570b57cec5SDimitry Andric   if (iter != end)
580b57cec5SDimitry Andric     return iter->second.get();
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   Language *language_ptr = nullptr;
610b57cec5SDimitry Andric   LanguageCreateInstance create_callback;
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   for (uint32_t idx = 0;
640b57cec5SDimitry Andric        (create_callback =
650b57cec5SDimitry Andric             PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
660b57cec5SDimitry Andric        ++idx) {
670b57cec5SDimitry Andric     language_ptr = create_callback(language);
680b57cec5SDimitry Andric 
690b57cec5SDimitry Andric     if (language_ptr) {
700b57cec5SDimitry Andric       map[language] = std::unique_ptr<Language>(language_ptr);
710b57cec5SDimitry Andric       return language_ptr;
720b57cec5SDimitry Andric     }
730b57cec5SDimitry Andric   }
740b57cec5SDimitry Andric 
750b57cec5SDimitry Andric   return nullptr;
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
FindPlugin(llvm::StringRef file_path)780b57cec5SDimitry Andric Language *Language::FindPlugin(llvm::StringRef file_path) {
790b57cec5SDimitry Andric   Language *result = nullptr;
800b57cec5SDimitry Andric   ForEach([&result, file_path](Language *language) {
810b57cec5SDimitry Andric     if (language->IsSourceFile(file_path)) {
820b57cec5SDimitry Andric       result = language;
830b57cec5SDimitry Andric       return false;
840b57cec5SDimitry Andric     }
850b57cec5SDimitry Andric     return true;
860b57cec5SDimitry Andric   });
870b57cec5SDimitry Andric   return result;
880b57cec5SDimitry Andric }
890b57cec5SDimitry Andric 
FindPlugin(LanguageType language,llvm::StringRef file_path)900b57cec5SDimitry Andric Language *Language::FindPlugin(LanguageType language,
910b57cec5SDimitry Andric                                llvm::StringRef file_path) {
920b57cec5SDimitry Andric   Language *result = FindPlugin(language);
930b57cec5SDimitry Andric   // Finding a language by file path is slower, we so we use this as the
940b57cec5SDimitry Andric   // fallback.
950b57cec5SDimitry Andric   if (!result)
960b57cec5SDimitry Andric     result = FindPlugin(file_path);
970b57cec5SDimitry Andric   return result;
980b57cec5SDimitry Andric }
990b57cec5SDimitry Andric 
ForEach(std::function<bool (Language *)> callback)1000b57cec5SDimitry Andric void Language::ForEach(std::function<bool(Language *)> callback) {
1010b57cec5SDimitry Andric   // If we want to iterate over all languages, we first have to complete the
1020b57cec5SDimitry Andric   // LanguagesMap.
1030b57cec5SDimitry Andric   static llvm::once_flag g_initialize;
1040b57cec5SDimitry Andric   llvm::call_once(g_initialize, [] {
1050b57cec5SDimitry Andric     for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes;
1060b57cec5SDimitry Andric          ++lang) {
1070b57cec5SDimitry Andric       FindPlugin(static_cast<lldb::LanguageType>(lang));
1080b57cec5SDimitry Andric     }
1090b57cec5SDimitry Andric   });
1100b57cec5SDimitry Andric 
111349cc55cSDimitry Andric   // callback may call a method in Language that attempts to acquire the same
112349cc55cSDimitry Andric   // lock (such as Language::ForEach or Language::FindPlugin). To avoid a
113349cc55cSDimitry Andric   // deadlock, we do not use callback while holding the lock.
114349cc55cSDimitry Andric   std::vector<Language *> loaded_plugins;
115349cc55cSDimitry Andric   {
1160b57cec5SDimitry Andric     std::lock_guard<std::mutex> guard(GetLanguagesMutex());
1170b57cec5SDimitry Andric     LanguagesMap &map(GetLanguagesMap());
1180b57cec5SDimitry Andric     for (const auto &entry : map) {
119349cc55cSDimitry Andric       if (entry.second)
120349cc55cSDimitry Andric         loaded_plugins.push_back(entry.second.get());
121349cc55cSDimitry Andric     }
122349cc55cSDimitry Andric   }
123349cc55cSDimitry Andric 
124349cc55cSDimitry Andric   for (auto *lang : loaded_plugins) {
125349cc55cSDimitry Andric     if (!callback(lang))
1260b57cec5SDimitry Andric       break;
1270b57cec5SDimitry Andric   }
1280b57cec5SDimitry Andric }
1290b57cec5SDimitry Andric 
IsTopLevelFunction(Function & function)1300b57cec5SDimitry Andric bool Language::IsTopLevelFunction(Function &function) { return false; }
1310b57cec5SDimitry Andric 
GetFormatters()1320b57cec5SDimitry Andric lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
1330b57cec5SDimitry Andric 
GetHardcodedFormats()1340b57cec5SDimitry Andric HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
1350b57cec5SDimitry Andric   return {};
1360b57cec5SDimitry Andric }
1370b57cec5SDimitry Andric 
GetHardcodedSummaries()1380b57cec5SDimitry Andric HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
1390b57cec5SDimitry Andric   return {};
1400b57cec5SDimitry Andric }
1410b57cec5SDimitry Andric 
1420b57cec5SDimitry Andric HardcodedFormatters::HardcodedSyntheticFinder
GetHardcodedSynthetics()1430b57cec5SDimitry Andric Language::GetHardcodedSynthetics() {
1440b57cec5SDimitry Andric   return {};
1450b57cec5SDimitry Andric }
1460b57cec5SDimitry Andric 
147bdd1243dSDimitry Andric std::vector<FormattersMatchCandidate>
GetPossibleFormattersMatches(ValueObject & valobj,lldb::DynamicValueType use_dynamic)1480b57cec5SDimitry Andric Language::GetPossibleFormattersMatches(ValueObject &valobj,
1490b57cec5SDimitry Andric                                        lldb::DynamicValueType use_dynamic) {
1500b57cec5SDimitry Andric   return {};
1510b57cec5SDimitry Andric }
1520b57cec5SDimitry Andric 
1530b57cec5SDimitry Andric struct language_name_pair {
1540b57cec5SDimitry Andric   const char *name;
1550b57cec5SDimitry Andric   LanguageType type;
1560b57cec5SDimitry Andric };
1570b57cec5SDimitry Andric 
1580b57cec5SDimitry Andric struct language_name_pair language_names[] = {
1590b57cec5SDimitry Andric     // To allow GetNameForLanguageType to be a simple array lookup, the first
1600b57cec5SDimitry Andric     // part of this array must follow enum LanguageType exactly.
1610b57cec5SDimitry Andric     {"unknown", eLanguageTypeUnknown},
1620b57cec5SDimitry Andric     {"c89", eLanguageTypeC89},
1630b57cec5SDimitry Andric     {"c", eLanguageTypeC},
1640b57cec5SDimitry Andric     {"ada83", eLanguageTypeAda83},
1650b57cec5SDimitry Andric     {"c++", eLanguageTypeC_plus_plus},
1660b57cec5SDimitry Andric     {"cobol74", eLanguageTypeCobol74},
1670b57cec5SDimitry Andric     {"cobol85", eLanguageTypeCobol85},
1680b57cec5SDimitry Andric     {"fortran77", eLanguageTypeFortran77},
1690b57cec5SDimitry Andric     {"fortran90", eLanguageTypeFortran90},
1700b57cec5SDimitry Andric     {"pascal83", eLanguageTypePascal83},
1710b57cec5SDimitry Andric     {"modula2", eLanguageTypeModula2},
1720b57cec5SDimitry Andric     {"java", eLanguageTypeJava},
1730b57cec5SDimitry Andric     {"c99", eLanguageTypeC99},
1740b57cec5SDimitry Andric     {"ada95", eLanguageTypeAda95},
1750b57cec5SDimitry Andric     {"fortran95", eLanguageTypeFortran95},
1760b57cec5SDimitry Andric     {"pli", eLanguageTypePLI},
1770b57cec5SDimitry Andric     {"objective-c", eLanguageTypeObjC},
1780b57cec5SDimitry Andric     {"objective-c++", eLanguageTypeObjC_plus_plus},
1790b57cec5SDimitry Andric     {"upc", eLanguageTypeUPC},
1800b57cec5SDimitry Andric     {"d", eLanguageTypeD},
1810b57cec5SDimitry Andric     {"python", eLanguageTypePython},
1820b57cec5SDimitry Andric     {"opencl", eLanguageTypeOpenCL},
1830b57cec5SDimitry Andric     {"go", eLanguageTypeGo},
1840b57cec5SDimitry Andric     {"modula3", eLanguageTypeModula3},
1850b57cec5SDimitry Andric     {"haskell", eLanguageTypeHaskell},
1860b57cec5SDimitry Andric     {"c++03", eLanguageTypeC_plus_plus_03},
1870b57cec5SDimitry Andric     {"c++11", eLanguageTypeC_plus_plus_11},
1880b57cec5SDimitry Andric     {"ocaml", eLanguageTypeOCaml},
1890b57cec5SDimitry Andric     {"rust", eLanguageTypeRust},
1900b57cec5SDimitry Andric     {"c11", eLanguageTypeC11},
1910b57cec5SDimitry Andric     {"swift", eLanguageTypeSwift},
1920b57cec5SDimitry Andric     {"julia", eLanguageTypeJulia},
1930b57cec5SDimitry Andric     {"dylan", eLanguageTypeDylan},
1940b57cec5SDimitry Andric     {"c++14", eLanguageTypeC_plus_plus_14},
1950b57cec5SDimitry Andric     {"fortran03", eLanguageTypeFortran03},
1960b57cec5SDimitry Andric     {"fortran08", eLanguageTypeFortran08},
197fe013be4SDimitry Andric     {"renderscript", eLanguageTypeRenderScript},
198fe013be4SDimitry Andric     {"bliss", eLanguageTypeBLISS},
199fe013be4SDimitry Andric     {"kotlin", eLanguageTypeKotlin},
200fe013be4SDimitry Andric     {"zig", eLanguageTypeZig},
201fe013be4SDimitry Andric     {"crystal", eLanguageTypeCrystal},
202fe013be4SDimitry Andric     {"<invalid language>",
203fe013be4SDimitry Andric      static_cast<LanguageType>(
204fe013be4SDimitry Andric          0x0029)}, // Not yet taken by any language in the DWARF spec
205fe013be4SDimitry Andric                    // and thus has no entry in LanguageType
206fe013be4SDimitry Andric     {"c++17", eLanguageTypeC_plus_plus_17},
207fe013be4SDimitry Andric     {"c++20", eLanguageTypeC_plus_plus_20},
208fe013be4SDimitry Andric     {"c17", eLanguageTypeC17},
209fe013be4SDimitry Andric     {"fortran18", eLanguageTypeFortran18},
210fe013be4SDimitry Andric     {"ada2005", eLanguageTypeAda2005},
211fe013be4SDimitry Andric     {"ada2012", eLanguageTypeAda2012},
212fe013be4SDimitry Andric     {"HIP", eLanguageTypeHIP},
213fe013be4SDimitry Andric     {"assembly", eLanguageTypeAssembly},
214fe013be4SDimitry Andric     {"c-sharp", eLanguageTypeC_sharp},
215fe013be4SDimitry Andric     {"mojo", eLanguageTypeMojo},
2160b57cec5SDimitry Andric     // Vendor Extensions
217fe6060f1SDimitry Andric     {"assembler", eLanguageTypeMipsAssembler},
2180b57cec5SDimitry Andric     // Now synonyms, in arbitrary order
2190b57cec5SDimitry Andric     {"objc", eLanguageTypeObjC},
2200b57cec5SDimitry Andric     {"objc++", eLanguageTypeObjC_plus_plus},
2210b57cec5SDimitry Andric     {"pascal", eLanguageTypePascal83}};
2220b57cec5SDimitry Andric 
2230b57cec5SDimitry Andric static uint32_t num_languages =
2240b57cec5SDimitry Andric     sizeof(language_names) / sizeof(struct language_name_pair);
2250b57cec5SDimitry Andric 
GetLanguageTypeFromString(llvm::StringRef string)2260b57cec5SDimitry Andric LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
2270b57cec5SDimitry Andric   for (const auto &L : language_names) {
228fe6060f1SDimitry Andric     if (string.equals_insensitive(L.name))
2290b57cec5SDimitry Andric       return static_cast<LanguageType>(L.type);
2300b57cec5SDimitry Andric   }
2310b57cec5SDimitry Andric 
2320b57cec5SDimitry Andric   return eLanguageTypeUnknown;
2330b57cec5SDimitry Andric }
2340b57cec5SDimitry Andric 
GetNameForLanguageType(LanguageType language)2350b57cec5SDimitry Andric const char *Language::GetNameForLanguageType(LanguageType language) {
2360b57cec5SDimitry Andric   if (language < num_languages)
2370b57cec5SDimitry Andric     return language_names[language].name;
2380b57cec5SDimitry Andric   else
2390b57cec5SDimitry Andric     return language_names[eLanguageTypeUnknown].name;
2400b57cec5SDimitry Andric }
2410b57cec5SDimitry Andric 
PrintSupportedLanguagesForExpressions(Stream & s,llvm::StringRef prefix,llvm::StringRef suffix)242bdd1243dSDimitry Andric void Language::PrintSupportedLanguagesForExpressions(Stream &s,
243bdd1243dSDimitry Andric                                                      llvm::StringRef prefix,
244bdd1243dSDimitry Andric                                                      llvm::StringRef suffix) {
245bdd1243dSDimitry Andric   auto supported = Language::GetLanguagesSupportingTypeSystemsForExpressions();
246bdd1243dSDimitry Andric   for (size_t idx = 0; idx < num_languages; ++idx) {
247bdd1243dSDimitry Andric     auto const &lang = language_names[idx];
248bdd1243dSDimitry Andric     if (supported[lang.type])
249bdd1243dSDimitry Andric       s << prefix << lang.name << suffix;
250bdd1243dSDimitry Andric   }
251bdd1243dSDimitry Andric }
252bdd1243dSDimitry Andric 
PrintAllLanguages(Stream & s,const char * prefix,const char * suffix)2530b57cec5SDimitry Andric void Language::PrintAllLanguages(Stream &s, const char *prefix,
2540b57cec5SDimitry Andric                                  const char *suffix) {
2550b57cec5SDimitry Andric   for (uint32_t i = 1; i < num_languages; i++) {
2560b57cec5SDimitry Andric     s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
2570b57cec5SDimitry Andric   }
2580b57cec5SDimitry Andric }
2590b57cec5SDimitry Andric 
ForAllLanguages(std::function<bool (lldb::LanguageType)> callback)2600b57cec5SDimitry Andric void Language::ForAllLanguages(
2610b57cec5SDimitry Andric     std::function<bool(lldb::LanguageType)> callback) {
2620b57cec5SDimitry Andric   for (uint32_t i = 1; i < num_languages; i++) {
2630b57cec5SDimitry Andric     if (!callback(language_names[i].type))
2640b57cec5SDimitry Andric       break;
2650b57cec5SDimitry Andric   }
2660b57cec5SDimitry Andric }
2670b57cec5SDimitry Andric 
LanguageIsCPlusPlus(LanguageType language)2680b57cec5SDimitry Andric bool Language::LanguageIsCPlusPlus(LanguageType language) {
2690b57cec5SDimitry Andric   switch (language) {
2700b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus:
2710b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_03:
2720b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_11:
2730b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_14:
274fe013be4SDimitry Andric   case eLanguageTypeC_plus_plus_17:
275fe013be4SDimitry Andric   case eLanguageTypeC_plus_plus_20:
2760b57cec5SDimitry Andric   case eLanguageTypeObjC_plus_plus:
2770b57cec5SDimitry Andric     return true;
2780b57cec5SDimitry Andric   default:
2790b57cec5SDimitry Andric     return false;
2800b57cec5SDimitry Andric   }
2810b57cec5SDimitry Andric }
2820b57cec5SDimitry Andric 
LanguageIsObjC(LanguageType language)2830b57cec5SDimitry Andric bool Language::LanguageIsObjC(LanguageType language) {
2840b57cec5SDimitry Andric   switch (language) {
2850b57cec5SDimitry Andric   case eLanguageTypeObjC:
2860b57cec5SDimitry Andric   case eLanguageTypeObjC_plus_plus:
2870b57cec5SDimitry Andric     return true;
2880b57cec5SDimitry Andric   default:
2890b57cec5SDimitry Andric     return false;
2900b57cec5SDimitry Andric   }
2910b57cec5SDimitry Andric }
2920b57cec5SDimitry Andric 
LanguageIsC(LanguageType language)2930b57cec5SDimitry Andric bool Language::LanguageIsC(LanguageType language) {
2940b57cec5SDimitry Andric   switch (language) {
2950b57cec5SDimitry Andric   case eLanguageTypeC:
2960b57cec5SDimitry Andric   case eLanguageTypeC89:
2970b57cec5SDimitry Andric   case eLanguageTypeC99:
2980b57cec5SDimitry Andric   case eLanguageTypeC11:
2990b57cec5SDimitry Andric     return true;
3000b57cec5SDimitry Andric   default:
3010b57cec5SDimitry Andric     return false;
3020b57cec5SDimitry Andric   }
3030b57cec5SDimitry Andric }
3040b57cec5SDimitry Andric 
LanguageIsCFamily(LanguageType language)3050b57cec5SDimitry Andric bool Language::LanguageIsCFamily(LanguageType language) {
3060b57cec5SDimitry Andric   switch (language) {
3070b57cec5SDimitry Andric   case eLanguageTypeC:
3080b57cec5SDimitry Andric   case eLanguageTypeC89:
3090b57cec5SDimitry Andric   case eLanguageTypeC99:
3100b57cec5SDimitry Andric   case eLanguageTypeC11:
3110b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus:
3120b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_03:
3130b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_11:
3140b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_14:
315fe013be4SDimitry Andric   case eLanguageTypeC_plus_plus_17:
316fe013be4SDimitry Andric   case eLanguageTypeC_plus_plus_20:
3170b57cec5SDimitry Andric   case eLanguageTypeObjC_plus_plus:
3180b57cec5SDimitry Andric   case eLanguageTypeObjC:
3190b57cec5SDimitry Andric     return true;
3200b57cec5SDimitry Andric   default:
3210b57cec5SDimitry Andric     return false;
3220b57cec5SDimitry Andric   }
3230b57cec5SDimitry Andric }
3240b57cec5SDimitry Andric 
LanguageIsPascal(LanguageType language)3250b57cec5SDimitry Andric bool Language::LanguageIsPascal(LanguageType language) {
3260b57cec5SDimitry Andric   switch (language) {
3270b57cec5SDimitry Andric   case eLanguageTypePascal83:
3280b57cec5SDimitry Andric     return true;
3290b57cec5SDimitry Andric   default:
3300b57cec5SDimitry Andric     return false;
3310b57cec5SDimitry Andric   }
3320b57cec5SDimitry Andric }
3330b57cec5SDimitry Andric 
GetPrimaryLanguage(LanguageType language)3340b57cec5SDimitry Andric LanguageType Language::GetPrimaryLanguage(LanguageType language) {
3350b57cec5SDimitry Andric   switch (language) {
3360b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus:
3370b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_03:
3380b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_11:
3390b57cec5SDimitry Andric   case eLanguageTypeC_plus_plus_14:
340fe013be4SDimitry Andric   case eLanguageTypeC_plus_plus_17:
341fe013be4SDimitry Andric   case eLanguageTypeC_plus_plus_20:
3420b57cec5SDimitry Andric     return eLanguageTypeC_plus_plus;
3430b57cec5SDimitry Andric   case eLanguageTypeC:
3440b57cec5SDimitry Andric   case eLanguageTypeC89:
3450b57cec5SDimitry Andric   case eLanguageTypeC99:
3460b57cec5SDimitry Andric   case eLanguageTypeC11:
3470b57cec5SDimitry Andric     return eLanguageTypeC;
3480b57cec5SDimitry Andric   case eLanguageTypeObjC:
3490b57cec5SDimitry Andric   case eLanguageTypeObjC_plus_plus:
3500b57cec5SDimitry Andric     return eLanguageTypeObjC;
3510b57cec5SDimitry Andric   case eLanguageTypePascal83:
3520b57cec5SDimitry Andric   case eLanguageTypeCobol74:
3530b57cec5SDimitry Andric   case eLanguageTypeCobol85:
3540b57cec5SDimitry Andric   case eLanguageTypeFortran77:
3550b57cec5SDimitry Andric   case eLanguageTypeFortran90:
3560b57cec5SDimitry Andric   case eLanguageTypeFortran95:
3570b57cec5SDimitry Andric   case eLanguageTypeFortran03:
3580b57cec5SDimitry Andric   case eLanguageTypeFortran08:
3590b57cec5SDimitry Andric   case eLanguageTypeAda83:
3600b57cec5SDimitry Andric   case eLanguageTypeAda95:
3610b57cec5SDimitry Andric   case eLanguageTypeModula2:
3620b57cec5SDimitry Andric   case eLanguageTypeJava:
3630b57cec5SDimitry Andric   case eLanguageTypePLI:
3640b57cec5SDimitry Andric   case eLanguageTypeUPC:
3650b57cec5SDimitry Andric   case eLanguageTypeD:
3660b57cec5SDimitry Andric   case eLanguageTypePython:
3670b57cec5SDimitry Andric   case eLanguageTypeOpenCL:
3680b57cec5SDimitry Andric   case eLanguageTypeGo:
3690b57cec5SDimitry Andric   case eLanguageTypeModula3:
3700b57cec5SDimitry Andric   case eLanguageTypeHaskell:
3710b57cec5SDimitry Andric   case eLanguageTypeOCaml:
3720b57cec5SDimitry Andric   case eLanguageTypeRust:
3730b57cec5SDimitry Andric   case eLanguageTypeSwift:
3740b57cec5SDimitry Andric   case eLanguageTypeJulia:
3750b57cec5SDimitry Andric   case eLanguageTypeDylan:
3760b57cec5SDimitry Andric   case eLanguageTypeMipsAssembler:
377*c9157d92SDimitry Andric   case eLanguageTypeMojo:
3780b57cec5SDimitry Andric   case eLanguageTypeUnknown:
3790b57cec5SDimitry Andric   default:
3800b57cec5SDimitry Andric     return language;
3810b57cec5SDimitry Andric   }
3820b57cec5SDimitry Andric }
3830b57cec5SDimitry Andric 
GetSupportedLanguages()3840b57cec5SDimitry Andric std::set<lldb::LanguageType> Language::GetSupportedLanguages() {
3850b57cec5SDimitry Andric   std::set<lldb::LanguageType> supported_languages;
3860b57cec5SDimitry Andric   ForEach([&](Language *lang) {
3870b57cec5SDimitry Andric     supported_languages.emplace(lang->GetLanguageType());
3880b57cec5SDimitry Andric     return true;
3890b57cec5SDimitry Andric   });
3900b57cec5SDimitry Andric   return supported_languages;
3910b57cec5SDimitry Andric }
3920b57cec5SDimitry Andric 
GetLanguagesSupportingTypeSystems()3939dba64beSDimitry Andric LanguageSet Language::GetLanguagesSupportingTypeSystems() {
3949dba64beSDimitry Andric   return PluginManager::GetAllTypeSystemSupportedLanguagesForTypes();
3950b57cec5SDimitry Andric }
3960b57cec5SDimitry Andric 
GetLanguagesSupportingTypeSystemsForExpressions()3979dba64beSDimitry Andric LanguageSet Language::GetLanguagesSupportingTypeSystemsForExpressions() {
3989dba64beSDimitry Andric   return PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions();
3990b57cec5SDimitry Andric }
4009dba64beSDimitry Andric 
GetLanguagesSupportingREPLs()4019dba64beSDimitry Andric LanguageSet Language::GetLanguagesSupportingREPLs() {
4029dba64beSDimitry Andric   return PluginManager::GetREPLAllTypeSystemSupportedLanguages();
4030b57cec5SDimitry Andric }
4040b57cec5SDimitry Andric 
GetTypeScavenger()4050b57cec5SDimitry Andric std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
4060b57cec5SDimitry Andric   return nullptr;
4070b57cec5SDimitry Andric }
4080b57cec5SDimitry Andric 
GetLanguageSpecificTypeLookupHelp()4090b57cec5SDimitry Andric const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
4100b57cec5SDimitry Andric 
Find(ExecutionContextScope * exe_scope,const char * key,ResultSet & results,bool append)4110b57cec5SDimitry Andric size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
4120b57cec5SDimitry Andric                                      const char *key, ResultSet &results,
4130b57cec5SDimitry Andric                                      bool append) {
4140b57cec5SDimitry Andric   if (!exe_scope || !exe_scope->CalculateTarget().get())
4150b57cec5SDimitry Andric     return false;
4160b57cec5SDimitry Andric 
4170b57cec5SDimitry Andric   if (!key || !key[0])
4180b57cec5SDimitry Andric     return false;
4190b57cec5SDimitry Andric 
4200b57cec5SDimitry Andric   if (!append)
4210b57cec5SDimitry Andric     results.clear();
4220b57cec5SDimitry Andric 
4230b57cec5SDimitry Andric   size_t old_size = results.size();
4240b57cec5SDimitry Andric 
4250b57cec5SDimitry Andric   if (this->Find_Impl(exe_scope, key, results))
4260b57cec5SDimitry Andric     return results.size() - old_size;
4270b57cec5SDimitry Andric   return 0;
4280b57cec5SDimitry Andric }
4290b57cec5SDimitry Andric 
Find_Impl(ExecutionContextScope * exe_scope,const char * key,ResultSet & results)4300b57cec5SDimitry Andric bool Language::ImageListTypeScavenger::Find_Impl(
4310b57cec5SDimitry Andric     ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
4320b57cec5SDimitry Andric   bool result = false;
4330b57cec5SDimitry Andric 
4340b57cec5SDimitry Andric   Target *target = exe_scope->CalculateTarget().get();
4350b57cec5SDimitry Andric   if (target) {
4360b57cec5SDimitry Andric     const auto &images(target->GetImages());
437*c9157d92SDimitry Andric     TypeQuery query(key);
438*c9157d92SDimitry Andric     TypeResults type_results;
439*c9157d92SDimitry Andric     images.FindTypes(nullptr, query, type_results);
440*c9157d92SDimitry Andric     for (const auto &match : type_results.GetTypeMap().Types()) {
4410b57cec5SDimitry Andric       if (match) {
4420b57cec5SDimitry Andric         CompilerType compiler_type(match->GetFullCompilerType());
4430b57cec5SDimitry Andric         compiler_type = AdjustForInclusion(compiler_type);
4440b57cec5SDimitry Andric         if (!compiler_type)
4450b57cec5SDimitry Andric           continue;
4460b57cec5SDimitry Andric         std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
4470b57cec5SDimitry Andric             new Result(compiler_type));
4480b57cec5SDimitry Andric         results.insert(std::move(scavengeresult));
4490b57cec5SDimitry Andric         result = true;
4500b57cec5SDimitry Andric       }
4510b57cec5SDimitry Andric     }
4520b57cec5SDimitry Andric   }
4530b57cec5SDimitry Andric 
4540b57cec5SDimitry Andric   return result;
4550b57cec5SDimitry Andric }
4560b57cec5SDimitry Andric 
457fe013be4SDimitry Andric std::pair<llvm::StringRef, llvm::StringRef>
GetFormatterPrefixSuffix(llvm::StringRef type_hint)458fe013be4SDimitry Andric Language::GetFormatterPrefixSuffix(llvm::StringRef type_hint) {
459fe013be4SDimitry Andric   return std::pair<llvm::StringRef, llvm::StringRef>();
4600b57cec5SDimitry Andric }
4610b57cec5SDimitry Andric 
DemangledNameContainsPath(llvm::StringRef path,ConstString demangled) const46281ad6265SDimitry Andric bool Language::DemangledNameContainsPath(llvm::StringRef path,
46381ad6265SDimitry Andric                                          ConstString demangled) const {
46481ad6265SDimitry Andric   // The base implementation does a simple contains comparision:
46581ad6265SDimitry Andric   if (path.empty())
46681ad6265SDimitry Andric     return false;
46781ad6265SDimitry Andric   return demangled.GetStringRef().contains(path);
46881ad6265SDimitry Andric }
46981ad6265SDimitry Andric 
GetDeclPrintingHelper()4700b57cec5SDimitry Andric DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
4710b57cec5SDimitry Andric   return nullptr;
4720b57cec5SDimitry Andric }
4730b57cec5SDimitry Andric 
IsLogicalTrue(ValueObject & valobj,Status & error)4740b57cec5SDimitry Andric LazyBool Language::IsLogicalTrue(ValueObject &valobj, Status &error) {
4750b57cec5SDimitry Andric   return eLazyBoolCalculate;
4760b57cec5SDimitry Andric }
4770b57cec5SDimitry Andric 
IsNilReference(ValueObject & valobj)4780b57cec5SDimitry Andric bool Language::IsNilReference(ValueObject &valobj) { return false; }
4790b57cec5SDimitry Andric 
IsUninitializedReference(ValueObject & valobj)4800b57cec5SDimitry Andric bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
4810b57cec5SDimitry Andric 
GetFunctionDisplayName(const SymbolContext * sc,const ExecutionContext * exe_ctx,FunctionNameRepresentation representation,Stream & s)4820b57cec5SDimitry Andric bool Language::GetFunctionDisplayName(const SymbolContext *sc,
4830b57cec5SDimitry Andric                                       const ExecutionContext *exe_ctx,
4840b57cec5SDimitry Andric                                       FunctionNameRepresentation representation,
4850b57cec5SDimitry Andric                                       Stream &s) {
4860b57cec5SDimitry Andric   return false;
4870b57cec5SDimitry Andric }
4880b57cec5SDimitry Andric 
GetExceptionResolverDescription(bool catch_on,bool throw_on,Stream & s)4890b57cec5SDimitry Andric void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
4900b57cec5SDimitry Andric                                                Stream &s) {
4910b57cec5SDimitry Andric   GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
4920b57cec5SDimitry Andric }
4930b57cec5SDimitry Andric 
GetDefaultExceptionResolverDescription(bool catch_on,bool throw_on,Stream & s)4940b57cec5SDimitry Andric void Language::GetDefaultExceptionResolverDescription(bool catch_on,
4950b57cec5SDimitry Andric                                                       bool throw_on,
4960b57cec5SDimitry Andric                                                       Stream &s) {
4970b57cec5SDimitry Andric   s.Printf("Exception breakpoint (catch: %s throw: %s)",
4980b57cec5SDimitry Andric            catch_on ? "on" : "off", throw_on ? "on" : "off");
4990b57cec5SDimitry Andric }
5000b57cec5SDimitry Andric // Constructor
501fe6060f1SDimitry Andric Language::Language() = default;
5020b57cec5SDimitry Andric 
5030b57cec5SDimitry Andric // Destructor
504fe6060f1SDimitry Andric Language::~Language() = default;
505