blob: 197da91a98f799654c22fee319dbb73caea35f2a [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:
Sean Callanan7b3ef052016-02-12 19:47:57 +0000244 case eLanguageTypeObjC_plus_plus:
Jim Ingham0e0984e2015-09-02 01:06:46 +0000245 return true;
246 default:
247 return false;
248 }
249}
250
251bool
252Language::LanguageIsObjC (LanguageType language)
253{
254 switch (language)
255 {
256 case eLanguageTypeObjC:
257 case eLanguageTypeObjC_plus_plus:
258 return true;
259 default:
260 return false;
261 }
262}
263
264bool
265Language::LanguageIsC (LanguageType language)
266{
267 switch (language)
268 {
269 case eLanguageTypeC:
270 case eLanguageTypeC89:
271 case eLanguageTypeC99:
272 case eLanguageTypeC11:
273 return true;
274 default:
275 return false;
276 }
277}
278
279bool
280Language::LanguageIsPascal (LanguageType language)
281{
282 switch (language)
283 {
284 case eLanguageTypePascal83:
285 return true;
286 default:
287 return false;
288 }
289}
290
Dawn Perchikbfd96182015-12-16 19:40:00 +0000291LanguageType
292Language::GetPrimaryLanguage (LanguageType language)
293{
294 switch (language)
295 {
296 case eLanguageTypeC_plus_plus:
297 case eLanguageTypeC_plus_plus_03:
298 case eLanguageTypeC_plus_plus_11:
299 case eLanguageTypeC_plus_plus_14:
300 return eLanguageTypeC_plus_plus;
301 case eLanguageTypeC:
302 case eLanguageTypeC89:
303 case eLanguageTypeC99:
304 case eLanguageTypeC11:
305 return eLanguageTypeC;
306 case eLanguageTypeObjC:
307 case eLanguageTypeObjC_plus_plus:
308 return eLanguageTypeObjC;
309 case eLanguageTypePascal83:
310 case eLanguageTypeCobol74:
311 case eLanguageTypeCobol85:
312 case eLanguageTypeFortran77:
313 case eLanguageTypeFortran90:
314 case eLanguageTypeFortran95:
315 case eLanguageTypeFortran03:
316 case eLanguageTypeFortran08:
317 case eLanguageTypeAda83:
318 case eLanguageTypeAda95:
319 case eLanguageTypeModula2:
320 case eLanguageTypeJava:
321 case eLanguageTypePLI:
322 case eLanguageTypeUPC:
323 case eLanguageTypeD:
324 case eLanguageTypePython:
325 case eLanguageTypeOpenCL:
326 case eLanguageTypeGo:
327 case eLanguageTypeModula3:
328 case eLanguageTypeHaskell:
329 case eLanguageTypeOCaml:
330 case eLanguageTypeRust:
331 case eLanguageTypeSwift:
332 case eLanguageTypeJulia:
333 case eLanguageTypeDylan:
334 case eLanguageTypeMipsAssembler:
335 case eLanguageTypeExtRenderScript:
336 case eLanguageTypeUnknown:
337 default:
338 return language;
339 }
340}
341
Sean Callananfe38c852015-10-08 23:07:53 +0000342void
343Language::GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,
344 std::set<lldb::LanguageType> &languages_for_expressions)
345{
346 uint32_t idx = 0;
347
348 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++))
349 {
350 (*enumerate)(languages, languages_for_expressions);
351 }
352}
353
Sean Callanan93c0b002015-10-21 19:14:33 +0000354void
355Language::GetLanguagesSupportingREPLs (std::set<lldb::LanguageType> &languages)
356{
357 uint32_t idx = 0;
358
359 while (REPLEnumerateSupportedLanguages enumerate = PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(idx++))
360 {
361 (*enumerate)(languages);
362 }
363}
364
Enrico Granata9b0af1b2015-10-01 18:16:18 +0000365std::unique_ptr<Language::TypeScavenger>
366Language::GetTypeScavenger ()
367{
368 return nullptr;
369}
370
371size_t
372Language::TypeScavenger::Find (ExecutionContextScope *exe_scope,
373 const char *key,
374 ResultSet &results,
375 bool append)
376{
377 if (!exe_scope || !exe_scope->CalculateTarget().get())
378 return false;
379
380 if (!key || !key[0])
381 return false;
382
383 if (!append)
384 results.clear();
385
386 size_t old_size = results.size();
387
388 if (this->Find_Impl(exe_scope, key, results))
389 return results.size() - old_size;
390 return 0;
391}
392
Enrico Granata675f49b2015-10-07 18:36:53 +0000393bool
394Language::GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint,
395 std::string& prefix, std::string& suffix)
396{
397 return false;
398}
399
Enrico Granatac8e76492015-10-19 22:04:25 +0000400DumpValueObjectOptions::DeclPrintingHelper
401Language::GetDeclPrintingHelper ()
402{
403 return nullptr;
404}
405
Enrico Granata407b5c62015-11-02 21:52:05 +0000406LazyBool
407Language::IsLogicalTrue (ValueObject& valobj,
408 Error& error)
409{
410 return eLazyBoolCalculate;
411}
412
Enrico Granata608d67c2015-11-10 22:39:15 +0000413bool
414Language::IsNilReference (ValueObject& valobj)
415{
416 return false;
417}
418
419bool
420Language::IsUninitializedReference (ValueObject& valobj)
421{
422 return false;
423}
424
Enrico Granatad4129b42015-11-19 01:11:53 +0000425bool
426Language::GetFunctionDisplayName (const SymbolContext *sc,
Enrico Granata293207d2015-11-19 02:50:27 +0000427 const ExecutionContext *exe_ctx,
Enrico Granatad4129b42015-11-19 01:11:53 +0000428 FunctionNameRepresentation representation,
429 Stream& s)
430{
431 return false;
432}
433
Jim Inghama2023572015-12-18 02:14:04 +0000434void
435Language::GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
436{
437 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
438}
439
440void
441Language::GetDefaultExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
442{
Jim Ingham277dc3f2015-12-18 02:15:25 +0000443 s.Printf ("Exception breakpoint (catch: %s throw: %s)",
444 catch_on ? "on" : "off",
445 throw_on ? "on" : "off");
Jim Inghama2023572015-12-18 02:14:04 +0000446}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000447//----------------------------------------------------------------------
448// Constructor
449//----------------------------------------------------------------------
450Language::Language()
451{
452}
453
454//----------------------------------------------------------------------
455// Destructor
456//----------------------------------------------------------------------
457Language::~Language()
458{
459}