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