180814287SRaphael Isemann //===-- Language.cpp ------------------------------------------------------===//
25f9d3106SEnrico Granata //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f9d3106SEnrico Granata //
75f9d3106SEnrico Granata //===----------------------------------------------------------------------===//
85f9d3106SEnrico Granata 
95f9d3106SEnrico Granata #include <functional>
105f9d3106SEnrico Granata #include <map>
112996d823SEnrico Granata #include <mutex>
125f9d3106SEnrico Granata 
135f9d3106SEnrico Granata #include "lldb/Target/Language.h"
145f9d3106SEnrico Granata 
155f9d3106SEnrico Granata #include "lldb/Core/PluginManager.h"
1663db2395SEnrico Granata #include "lldb/Symbol/SymbolFile.h"
1763db2395SEnrico Granata #include "lldb/Symbol/TypeList.h"
1863db2395SEnrico Granata #include "lldb/Target/Target.h"
19bf9a7730SZachary Turner #include "lldb/Utility/Stream.h"
205f9d3106SEnrico Granata 
21c5f28e2aSKamil Rytarowski #include "llvm/Support/Threading.h"
22c5f28e2aSKamil Rytarowski 
235f9d3106SEnrico Granata using namespace lldb;
245f9d3106SEnrico Granata using namespace lldb_private;
25ac49453bSEnrico Granata using namespace lldb_private::formatters;
265f9d3106SEnrico Granata 
275f9d3106SEnrico Granata typedef std::unique_ptr<Language> LanguageUP;
285f9d3106SEnrico Granata typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
295f9d3106SEnrico Granata 
GetLanguagesMap()30b9c1b51eSKate Stone static LanguagesMap &GetLanguagesMap() {
315f9d3106SEnrico Granata   static LanguagesMap *g_map = nullptr;
32c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
335f9d3106SEnrico Granata 
34c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, [] {
35b9c1b51eSKate Stone     g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
36b9c1b51eSKate Stone                                 // destructor chain
375f9d3106SEnrico Granata   });
385f9d3106SEnrico Granata 
395f9d3106SEnrico Granata   return *g_map;
405f9d3106SEnrico Granata }
GetLanguagesMutex()41b9c1b51eSKate Stone static std::mutex &GetLanguagesMutex() {
4216ff8604SSaleem Abdulrasool   static std::mutex *g_mutex = nullptr;
43c5f28e2aSKamil Rytarowski   static llvm::once_flag g_initialize;
445f9d3106SEnrico Granata 
45c5f28e2aSKamil Rytarowski   llvm::call_once(g_initialize, [] {
46b9c1b51eSKate Stone     g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
47b9c1b51eSKate Stone                                 // destructor chain
485f9d3106SEnrico Granata   });
495f9d3106SEnrico Granata 
505f9d3106SEnrico Granata   return *g_mutex;
515f9d3106SEnrico Granata }
525f9d3106SEnrico Granata 
FindPlugin(lldb::LanguageType language)53b9c1b51eSKate Stone Language *Language::FindPlugin(lldb::LanguageType language) {
5416ff8604SSaleem Abdulrasool   std::lock_guard<std::mutex> guard(GetLanguagesMutex());
555f9d3106SEnrico Granata   LanguagesMap &map(GetLanguagesMap());
565f9d3106SEnrico Granata   auto iter = map.find(language), end = map.end();
575f9d3106SEnrico Granata   if (iter != end)
585f9d3106SEnrico Granata     return iter->second.get();
595f9d3106SEnrico Granata 
605f9d3106SEnrico Granata   Language *language_ptr = nullptr;
615f9d3106SEnrico Granata   LanguageCreateInstance create_callback;
625f9d3106SEnrico Granata 
635f9d3106SEnrico Granata   for (uint32_t idx = 0;
64b9c1b51eSKate Stone        (create_callback =
65b9c1b51eSKate Stone             PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
66b9c1b51eSKate Stone        ++idx) {
675f9d3106SEnrico Granata     language_ptr = create_callback(language);
685f9d3106SEnrico Granata 
69b9c1b51eSKate Stone     if (language_ptr) {
705f9d3106SEnrico Granata       map[language] = std::unique_ptr<Language>(language_ptr);
715f9d3106SEnrico Granata       return language_ptr;
725f9d3106SEnrico Granata     }
735f9d3106SEnrico Granata   }
745f9d3106SEnrico Granata 
755f9d3106SEnrico Granata   return nullptr;
765f9d3106SEnrico Granata }
775f9d3106SEnrico Granata 
FindPlugin(llvm::StringRef file_path)78566afa0aSRaphael Isemann Language *Language::FindPlugin(llvm::StringRef file_path) {
79566afa0aSRaphael Isemann   Language *result = nullptr;
80566afa0aSRaphael Isemann   ForEach([&result, file_path](Language *language) {
81566afa0aSRaphael Isemann     if (language->IsSourceFile(file_path)) {
82566afa0aSRaphael Isemann       result = language;
83566afa0aSRaphael Isemann       return false;
84566afa0aSRaphael Isemann     }
85566afa0aSRaphael Isemann     return true;
86566afa0aSRaphael Isemann   });
87566afa0aSRaphael Isemann   return result;
88566afa0aSRaphael Isemann }
89566afa0aSRaphael Isemann 
FindPlugin(LanguageType language,llvm::StringRef file_path)90566afa0aSRaphael Isemann Language *Language::FindPlugin(LanguageType language,
91566afa0aSRaphael Isemann                                llvm::StringRef file_path) {
92566afa0aSRaphael Isemann   Language *result = FindPlugin(language);
93566afa0aSRaphael Isemann   // Finding a language by file path is slower, we so we use this as the
94566afa0aSRaphael Isemann   // fallback.
95566afa0aSRaphael Isemann   if (!result)
96566afa0aSRaphael Isemann     result = FindPlugin(file_path);
97566afa0aSRaphael Isemann   return result;
98566afa0aSRaphael Isemann }
99566afa0aSRaphael Isemann 
ForEach(std::function<bool (Language *)> callback)100b9c1b51eSKate Stone void Language::ForEach(std::function<bool(Language *)> callback) {
101566afa0aSRaphael Isemann   // If we want to iterate over all languages, we first have to complete the
102566afa0aSRaphael Isemann   // LanguagesMap.
103566afa0aSRaphael Isemann   static llvm::once_flag g_initialize;
104566afa0aSRaphael Isemann   llvm::call_once(g_initialize, [] {
105566afa0aSRaphael Isemann     for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes;
106566afa0aSRaphael Isemann          ++lang) {
107566afa0aSRaphael Isemann       FindPlugin(static_cast<lldb::LanguageType>(lang));
108566afa0aSRaphael Isemann     }
109566afa0aSRaphael Isemann   });
110566afa0aSRaphael Isemann 
111862a3113SAlex Langford   // callback may call a method in Language that attempts to acquire the same
112862a3113SAlex Langford   // lock (such as Language::ForEach or Language::FindPlugin). To avoid a
113862a3113SAlex Langford   // deadlock, we do not use callback while holding the lock.
114862a3113SAlex Langford   std::vector<Language *> loaded_plugins;
115862a3113SAlex Langford   {
11616ff8604SSaleem Abdulrasool     std::lock_guard<std::mutex> guard(GetLanguagesMutex());
1175f9d3106SEnrico Granata     LanguagesMap &map(GetLanguagesMap());
118b9c1b51eSKate Stone     for (const auto &entry : map) {
119862a3113SAlex Langford       if (entry.second)
120862a3113SAlex Langford         loaded_plugins.push_back(entry.second.get());
121862a3113SAlex Langford     }
122862a3113SAlex Langford   }
123862a3113SAlex Langford 
124862a3113SAlex Langford   for (auto *lang : loaded_plugins) {
125862a3113SAlex Langford     if (!callback(lang))
1265f9d3106SEnrico Granata       break;
1275f9d3106SEnrico Granata   }
1285f9d3106SEnrico Granata }
1295f9d3106SEnrico Granata 
IsTopLevelFunction(Function & function)130b9c1b51eSKate Stone bool Language::IsTopLevelFunction(Function &function) { return false; }
1316754e04fSEnrico Granata 
GetFormatters()132b9c1b51eSKate Stone lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
133980c0484SEnrico Granata 
GetHardcodedFormats()134b9c1b51eSKate Stone HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
1357cb59e1aSEnrico Granata   return {};
1367cb59e1aSEnrico Granata }
1377cb59e1aSEnrico Granata 
GetHardcodedSummaries()138b9c1b51eSKate Stone HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
1397cb59e1aSEnrico Granata   return {};
1407cb59e1aSEnrico Granata }
1417cb59e1aSEnrico Granata 
1427cb59e1aSEnrico Granata HardcodedFormatters::HardcodedSyntheticFinder
GetHardcodedSynthetics()143b9c1b51eSKate Stone Language::GetHardcodedSynthetics() {
1447cb59e1aSEnrico Granata   return {};
1457cb59e1aSEnrico Granata }
1467cb59e1aSEnrico Granata 
147d3233c1eSEnrico Granata std::vector<ConstString>
GetPossibleFormattersMatches(ValueObject & valobj,lldb::DynamicValueType use_dynamic)148b9c1b51eSKate Stone Language::GetPossibleFormattersMatches(ValueObject &valobj,
149b9c1b51eSKate Stone                                        lldb::DynamicValueType use_dynamic) {
150d3233c1eSEnrico Granata   return {};
151d3233c1eSEnrico Granata }
152d3233c1eSEnrico Granata 
1530e0984eeSJim Ingham struct language_name_pair {
1540e0984eeSJim Ingham   const char *name;
1550e0984eeSJim Ingham   LanguageType type;
1560e0984eeSJim Ingham };
1570e0984eeSJim Ingham 
158b9c1b51eSKate Stone struct language_name_pair language_names[] = {
1590e0984eeSJim Ingham     // To allow GetNameForLanguageType to be a simple array lookup, the first
1600e0984eeSJim Ingham     // part of this array must follow enum LanguageType exactly.
1610e0984eeSJim Ingham     {"unknown", eLanguageTypeUnknown},
1620e0984eeSJim Ingham     {"c89", eLanguageTypeC89},
1630e0984eeSJim Ingham     {"c", eLanguageTypeC},
1640e0984eeSJim Ingham     {"ada83", eLanguageTypeAda83},
1650e0984eeSJim Ingham     {"c++", eLanguageTypeC_plus_plus},
1660e0984eeSJim Ingham     {"cobol74", eLanguageTypeCobol74},
1670e0984eeSJim Ingham     {"cobol85", eLanguageTypeCobol85},
1680e0984eeSJim Ingham     {"fortran77", eLanguageTypeFortran77},
1690e0984eeSJim Ingham     {"fortran90", eLanguageTypeFortran90},
1700e0984eeSJim Ingham     {"pascal83", eLanguageTypePascal83},
1710e0984eeSJim Ingham     {"modula2", eLanguageTypeModula2},
1720e0984eeSJim Ingham     {"java", eLanguageTypeJava},
1730e0984eeSJim Ingham     {"c99", eLanguageTypeC99},
1740e0984eeSJim Ingham     {"ada95", eLanguageTypeAda95},
1750e0984eeSJim Ingham     {"fortran95", eLanguageTypeFortran95},
1760e0984eeSJim Ingham     {"pli", eLanguageTypePLI},
1770e0984eeSJim Ingham     {"objective-c", eLanguageTypeObjC},
1780e0984eeSJim Ingham     {"objective-c++", eLanguageTypeObjC_plus_plus},
1790e0984eeSJim Ingham     {"upc", eLanguageTypeUPC},
1800e0984eeSJim Ingham     {"d", eLanguageTypeD},
1810e0984eeSJim Ingham     {"python", eLanguageTypePython},
1820e0984eeSJim Ingham     {"opencl", eLanguageTypeOpenCL},
1830e0984eeSJim Ingham     {"go", eLanguageTypeGo},
1840e0984eeSJim Ingham     {"modula3", eLanguageTypeModula3},
1850e0984eeSJim Ingham     {"haskell", eLanguageTypeHaskell},
1860e0984eeSJim Ingham     {"c++03", eLanguageTypeC_plus_plus_03},
1870e0984eeSJim Ingham     {"c++11", eLanguageTypeC_plus_plus_11},
1880e0984eeSJim Ingham     {"ocaml", eLanguageTypeOCaml},
1890e0984eeSJim Ingham     {"rust", eLanguageTypeRust},
1900e0984eeSJim Ingham     {"c11", eLanguageTypeC11},
1910e0984eeSJim Ingham     {"swift", eLanguageTypeSwift},
1920e0984eeSJim Ingham     {"julia", eLanguageTypeJulia},
1930e0984eeSJim Ingham     {"dylan", eLanguageTypeDylan},
1940e0984eeSJim Ingham     {"c++14", eLanguageTypeC_plus_plus_14},
1950e0984eeSJim Ingham     {"fortran03", eLanguageTypeFortran03},
1960e0984eeSJim Ingham     {"fortran08", eLanguageTypeFortran08},
1970e0984eeSJim Ingham     // Vendor Extensions
198017d7a9eSAdrian Prantl     {"assembler", eLanguageTypeMipsAssembler},
1990e0984eeSJim Ingham     {"renderscript", eLanguageTypeExtRenderScript},
2000e0984eeSJim Ingham     // Now synonyms, in arbitrary order
2010e0984eeSJim Ingham     {"objc", eLanguageTypeObjC},
2020e0984eeSJim Ingham     {"objc++", eLanguageTypeObjC_plus_plus},
203b9c1b51eSKate Stone     {"pascal", eLanguageTypePascal83}};
2040e0984eeSJim Ingham 
205b9c1b51eSKate Stone static uint32_t num_languages =
206b9c1b51eSKate Stone     sizeof(language_names) / sizeof(struct language_name_pair);
2070e0984eeSJim Ingham 
GetLanguageTypeFromString(llvm::StringRef string)2086fa7681bSZachary Turner LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
2096fa7681bSZachary Turner   for (const auto &L : language_names) {
210e50f9c41SMartin Storsjö     if (string.equals_insensitive(L.name))
2116fa7681bSZachary Turner       return static_cast<LanguageType>(L.type);
2126fa7681bSZachary Turner   }
2136fa7681bSZachary Turner 
2140e0984eeSJim Ingham   return eLanguageTypeUnknown;
2150e0984eeSJim Ingham }
2160e0984eeSJim Ingham 
GetNameForLanguageType(LanguageType language)217b9c1b51eSKate Stone const char *Language::GetNameForLanguageType(LanguageType language) {
2180e0984eeSJim Ingham   if (language < num_languages)
2190e0984eeSJim Ingham     return language_names[language].name;
2200e0984eeSJim Ingham   else
2210e0984eeSJim Ingham     return language_names[eLanguageTypeUnknown].name;
2220e0984eeSJim Ingham }
2230e0984eeSJim Ingham 
PrintAllLanguages(Stream & s,const char * prefix,const char * suffix)224b9c1b51eSKate Stone void Language::PrintAllLanguages(Stream &s, const char *prefix,
225b9c1b51eSKate Stone                                  const char *suffix) {
226b9c1b51eSKate Stone   for (uint32_t i = 1; i < num_languages; i++) {
2270e0984eeSJim Ingham     s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
2280e0984eeSJim Ingham   }
2290e0984eeSJim Ingham }
2300e0984eeSJim Ingham 
ForAllLanguages(std::function<bool (lldb::LanguageType)> callback)231b9c1b51eSKate Stone void Language::ForAllLanguages(
232b9c1b51eSKate Stone     std::function<bool(lldb::LanguageType)> callback) {
233b9c1b51eSKate Stone   for (uint32_t i = 1; i < num_languages; i++) {
23428b3831eSEnrico Granata     if (!callback(language_names[i].type))
23528b3831eSEnrico Granata       break;
23628b3831eSEnrico Granata   }
23728b3831eSEnrico Granata }
23828b3831eSEnrico Granata 
LanguageIsCPlusPlus(LanguageType language)239b9c1b51eSKate Stone bool Language::LanguageIsCPlusPlus(LanguageType language) {
240b9c1b51eSKate Stone   switch (language) {
2410e0984eeSJim Ingham   case eLanguageTypeC_plus_plus:
2420e0984eeSJim Ingham   case eLanguageTypeC_plus_plus_03:
2430e0984eeSJim Ingham   case eLanguageTypeC_plus_plus_11:
2440e0984eeSJim Ingham   case eLanguageTypeC_plus_plus_14:
2457b3ef05aSSean Callanan   case eLanguageTypeObjC_plus_plus:
2460e0984eeSJim Ingham     return true;
2470e0984eeSJim Ingham   default:
2480e0984eeSJim Ingham     return false;
2490e0984eeSJim Ingham   }
2500e0984eeSJim Ingham }
2510e0984eeSJim Ingham 
LanguageIsObjC(LanguageType language)252b9c1b51eSKate Stone bool Language::LanguageIsObjC(LanguageType language) {
253b9c1b51eSKate Stone   switch (language) {
2540e0984eeSJim Ingham   case eLanguageTypeObjC:
2550e0984eeSJim Ingham   case eLanguageTypeObjC_plus_plus:
2560e0984eeSJim Ingham     return true;
2570e0984eeSJim Ingham   default:
2580e0984eeSJim Ingham     return false;
2590e0984eeSJim Ingham   }
2600e0984eeSJim Ingham }
2610e0984eeSJim Ingham 
LanguageIsC(LanguageType language)262b9c1b51eSKate Stone bool Language::LanguageIsC(LanguageType language) {
263b9c1b51eSKate Stone   switch (language) {
2640e0984eeSJim Ingham   case eLanguageTypeC:
2650e0984eeSJim Ingham   case eLanguageTypeC89:
2660e0984eeSJim Ingham   case eLanguageTypeC99:
2670e0984eeSJim Ingham   case eLanguageTypeC11:
2680e0984eeSJim Ingham     return true;
2690e0984eeSJim Ingham   default:
2700e0984eeSJim Ingham     return false;
2710e0984eeSJim Ingham   }
2720e0984eeSJim Ingham }
2730e0984eeSJim Ingham 
LanguageIsCFamily(LanguageType language)274de2cc012SAdrian Prantl bool Language::LanguageIsCFamily(LanguageType language) {
275de2cc012SAdrian Prantl   switch (language) {
276de2cc012SAdrian Prantl   case eLanguageTypeC:
277de2cc012SAdrian Prantl   case eLanguageTypeC89:
278de2cc012SAdrian Prantl   case eLanguageTypeC99:
279de2cc012SAdrian Prantl   case eLanguageTypeC11:
280de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus:
281de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus_03:
282de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus_11:
283de2cc012SAdrian Prantl   case eLanguageTypeC_plus_plus_14:
284de2cc012SAdrian Prantl   case eLanguageTypeObjC_plus_plus:
285de2cc012SAdrian Prantl   case eLanguageTypeObjC:
286de2cc012SAdrian Prantl     return true;
287de2cc012SAdrian Prantl   default:
288de2cc012SAdrian Prantl     return false;
289de2cc012SAdrian Prantl   }
290de2cc012SAdrian Prantl }
291de2cc012SAdrian Prantl 
LanguageIsPascal(LanguageType language)292b9c1b51eSKate Stone bool Language::LanguageIsPascal(LanguageType language) {
293b9c1b51eSKate Stone   switch (language) {
2940e0984eeSJim Ingham   case eLanguageTypePascal83:
2950e0984eeSJim Ingham     return true;
2960e0984eeSJim Ingham   default:
2970e0984eeSJim Ingham     return false;
2980e0984eeSJim Ingham   }
2990e0984eeSJim Ingham }
3000e0984eeSJim Ingham 
GetPrimaryLanguage(LanguageType language)301b9c1b51eSKate Stone LanguageType Language::GetPrimaryLanguage(LanguageType language) {
302b9c1b51eSKate Stone   switch (language) {
303bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus:
304bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus_03:
305bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus_11:
306bfd96183SDawn Perchik   case eLanguageTypeC_plus_plus_14:
307bfd96183SDawn Perchik     return eLanguageTypeC_plus_plus;
308bfd96183SDawn Perchik   case eLanguageTypeC:
309bfd96183SDawn Perchik   case eLanguageTypeC89:
310bfd96183SDawn Perchik   case eLanguageTypeC99:
311bfd96183SDawn Perchik   case eLanguageTypeC11:
312bfd96183SDawn Perchik     return eLanguageTypeC;
313bfd96183SDawn Perchik   case eLanguageTypeObjC:
314bfd96183SDawn Perchik   case eLanguageTypeObjC_plus_plus:
315bfd96183SDawn Perchik     return eLanguageTypeObjC;
316bfd96183SDawn Perchik   case eLanguageTypePascal83:
317bfd96183SDawn Perchik   case eLanguageTypeCobol74:
318bfd96183SDawn Perchik   case eLanguageTypeCobol85:
319bfd96183SDawn Perchik   case eLanguageTypeFortran77:
320bfd96183SDawn Perchik   case eLanguageTypeFortran90:
321bfd96183SDawn Perchik   case eLanguageTypeFortran95:
322bfd96183SDawn Perchik   case eLanguageTypeFortran03:
323bfd96183SDawn Perchik   case eLanguageTypeFortran08:
324bfd96183SDawn Perchik   case eLanguageTypeAda83:
325bfd96183SDawn Perchik   case eLanguageTypeAda95:
326bfd96183SDawn Perchik   case eLanguageTypeModula2:
327bfd96183SDawn Perchik   case eLanguageTypeJava:
328bfd96183SDawn Perchik   case eLanguageTypePLI:
329bfd96183SDawn Perchik   case eLanguageTypeUPC:
330bfd96183SDawn Perchik   case eLanguageTypeD:
331bfd96183SDawn Perchik   case eLanguageTypePython:
332bfd96183SDawn Perchik   case eLanguageTypeOpenCL:
333bfd96183SDawn Perchik   case eLanguageTypeGo:
334bfd96183SDawn Perchik   case eLanguageTypeModula3:
335bfd96183SDawn Perchik   case eLanguageTypeHaskell:
336bfd96183SDawn Perchik   case eLanguageTypeOCaml:
337bfd96183SDawn Perchik   case eLanguageTypeRust:
338bfd96183SDawn Perchik   case eLanguageTypeSwift:
339bfd96183SDawn Perchik   case eLanguageTypeJulia:
340bfd96183SDawn Perchik   case eLanguageTypeDylan:
341bfd96183SDawn Perchik   case eLanguageTypeMipsAssembler:
342bfd96183SDawn Perchik   case eLanguageTypeExtRenderScript:
343bfd96183SDawn Perchik   case eLanguageTypeUnknown:
344bfd96183SDawn Perchik   default:
345bfd96183SDawn Perchik     return language;
346bfd96183SDawn Perchik   }
347bfd96183SDawn Perchik }
348bfd96183SDawn Perchik 
GetSupportedLanguages()34903e1a82fSAlex Langford std::set<lldb::LanguageType> Language::GetSupportedLanguages() {
35003e1a82fSAlex Langford   std::set<lldb::LanguageType> supported_languages;
35103e1a82fSAlex Langford   ForEach([&](Language *lang) {
35203e1a82fSAlex Langford     supported_languages.emplace(lang->GetLanguageType());
35303e1a82fSAlex Langford     return true;
35403e1a82fSAlex Langford   });
35503e1a82fSAlex Langford   return supported_languages;
35603e1a82fSAlex Langford }
35703e1a82fSAlex Langford 
GetLanguagesSupportingTypeSystems()358aa97a89dSAdrian Prantl LanguageSet Language::GetLanguagesSupportingTypeSystems() {
359aa97a89dSAdrian Prantl   return PluginManager::GetAllTypeSystemSupportedLanguagesForTypes();
360fe38c850SSean Callanan }
361fe38c850SSean Callanan 
GetLanguagesSupportingTypeSystemsForExpressions()362aa97a89dSAdrian Prantl LanguageSet Language::GetLanguagesSupportingTypeSystemsForExpressions() {
363aa97a89dSAdrian Prantl   return PluginManager::GetAllTypeSystemSupportedLanguagesForExpressions();
364b041602eSAdrian Prantl }
365aa97a89dSAdrian Prantl 
GetLanguagesSupportingREPLs()366aa97a89dSAdrian Prantl LanguageSet Language::GetLanguagesSupportingREPLs() {
367aa97a89dSAdrian Prantl   return PluginManager::GetREPLAllTypeSystemSupportedLanguages();
36893c0b003SSean Callanan }
36993c0b003SSean Callanan 
GetTypeScavenger()370b9c1b51eSKate Stone std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
3719b0af1b8SEnrico Granata   return nullptr;
3729b0af1b8SEnrico Granata }
3739b0af1b8SEnrico Granata 
GetLanguageSpecificTypeLookupHelp()374b9c1b51eSKate Stone const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
375701338a7SEnrico Granata 
Find(ExecutionContextScope * exe_scope,const char * key,ResultSet & results,bool append)376b9c1b51eSKate Stone size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
377b9c1b51eSKate Stone                                      const char *key, ResultSet &results,
378b9c1b51eSKate Stone                                      bool append) {
3799b0af1b8SEnrico Granata   if (!exe_scope || !exe_scope->CalculateTarget().get())
3809b0af1b8SEnrico Granata     return false;
3819b0af1b8SEnrico Granata 
3829b0af1b8SEnrico Granata   if (!key || !key[0])
3839b0af1b8SEnrico Granata     return false;
3849b0af1b8SEnrico Granata 
3859b0af1b8SEnrico Granata   if (!append)
3869b0af1b8SEnrico Granata     results.clear();
3879b0af1b8SEnrico Granata 
3889b0af1b8SEnrico Granata   size_t old_size = results.size();
3899b0af1b8SEnrico Granata 
3909b0af1b8SEnrico Granata   if (this->Find_Impl(exe_scope, key, results))
3919b0af1b8SEnrico Granata     return results.size() - old_size;
3929b0af1b8SEnrico Granata   return 0;
3939b0af1b8SEnrico Granata }
3949b0af1b8SEnrico Granata 
Find_Impl(ExecutionContextScope * exe_scope,const char * key,ResultSet & results)39563db2395SEnrico Granata bool Language::ImageListTypeScavenger::Find_Impl(
39663db2395SEnrico Granata     ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
39763db2395SEnrico Granata   bool result = false;
39863db2395SEnrico Granata 
39963db2395SEnrico Granata   Target *target = exe_scope->CalculateTarget().get();
40063db2395SEnrico Granata   if (target) {
40163db2395SEnrico Granata     const auto &images(target->GetImages());
40263db2395SEnrico Granata     ConstString cs_key(key);
40363db2395SEnrico Granata     llvm::DenseSet<SymbolFile *> searched_sym_files;
40463db2395SEnrico Granata     TypeList matches;
405576495e6SZachary Turner     images.FindTypes(nullptr, cs_key, false, UINT32_MAX, searched_sym_files,
40663db2395SEnrico Granata                      matches);
40763db2395SEnrico Granata     for (const auto &match : matches.Types()) {
40870355aceSJonas Devlieghere       if (match) {
40963db2395SEnrico Granata         CompilerType compiler_type(match->GetFullCompilerType());
41063db2395SEnrico Granata         compiler_type = AdjustForInclusion(compiler_type);
41163db2395SEnrico Granata         if (!compiler_type)
41263db2395SEnrico Granata           continue;
41363db2395SEnrico Granata         std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
41463db2395SEnrico Granata             new Result(compiler_type));
41563db2395SEnrico Granata         results.insert(std::move(scavengeresult));
41663db2395SEnrico Granata         result = true;
41763db2395SEnrico Granata       }
41863db2395SEnrico Granata     }
41963db2395SEnrico Granata   }
42063db2395SEnrico Granata 
42163db2395SEnrico Granata   return result;
42263db2395SEnrico Granata }
42363db2395SEnrico Granata 
GetFormatterPrefixSuffix(ValueObject & valobj,ConstString type_hint,std::string & prefix,std::string & suffix)424b9c1b51eSKate Stone bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
425b9c1b51eSKate Stone                                         ConstString type_hint,
426b9c1b51eSKate Stone                                         std::string &prefix,
427b9c1b51eSKate Stone                                         std::string &suffix) {
428675f49bbSEnrico Granata   return false;
429675f49bbSEnrico Granata }
430675f49bbSEnrico Granata 
DemangledNameContainsPath(llvm::StringRef path,ConstString demangled) const431*3339000eSJim Ingham bool Language::DemangledNameContainsPath(llvm::StringRef path,
432*3339000eSJim Ingham                                          ConstString demangled) const {
433*3339000eSJim Ingham   // The base implementation does a simple contains comparision:
434*3339000eSJim Ingham   if (path.empty())
435*3339000eSJim Ingham     return false;
436*3339000eSJim Ingham   return demangled.GetStringRef().contains(path);
437*3339000eSJim Ingham }
438*3339000eSJim Ingham 
GetDeclPrintingHelper()439b9c1b51eSKate Stone DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
440c8e7649aSEnrico Granata   return nullptr;
441c8e7649aSEnrico Granata }
442c8e7649aSEnrico Granata 
IsLogicalTrue(ValueObject & valobj,Status & error)44397206d57SZachary Turner LazyBool Language::IsLogicalTrue(ValueObject &valobj, Status &error) {
444407b5c62SEnrico Granata   return eLazyBoolCalculate;
445407b5c62SEnrico Granata }
446407b5c62SEnrico Granata 
IsNilReference(ValueObject & valobj)447b9c1b51eSKate Stone bool Language::IsNilReference(ValueObject &valobj) { return false; }
448608d67c1SEnrico Granata 
IsUninitializedReference(ValueObject & valobj)449b9c1b51eSKate Stone bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
450608d67c1SEnrico Granata 
GetFunctionDisplayName(const SymbolContext * sc,const ExecutionContext * exe_ctx,FunctionNameRepresentation representation,Stream & s)451b9c1b51eSKate Stone bool Language::GetFunctionDisplayName(const SymbolContext *sc,
452293207ddSEnrico Granata                                       const ExecutionContext *exe_ctx,
453d4129b47SEnrico Granata                                       FunctionNameRepresentation representation,
454b9c1b51eSKate Stone                                       Stream &s) {
455d4129b47SEnrico Granata   return false;
456d4129b47SEnrico Granata }
457d4129b47SEnrico Granata 
GetExceptionResolverDescription(bool catch_on,bool throw_on,Stream & s)458b9c1b51eSKate Stone void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
459b9c1b51eSKate Stone                                                Stream &s) {
460a2023571SJim Ingham   GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
461a2023571SJim Ingham }
462a2023571SJim Ingham 
GetDefaultExceptionResolverDescription(bool catch_on,bool throw_on,Stream & s)463b9c1b51eSKate Stone void Language::GetDefaultExceptionResolverDescription(bool catch_on,
464b9c1b51eSKate Stone                                                       bool throw_on,
465b9c1b51eSKate Stone                                                       Stream &s) {
466a2023571SJim Ingham   s.Printf("Exception breakpoint (catch: %s throw: %s)",
467b9c1b51eSKate Stone            catch_on ? "on" : "off", throw_on ? "on" : "off");
468a2023571SJim Ingham }
4695f9d3106SEnrico Granata // Constructor
470fd2433e1SJonas Devlieghere Language::Language() = default;
4715f9d3106SEnrico Granata 
4725f9d3106SEnrico Granata // Destructor
473fd2433e1SJonas Devlieghere Language::~Language() = default;
474