blob: 904c18780f47fcbeaf1893ac6fbb9021c0614fdf [file] [log] [blame]
Kate Stoneb9c1b512016-09-06 20:57:50 +00001//===-- Language.cpp -------------------------------------------------*- C++
2//-*-===//
Enrico Granata5f9d3102015-08-27 21:33:50 +00003//
4// The LLVM Compiler Infrastructure
5//
6// This file is distributed under the University of Illinois Open Source
7// License. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10
11#include <functional>
12#include <map>
Enrico Granata2996d822015-08-27 22:14:06 +000013#include <mutex>
Enrico Granata5f9d3102015-08-27 21:33:50 +000014
15#include "lldb/Target/Language.h"
16
Enrico Granata5f9d3102015-08-27 21:33:50 +000017#include "lldb/Core/PluginManager.h"
Jim Ingham0e0984e2015-09-02 01:06:46 +000018#include "lldb/Core/Stream.h"
Enrico Granata5f9d3102015-08-27 21:33:50 +000019
20using namespace lldb;
21using namespace lldb_private;
Enrico Granataac494532015-09-09 22:30:24 +000022using namespace lldb_private::formatters;
Enrico Granata5f9d3102015-08-27 21:33:50 +000023
24typedef std::unique_ptr<Language> LanguageUP;
25typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
26
Kate Stoneb9c1b512016-09-06 20:57:50 +000027static LanguagesMap &GetLanguagesMap() {
28 static LanguagesMap *g_map = nullptr;
29 static std::once_flag g_initialize;
30
31 std::call_once(g_initialize, [] {
32 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
33 // destructor chain
34 });
35
36 return *g_map;
Enrico Granata5f9d3102015-08-27 21:33:50 +000037}
Kate Stoneb9c1b512016-09-06 20:57:50 +000038static std::mutex &GetLanguagesMutex() {
39 static std::mutex *g_mutex = nullptr;
40 static std::once_flag g_initialize;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042 std::call_once(g_initialize, [] {
43 g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
44 // destructor chain
45 });
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000046
Kate Stoneb9c1b512016-09-06 20:57:50 +000047 return *g_mutex;
Enrico Granata5f9d3102015-08-27 21:33:50 +000048}
49
Kate Stoneb9c1b512016-09-06 20:57:50 +000050Language *Language::FindPlugin(lldb::LanguageType language) {
51 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
52 LanguagesMap &map(GetLanguagesMap());
53 auto iter = map.find(language), end = map.end();
54 if (iter != end)
55 return iter->second.get();
56
57 Language *language_ptr = nullptr;
58 LanguageCreateInstance create_callback;
59
60 for (uint32_t idx = 0;
61 (create_callback =
62 PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
63 ++idx) {
64 language_ptr = create_callback(language);
65
66 if (language_ptr) {
67 map[language] = std::unique_ptr<Language>(language_ptr);
68 return language_ptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +000069 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000070 }
71
72 return nullptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +000073}
74
Kate Stoneb9c1b512016-09-06 20:57:50 +000075void Language::ForEach(std::function<bool(Language *)> callback) {
76 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
77 LanguagesMap &map(GetLanguagesMap());
78 for (const auto &entry : map) {
79 if (!callback(entry.second.get()))
80 break;
81 }
Enrico Granata5f9d3102015-08-27 21:33:50 +000082}
83
Kate Stoneb9c1b512016-09-06 20:57:50 +000084bool Language::IsTopLevelFunction(Function &function) { return false; }
85
86lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
87
88HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
89 return {};
Enrico Granata6754e042015-09-30 23:12:22 +000090}
91
Kate Stoneb9c1b512016-09-06 20:57:50 +000092HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
93 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +000094}
95
96HardcodedFormatters::HardcodedSyntheticFinder
Kate Stoneb9c1b512016-09-06 20:57:50 +000097Language::GetHardcodedSynthetics() {
98 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +000099}
100
101HardcodedFormatters::HardcodedValidatorFinder
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102Language::GetHardcodedValidators() {
103 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +0000104}
105
Enrico Granatad3233c12015-09-09 01:10:46 +0000106std::vector<ConstString>
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107Language::GetPossibleFormattersMatches(ValueObject &valobj,
108 lldb::DynamicValueType use_dynamic) {
109 return {};
Enrico Granatad3233c12015-09-09 01:10:46 +0000110}
111
Enrico Granataac494532015-09-09 22:30:24 +0000112lldb_private::formatters::StringPrinter::EscapingHelper
Kate Stoneb9c1b512016-09-06 20:57:50 +0000113Language::GetStringPrinterEscapingHelper(
114 lldb_private::formatters::StringPrinter::GetPrintableElementType
115 elem_type) {
116 return StringPrinter::GetDefaultEscapingHelper(elem_type);
Enrico Granataac494532015-09-09 22:30:24 +0000117}
118
Jim Ingham0e0984e2015-09-02 01:06:46 +0000119struct language_name_pair {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120 const char *name;
121 LanguageType type;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000122};
123
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124struct language_name_pair language_names[] = {
Jim Ingham0e0984e2015-09-02 01:06:46 +0000125 // To allow GetNameForLanguageType to be a simple array lookup, the first
126 // part of this array must follow enum LanguageType exactly.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 {"unknown", eLanguageTypeUnknown},
128 {"c89", eLanguageTypeC89},
129 {"c", eLanguageTypeC},
130 {"ada83", eLanguageTypeAda83},
131 {"c++", eLanguageTypeC_plus_plus},
132 {"cobol74", eLanguageTypeCobol74},
133 {"cobol85", eLanguageTypeCobol85},
134 {"fortran77", eLanguageTypeFortran77},
135 {"fortran90", eLanguageTypeFortran90},
136 {"pascal83", eLanguageTypePascal83},
137 {"modula2", eLanguageTypeModula2},
138 {"java", eLanguageTypeJava},
139 {"c99", eLanguageTypeC99},
140 {"ada95", eLanguageTypeAda95},
141 {"fortran95", eLanguageTypeFortran95},
142 {"pli", eLanguageTypePLI},
143 {"objective-c", eLanguageTypeObjC},
144 {"objective-c++", eLanguageTypeObjC_plus_plus},
145 {"upc", eLanguageTypeUPC},
146 {"d", eLanguageTypeD},
147 {"python", eLanguageTypePython},
148 {"opencl", eLanguageTypeOpenCL},
149 {"go", eLanguageTypeGo},
150 {"modula3", eLanguageTypeModula3},
151 {"haskell", eLanguageTypeHaskell},
152 {"c++03", eLanguageTypeC_plus_plus_03},
153 {"c++11", eLanguageTypeC_plus_plus_11},
154 {"ocaml", eLanguageTypeOCaml},
155 {"rust", eLanguageTypeRust},
156 {"c11", eLanguageTypeC11},
157 {"swift", eLanguageTypeSwift},
158 {"julia", eLanguageTypeJulia},
159 {"dylan", eLanguageTypeDylan},
160 {"c++14", eLanguageTypeC_plus_plus_14},
161 {"fortran03", eLanguageTypeFortran03},
162 {"fortran08", eLanguageTypeFortran08},
Jim Ingham0e0984e2015-09-02 01:06:46 +0000163 // Vendor Extensions
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164 {"mipsassem", eLanguageTypeMipsAssembler},
165 {"renderscript", eLanguageTypeExtRenderScript},
Jim Ingham0e0984e2015-09-02 01:06:46 +0000166 // Now synonyms, in arbitrary order
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 {"objc", eLanguageTypeObjC},
168 {"objc++", eLanguageTypeObjC_plus_plus},
169 {"pascal", eLanguageTypePascal83}};
Jim Ingham0e0984e2015-09-02 01:06:46 +0000170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171static uint32_t num_languages =
172 sizeof(language_names) / sizeof(struct language_name_pair);
Jim Ingham0e0984e2015-09-02 01:06:46 +0000173
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000174LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
175 for (const auto &L : language_names) {
176 if (string.equals_lower(L.name))
177 return static_cast<LanguageType>(L.type);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000178 }
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180 return eLanguageTypeUnknown;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000181}
182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183const char *Language::GetNameForLanguageType(LanguageType language) {
184 if (language < num_languages)
185 return language_names[language].name;
186 else
187 return language_names[eLanguageTypeUnknown].name;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000188}
189
Kate Stoneb9c1b512016-09-06 20:57:50 +0000190void Language::PrintAllLanguages(Stream &s, const char *prefix,
191 const char *suffix) {
192 for (uint32_t i = 1; i < num_languages; i++) {
193 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
194 }
Jim Ingham0e0984e2015-09-02 01:06:46 +0000195}
196
Kate Stoneb9c1b512016-09-06 20:57:50 +0000197void Language::ForAllLanguages(
198 std::function<bool(lldb::LanguageType)> callback) {
199 for (uint32_t i = 1; i < num_languages; i++) {
200 if (!callback(language_names[i].type))
201 break;
202 }
Enrico Granata28b38312015-09-02 01:31:10 +0000203}
204
Kate Stoneb9c1b512016-09-06 20:57:50 +0000205bool Language::LanguageIsCPlusPlus(LanguageType language) {
206 switch (language) {
207 case eLanguageTypeC_plus_plus:
208 case eLanguageTypeC_plus_plus_03:
209 case eLanguageTypeC_plus_plus_11:
210 case eLanguageTypeC_plus_plus_14:
211 case eLanguageTypeObjC_plus_plus:
212 return true;
213 default:
Enrico Granata675f49b2015-10-07 18:36:53 +0000214 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215 }
Enrico Granata675f49b2015-10-07 18:36:53 +0000216}
217
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218bool Language::LanguageIsObjC(LanguageType language) {
219 switch (language) {
220 case eLanguageTypeObjC:
221 case eLanguageTypeObjC_plus_plus:
222 return true;
223 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000224 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000225 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000226}
227
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228bool Language::LanguageIsC(LanguageType language) {
229 switch (language) {
230 case eLanguageTypeC:
231 case eLanguageTypeC89:
232 case eLanguageTypeC99:
233 case eLanguageTypeC11:
234 return true;
235 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000236 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000237 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000238}
239
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240bool Language::LanguageIsPascal(LanguageType language) {
241 switch (language) {
242 case eLanguageTypePascal83:
243 return true;
244 default:
Enrico Granatad4129b42015-11-19 01:11:53 +0000245 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000246 }
Enrico Granatad4129b42015-11-19 01:11:53 +0000247}
248
Kate Stoneb9c1b512016-09-06 20:57:50 +0000249LanguageType Language::GetPrimaryLanguage(LanguageType language) {
250 switch (language) {
251 case eLanguageTypeC_plus_plus:
252 case eLanguageTypeC_plus_plus_03:
253 case eLanguageTypeC_plus_plus_11:
254 case eLanguageTypeC_plus_plus_14:
255 return eLanguageTypeC_plus_plus;
256 case eLanguageTypeC:
257 case eLanguageTypeC89:
258 case eLanguageTypeC99:
259 case eLanguageTypeC11:
260 return eLanguageTypeC;
261 case eLanguageTypeObjC:
262 case eLanguageTypeObjC_plus_plus:
263 return eLanguageTypeObjC;
264 case eLanguageTypePascal83:
265 case eLanguageTypeCobol74:
266 case eLanguageTypeCobol85:
267 case eLanguageTypeFortran77:
268 case eLanguageTypeFortran90:
269 case eLanguageTypeFortran95:
270 case eLanguageTypeFortran03:
271 case eLanguageTypeFortran08:
272 case eLanguageTypeAda83:
273 case eLanguageTypeAda95:
274 case eLanguageTypeModula2:
275 case eLanguageTypeJava:
276 case eLanguageTypePLI:
277 case eLanguageTypeUPC:
278 case eLanguageTypeD:
279 case eLanguageTypePython:
280 case eLanguageTypeOpenCL:
281 case eLanguageTypeGo:
282 case eLanguageTypeModula3:
283 case eLanguageTypeHaskell:
284 case eLanguageTypeOCaml:
285 case eLanguageTypeRust:
286 case eLanguageTypeSwift:
287 case eLanguageTypeJulia:
288 case eLanguageTypeDylan:
289 case eLanguageTypeMipsAssembler:
290 case eLanguageTypeExtRenderScript:
291 case eLanguageTypeUnknown:
292 default:
293 return language;
294 }
Jim Inghama2023572015-12-18 02:14:04 +0000295}
296
Kate Stoneb9c1b512016-09-06 20:57:50 +0000297void Language::GetLanguagesSupportingTypeSystems(
298 std::set<lldb::LanguageType> &languages,
299 std::set<lldb::LanguageType> &languages_for_expressions) {
300 uint32_t idx = 0;
301
302 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::
303 GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) {
304 (*enumerate)(languages, languages_for_expressions);
305 }
306}
307
308void Language::GetLanguagesSupportingREPLs(
309 std::set<lldb::LanguageType> &languages) {
310 uint32_t idx = 0;
311
312 while (REPLEnumerateSupportedLanguages enumerate =
313 PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(
314 idx++)) {
315 (*enumerate)(languages);
316 }
317}
318
319std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
320 return nullptr;
321}
322
323const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
324
325size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
326 const char *key, ResultSet &results,
327 bool append) {
328 if (!exe_scope || !exe_scope->CalculateTarget().get())
329 return false;
330
331 if (!key || !key[0])
332 return false;
333
334 if (!append)
335 results.clear();
336
337 size_t old_size = results.size();
338
339 if (this->Find_Impl(exe_scope, key, results))
340 return results.size() - old_size;
341 return 0;
342}
343
344bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
345 ConstString type_hint,
346 std::string &prefix,
347 std::string &suffix) {
348 return false;
349}
350
351DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
352 return nullptr;
353}
354
355LazyBool Language::IsLogicalTrue(ValueObject &valobj, Error &error) {
356 return eLazyBoolCalculate;
357}
358
359bool Language::IsNilReference(ValueObject &valobj) { return false; }
360
361bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
362
363bool Language::GetFunctionDisplayName(const SymbolContext *sc,
364 const ExecutionContext *exe_ctx,
365 FunctionNameRepresentation representation,
366 Stream &s) {
367 return false;
368}
369
370void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
371 Stream &s) {
372 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
373}
374
375void Language::GetDefaultExceptionResolverDescription(bool catch_on,
376 bool throw_on,
377 Stream &s) {
378 s.Printf("Exception breakpoint (catch: %s throw: %s)",
379 catch_on ? "on" : "off", throw_on ? "on" : "off");
Jim Inghama2023572015-12-18 02:14:04 +0000380}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000381//----------------------------------------------------------------------
382// Constructor
383//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000384Language::Language() {}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000385
386//----------------------------------------------------------------------
387// Destructor
388//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000389Language::~Language() {}