blob: b89e5490125a9c0a2d9f71525dda5d1a2dd0c2d1 [file] [log] [blame]
Enrico Granata5f9d3102015-08-27 21:33:50 +00001//===-- Language.cpp -------------------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include <functional>
11#include <map>
Enrico Granata2996d822015-08-27 22:14:06 +000012#include <mutex>
Enrico Granata5f9d3102015-08-27 21:33:50 +000013
14#include "lldb/Target/Language.h"
15
16#include "lldb/Host/Mutex.h"
17#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
27static LanguagesMap&
28GetLanguagesMap ()
29{
30 static LanguagesMap *g_map = nullptr;
31 static std::once_flag g_initialize;
32
33 std::call_once(g_initialize, [] {
34 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global destructor chain
35 });
36
37 return *g_map;
38}
39static Mutex&
40GetLanguagesMutex ()
41{
42 static Mutex *g_mutex = nullptr;
43 static std::once_flag g_initialize;
44
45 std::call_once(g_initialize, [] {
46 g_mutex = new Mutex(); // NOTE: INTENTIONAL LEAK due to global destructor chain
47 });
48
49 return *g_mutex;
50}
51
52Language*
53Language::FindPlugin (lldb::LanguageType language)
54{
55 Mutex::Locker locker(GetLanguagesMutex());
56 LanguagesMap& map(GetLanguagesMap());
57 auto iter = map.find(language), end = map.end();
58 if (iter != end)
59 return iter->second.get();
60
61 Language *language_ptr = nullptr;
62 LanguageCreateInstance create_callback;
63
64 for (uint32_t idx = 0;
65 (create_callback = PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
66 ++idx)
67 {
68 language_ptr = create_callback(language);
69
70 if (language_ptr)
71 {
72 map[language] = std::unique_ptr<Language>(language_ptr);
73 return language_ptr;
74 }
75 }
76
77 return nullptr;
78}
79
80void
81Language::ForEach (std::function<bool(Language*)> callback)
82{
83 Mutex::Locker locker(GetLanguagesMutex());
84 LanguagesMap& map(GetLanguagesMap());
85 for (const auto& entry : map)
86 {
87 if (!callback(entry.second.get()))
88 break;
89 }
90}
91
Enrico Granata6754e042015-09-30 23:12:22 +000092bool
93Language::IsTopLevelFunction (Function& function)
94{
95 return false;
96}
97
Enrico Granata980c0482015-09-01 18:22:39 +000098lldb::TypeCategoryImplSP
99Language::GetFormatters ()
100{
101 return nullptr;
102}
103
Enrico Granata7cb59e12015-09-16 18:28:11 +0000104HardcodedFormatters::HardcodedFormatFinder
105Language::GetHardcodedFormats ()
106{
107 return {};
108}
109
110HardcodedFormatters::HardcodedSummaryFinder
111Language::GetHardcodedSummaries ()
112{
113 return {};
114}
115
116HardcodedFormatters::HardcodedSyntheticFinder
117Language::GetHardcodedSynthetics ()
118{
119 return {};
120}
121
122HardcodedFormatters::HardcodedValidatorFinder
123Language::GetHardcodedValidators ()
124{
125 return {};
126}
127
Enrico Granatad3233c12015-09-09 01:10:46 +0000128std::vector<ConstString>
129Language::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic)
130{
131 return {};
132}
133
Enrico Granataac494532015-09-09 22:30:24 +0000134lldb_private::formatters::StringPrinter::EscapingHelper
135Language::GetStringPrinterEscapingHelper (lldb_private::formatters::StringPrinter::GetPrintableElementType elem_type)
136{
137 return StringPrinter::GetDefaultEscapingHelper(elem_type);
138}
139
Jim Ingham0e0984e2015-09-02 01:06:46 +0000140struct language_name_pair {
141 const char *name;
142 LanguageType type;
143};
144
145struct language_name_pair language_names[] =
146{
147 // To allow GetNameForLanguageType to be a simple array lookup, the first
148 // part of this array must follow enum LanguageType exactly.
149 { "unknown", eLanguageTypeUnknown },
150 { "c89", eLanguageTypeC89 },
151 { "c", eLanguageTypeC },
152 { "ada83", eLanguageTypeAda83 },
153 { "c++", eLanguageTypeC_plus_plus },
154 { "cobol74", eLanguageTypeCobol74 },
155 { "cobol85", eLanguageTypeCobol85 },
156 { "fortran77", eLanguageTypeFortran77 },
157 { "fortran90", eLanguageTypeFortran90 },
158 { "pascal83", eLanguageTypePascal83 },
159 { "modula2", eLanguageTypeModula2 },
160 { "java", eLanguageTypeJava },
161 { "c99", eLanguageTypeC99 },
162 { "ada95", eLanguageTypeAda95 },
163 { "fortran95", eLanguageTypeFortran95 },
164 { "pli", eLanguageTypePLI },
165 { "objective-c", eLanguageTypeObjC },
166 { "objective-c++", eLanguageTypeObjC_plus_plus },
167 { "upc", eLanguageTypeUPC },
168 { "d", eLanguageTypeD },
169 { "python", eLanguageTypePython },
170 { "opencl", eLanguageTypeOpenCL },
171 { "go", eLanguageTypeGo },
172 { "modula3", eLanguageTypeModula3 },
173 { "haskell", eLanguageTypeHaskell },
174 { "c++03", eLanguageTypeC_plus_plus_03 },
175 { "c++11", eLanguageTypeC_plus_plus_11 },
176 { "ocaml", eLanguageTypeOCaml },
177 { "rust", eLanguageTypeRust },
178 { "c11", eLanguageTypeC11 },
179 { "swift", eLanguageTypeSwift },
180 { "julia", eLanguageTypeJulia },
181 { "dylan", eLanguageTypeDylan },
182 { "c++14", eLanguageTypeC_plus_plus_14 },
183 { "fortran03", eLanguageTypeFortran03 },
184 { "fortran08", eLanguageTypeFortran08 },
185 // Vendor Extensions
186 { "mipsassem", eLanguageTypeMipsAssembler },
187 { "renderscript", eLanguageTypeExtRenderScript},
188 // Now synonyms, in arbitrary order
189 { "objc", eLanguageTypeObjC },
190 { "objc++", eLanguageTypeObjC_plus_plus },
191 { "pascal", eLanguageTypePascal83 }
192};
193
194static uint32_t num_languages = sizeof(language_names) / sizeof (struct language_name_pair);
195
196LanguageType
197Language::GetLanguageTypeFromString (const char *string)
198{
199 for (uint32_t i = 0; i < num_languages; i++)
200 {
201 if (strcasecmp (language_names[i].name, string) == 0)
202 return (LanguageType) language_names[i].type;
203 }
204 return eLanguageTypeUnknown;
205}
206
207const char *
208Language::GetNameForLanguageType (LanguageType language)
209{
210 if (language < num_languages)
211 return language_names[language].name;
212 else
213 return language_names[eLanguageTypeUnknown].name;
214}
215
216void
217Language::PrintAllLanguages (Stream &s, const char *prefix, const char *suffix)
218{
219 for (uint32_t i = 1; i < num_languages; i++)
220 {
221 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
222 }
223}
224
Enrico Granata28b38312015-09-02 01:31:10 +0000225void
226Language::ForAllLanguages (std::function<bool(lldb::LanguageType)> callback)
227{
228 for (uint32_t i = 1; i < num_languages; i++)
229 {
230 if (!callback(language_names[i].type))
231 break;
232 }
233}
234
Jim Ingham0e0984e2015-09-02 01:06:46 +0000235bool
236Language::LanguageIsCPlusPlus (LanguageType language)
237{
238 switch (language)
239 {
240 case eLanguageTypeC_plus_plus:
241 case eLanguageTypeC_plus_plus_03:
242 case eLanguageTypeC_plus_plus_11:
243 case eLanguageTypeC_plus_plus_14:
244 return true;
245 default:
246 return false;
247 }
248}
249
250bool
251Language::LanguageIsObjC (LanguageType language)
252{
253 switch (language)
254 {
255 case eLanguageTypeObjC:
256 case eLanguageTypeObjC_plus_plus:
257 return true;
258 default:
259 return false;
260 }
261}
262
263bool
264Language::LanguageIsC (LanguageType language)
265{
266 switch (language)
267 {
268 case eLanguageTypeC:
269 case eLanguageTypeC89:
270 case eLanguageTypeC99:
271 case eLanguageTypeC11:
272 return true;
273 default:
274 return false;
275 }
276}
277
278bool
279Language::LanguageIsPascal (LanguageType language)
280{
281 switch (language)
282 {
283 case eLanguageTypePascal83:
284 return true;
285 default:
286 return false;
287 }
288}
289
Dawn Perchikbfd96182015-12-16 19:40:00 +0000290LanguageType
291Language::GetPrimaryLanguage (LanguageType language)
292{
293 switch (language)
294 {
295 case eLanguageTypeC_plus_plus:
296 case eLanguageTypeC_plus_plus_03:
297 case eLanguageTypeC_plus_plus_11:
298 case eLanguageTypeC_plus_plus_14:
299 return eLanguageTypeC_plus_plus;
300 case eLanguageTypeC:
301 case eLanguageTypeC89:
302 case eLanguageTypeC99:
303 case eLanguageTypeC11:
304 return eLanguageTypeC;
305 case eLanguageTypeObjC:
306 case eLanguageTypeObjC_plus_plus:
307 return eLanguageTypeObjC;
308 case eLanguageTypePascal83:
309 case eLanguageTypeCobol74:
310 case eLanguageTypeCobol85:
311 case eLanguageTypeFortran77:
312 case eLanguageTypeFortran90:
313 case eLanguageTypeFortran95:
314 case eLanguageTypeFortran03:
315 case eLanguageTypeFortran08:
316 case eLanguageTypeAda83:
317 case eLanguageTypeAda95:
318 case eLanguageTypeModula2:
319 case eLanguageTypeJava:
320 case eLanguageTypePLI:
321 case eLanguageTypeUPC:
322 case eLanguageTypeD:
323 case eLanguageTypePython:
324 case eLanguageTypeOpenCL:
325 case eLanguageTypeGo:
326 case eLanguageTypeModula3:
327 case eLanguageTypeHaskell:
328 case eLanguageTypeOCaml:
329 case eLanguageTypeRust:
330 case eLanguageTypeSwift:
331 case eLanguageTypeJulia:
332 case eLanguageTypeDylan:
333 case eLanguageTypeMipsAssembler:
334 case eLanguageTypeExtRenderScript:
335 case eLanguageTypeUnknown:
336 default:
337 return language;
338 }
339}
340
Sean Callananfe38c852015-10-08 23:07:53 +0000341void
342Language::GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,
343 std::set<lldb::LanguageType> &languages_for_expressions)
344{
345 uint32_t idx = 0;
346
347 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++))
348 {
349 (*enumerate)(languages, languages_for_expressions);
350 }
351}
352
Sean Callanan93c0b002015-10-21 19:14:33 +0000353void
354Language::GetLanguagesSupportingREPLs (std::set<lldb::LanguageType> &languages)
355{
356 uint32_t idx = 0;
357
358 while (REPLEnumerateSupportedLanguages enumerate = PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(idx++))
359 {
360 (*enumerate)(languages);
361 }
362}
363
Enrico Granata9b0af1b2015-10-01 18:16:18 +0000364std::unique_ptr<Language::TypeScavenger>
365Language::GetTypeScavenger ()
366{
367 return nullptr;
368}
369
370size_t
371Language::TypeScavenger::Find (ExecutionContextScope *exe_scope,
372 const char *key,
373 ResultSet &results,
374 bool append)
375{
376 if (!exe_scope || !exe_scope->CalculateTarget().get())
377 return false;
378
379 if (!key || !key[0])
380 return false;
381
382 if (!append)
383 results.clear();
384
385 size_t old_size = results.size();
386
387 if (this->Find_Impl(exe_scope, key, results))
388 return results.size() - old_size;
389 return 0;
390}
391
Enrico Granata675f49b2015-10-07 18:36:53 +0000392bool
393Language::GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint,
394 std::string& prefix, std::string& suffix)
395{
396 return false;
397}
398
Enrico Granatac8e76492015-10-19 22:04:25 +0000399DumpValueObjectOptions::DeclPrintingHelper
400Language::GetDeclPrintingHelper ()
401{
402 return nullptr;
403}
404
Enrico Granata407b5c62015-11-02 21:52:05 +0000405LazyBool
406Language::IsLogicalTrue (ValueObject& valobj,
407 Error& error)
408{
409 return eLazyBoolCalculate;
410}
411
Enrico Granata608d67c2015-11-10 22:39:15 +0000412bool
413Language::IsNilReference (ValueObject& valobj)
414{
415 return false;
416}
417
418bool
419Language::IsUninitializedReference (ValueObject& valobj)
420{
421 return false;
422}
423
Enrico Granatad4129b42015-11-19 01:11:53 +0000424bool
425Language::GetFunctionDisplayName (const SymbolContext *sc,
Enrico Granata293207d2015-11-19 02:50:27 +0000426 const ExecutionContext *exe_ctx,
Enrico Granatad4129b42015-11-19 01:11:53 +0000427 FunctionNameRepresentation representation,
428 Stream& s)
429{
430 return false;
431}
432
Jim Inghama2023572015-12-18 02:14:04 +0000433void
434Language::GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
435{
436 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
437}
438
439void
440Language::GetDefaultExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
441{
442 s.Printf ("Exception breakpoint (catch: %s throw: %s)",
443 catch_on ? "on" : "off",
444 throw_on ? "on" : "off");
445}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000446//----------------------------------------------------------------------
447// Constructor
448//----------------------------------------------------------------------
449Language::Language()
450{
451}
452
453//----------------------------------------------------------------------
454// Destructor
455//----------------------------------------------------------------------
456Language::~Language()
457{
458}