blob: f62073b3d170c41a7925a3079a71ce96dbd576b4 [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
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174LanguageType Language::GetLanguageTypeFromString(const char *string) {
175 for (uint32_t i = 0; i < num_languages; i++) {
176 if (strcasecmp(language_names[i].name, string) == 0)
177 return (LanguageType)language_names[i].type;
178 }
179 return eLanguageTypeUnknown;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000180}
181
Kate Stoneb9c1b512016-09-06 20:57:50 +0000182const char *Language::GetNameForLanguageType(LanguageType language) {
183 if (language < num_languages)
184 return language_names[language].name;
185 else
186 return language_names[eLanguageTypeUnknown].name;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000187}
188
Kate Stoneb9c1b512016-09-06 20:57:50 +0000189void Language::PrintAllLanguages(Stream &s, const char *prefix,
190 const char *suffix) {
191 for (uint32_t i = 1; i < num_languages; i++) {
192 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
193 }
Jim Ingham0e0984e2015-09-02 01:06:46 +0000194}
195
Kate Stoneb9c1b512016-09-06 20:57:50 +0000196void Language::ForAllLanguages(
197 std::function<bool(lldb::LanguageType)> callback) {
198 for (uint32_t i = 1; i < num_languages; i++) {
199 if (!callback(language_names[i].type))
200 break;
201 }
Enrico Granata28b38312015-09-02 01:31:10 +0000202}
203
Kate Stoneb9c1b512016-09-06 20:57:50 +0000204bool Language::LanguageIsCPlusPlus(LanguageType language) {
205 switch (language) {
206 case eLanguageTypeC_plus_plus:
207 case eLanguageTypeC_plus_plus_03:
208 case eLanguageTypeC_plus_plus_11:
209 case eLanguageTypeC_plus_plus_14:
210 case eLanguageTypeObjC_plus_plus:
211 return true;
212 default:
Enrico Granata675f49b2015-10-07 18:36:53 +0000213 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214 }
Enrico Granata675f49b2015-10-07 18:36:53 +0000215}
216
Kate Stoneb9c1b512016-09-06 20:57:50 +0000217bool Language::LanguageIsObjC(LanguageType language) {
218 switch (language) {
219 case eLanguageTypeObjC:
220 case eLanguageTypeObjC_plus_plus:
221 return true;
222 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000223 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000224 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000225}
226
Kate Stoneb9c1b512016-09-06 20:57:50 +0000227bool Language::LanguageIsC(LanguageType language) {
228 switch (language) {
229 case eLanguageTypeC:
230 case eLanguageTypeC89:
231 case eLanguageTypeC99:
232 case eLanguageTypeC11:
233 return true;
234 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000235 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000236 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000237}
238
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239bool Language::LanguageIsPascal(LanguageType language) {
240 switch (language) {
241 case eLanguageTypePascal83:
242 return true;
243 default:
Enrico Granatad4129b42015-11-19 01:11:53 +0000244 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245 }
Enrico Granatad4129b42015-11-19 01:11:53 +0000246}
247
Kate Stoneb9c1b512016-09-06 20:57:50 +0000248LanguageType Language::GetPrimaryLanguage(LanguageType language) {
249 switch (language) {
250 case eLanguageTypeC_plus_plus:
251 case eLanguageTypeC_plus_plus_03:
252 case eLanguageTypeC_plus_plus_11:
253 case eLanguageTypeC_plus_plus_14:
254 return eLanguageTypeC_plus_plus;
255 case eLanguageTypeC:
256 case eLanguageTypeC89:
257 case eLanguageTypeC99:
258 case eLanguageTypeC11:
259 return eLanguageTypeC;
260 case eLanguageTypeObjC:
261 case eLanguageTypeObjC_plus_plus:
262 return eLanguageTypeObjC;
263 case eLanguageTypePascal83:
264 case eLanguageTypeCobol74:
265 case eLanguageTypeCobol85:
266 case eLanguageTypeFortran77:
267 case eLanguageTypeFortran90:
268 case eLanguageTypeFortran95:
269 case eLanguageTypeFortran03:
270 case eLanguageTypeFortran08:
271 case eLanguageTypeAda83:
272 case eLanguageTypeAda95:
273 case eLanguageTypeModula2:
274 case eLanguageTypeJava:
275 case eLanguageTypePLI:
276 case eLanguageTypeUPC:
277 case eLanguageTypeD:
278 case eLanguageTypePython:
279 case eLanguageTypeOpenCL:
280 case eLanguageTypeGo:
281 case eLanguageTypeModula3:
282 case eLanguageTypeHaskell:
283 case eLanguageTypeOCaml:
284 case eLanguageTypeRust:
285 case eLanguageTypeSwift:
286 case eLanguageTypeJulia:
287 case eLanguageTypeDylan:
288 case eLanguageTypeMipsAssembler:
289 case eLanguageTypeExtRenderScript:
290 case eLanguageTypeUnknown:
291 default:
292 return language;
293 }
Jim Inghama2023572015-12-18 02:14:04 +0000294}
295
Kate Stoneb9c1b512016-09-06 20:57:50 +0000296void Language::GetLanguagesSupportingTypeSystems(
297 std::set<lldb::LanguageType> &languages,
298 std::set<lldb::LanguageType> &languages_for_expressions) {
299 uint32_t idx = 0;
300
301 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::
302 GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) {
303 (*enumerate)(languages, languages_for_expressions);
304 }
305}
306
307void Language::GetLanguagesSupportingREPLs(
308 std::set<lldb::LanguageType> &languages) {
309 uint32_t idx = 0;
310
311 while (REPLEnumerateSupportedLanguages enumerate =
312 PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(
313 idx++)) {
314 (*enumerate)(languages);
315 }
316}
317
318std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
319 return nullptr;
320}
321
322const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
323
324size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
325 const char *key, ResultSet &results,
326 bool append) {
327 if (!exe_scope || !exe_scope->CalculateTarget().get())
328 return false;
329
330 if (!key || !key[0])
331 return false;
332
333 if (!append)
334 results.clear();
335
336 size_t old_size = results.size();
337
338 if (this->Find_Impl(exe_scope, key, results))
339 return results.size() - old_size;
340 return 0;
341}
342
343bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
344 ConstString type_hint,
345 std::string &prefix,
346 std::string &suffix) {
347 return false;
348}
349
350DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
351 return nullptr;
352}
353
354LazyBool Language::IsLogicalTrue(ValueObject &valobj, Error &error) {
355 return eLazyBoolCalculate;
356}
357
358bool Language::IsNilReference(ValueObject &valobj) { return false; }
359
360bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
361
362bool Language::GetFunctionDisplayName(const SymbolContext *sc,
363 const ExecutionContext *exe_ctx,
364 FunctionNameRepresentation representation,
365 Stream &s) {
366 return false;
367}
368
369void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
370 Stream &s) {
371 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
372}
373
374void Language::GetDefaultExceptionResolverDescription(bool catch_on,
375 bool throw_on,
376 Stream &s) {
377 s.Printf("Exception breakpoint (catch: %s throw: %s)",
378 catch_on ? "on" : "off", throw_on ? "on" : "off");
Jim Inghama2023572015-12-18 02:14:04 +0000379}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000380//----------------------------------------------------------------------
381// Constructor
382//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000383Language::Language() {}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000384
385//----------------------------------------------------------------------
386// Destructor
387//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000388Language::~Language() {}