blob: 938d80ac1758e41fc05935683b9c9edaecd6e682 [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 Granata63db2392016-11-01 18:50:49 +000019#include "lldb/Symbol/SymbolFile.h"
20#include "lldb/Symbol/TypeList.h"
21#include "lldb/Target/Target.h"
Enrico Granata5f9d3102015-08-27 21:33:50 +000022
23using namespace lldb;
24using namespace lldb_private;
Enrico Granataac494532015-09-09 22:30:24 +000025using namespace lldb_private::formatters;
Enrico Granata5f9d3102015-08-27 21:33:50 +000026
27typedef std::unique_ptr<Language> LanguageUP;
28typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
29
Kate Stoneb9c1b512016-09-06 20:57:50 +000030static LanguagesMap &GetLanguagesMap() {
31 static LanguagesMap *g_map = nullptr;
32 static std::once_flag g_initialize;
33
34 std::call_once(g_initialize, [] {
35 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
36 // destructor chain
37 });
38
39 return *g_map;
Enrico Granata5f9d3102015-08-27 21:33:50 +000040}
Kate Stoneb9c1b512016-09-06 20:57:50 +000041static std::mutex &GetLanguagesMutex() {
42 static std::mutex *g_mutex = nullptr;
43 static std::once_flag g_initialize;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000044
Kate Stoneb9c1b512016-09-06 20:57:50 +000045 std::call_once(g_initialize, [] {
46 g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
47 // destructor chain
48 });
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000049
Kate Stoneb9c1b512016-09-06 20:57:50 +000050 return *g_mutex;
Enrico Granata5f9d3102015-08-27 21:33:50 +000051}
52
Kate Stoneb9c1b512016-09-06 20:57:50 +000053Language *Language::FindPlugin(lldb::LanguageType language) {
54 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
55 LanguagesMap &map(GetLanguagesMap());
56 auto iter = map.find(language), end = map.end();
57 if (iter != end)
58 return iter->second.get();
59
60 Language *language_ptr = nullptr;
61 LanguageCreateInstance create_callback;
62
63 for (uint32_t idx = 0;
64 (create_callback =
65 PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
66 ++idx) {
67 language_ptr = create_callback(language);
68
69 if (language_ptr) {
70 map[language] = std::unique_ptr<Language>(language_ptr);
71 return language_ptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +000072 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000073 }
74
75 return nullptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +000076}
77
Kate Stoneb9c1b512016-09-06 20:57:50 +000078void Language::ForEach(std::function<bool(Language *)> callback) {
79 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
80 LanguagesMap &map(GetLanguagesMap());
81 for (const auto &entry : map) {
82 if (!callback(entry.second.get()))
83 break;
84 }
Enrico Granata5f9d3102015-08-27 21:33:50 +000085}
86
Kate Stoneb9c1b512016-09-06 20:57:50 +000087bool Language::IsTopLevelFunction(Function &function) { return false; }
88
89lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
90
91HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
92 return {};
Enrico Granata6754e042015-09-30 23:12:22 +000093}
94
Kate Stoneb9c1b512016-09-06 20:57:50 +000095HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
96 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +000097}
98
99HardcodedFormatters::HardcodedSyntheticFinder
Kate Stoneb9c1b512016-09-06 20:57:50 +0000100Language::GetHardcodedSynthetics() {
101 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +0000102}
103
104HardcodedFormatters::HardcodedValidatorFinder
Kate Stoneb9c1b512016-09-06 20:57:50 +0000105Language::GetHardcodedValidators() {
106 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +0000107}
108
Enrico Granatad3233c12015-09-09 01:10:46 +0000109std::vector<ConstString>
Kate Stoneb9c1b512016-09-06 20:57:50 +0000110Language::GetPossibleFormattersMatches(ValueObject &valobj,
111 lldb::DynamicValueType use_dynamic) {
112 return {};
Enrico Granatad3233c12015-09-09 01:10:46 +0000113}
114
Enrico Granataac494532015-09-09 22:30:24 +0000115lldb_private::formatters::StringPrinter::EscapingHelper
Kate Stoneb9c1b512016-09-06 20:57:50 +0000116Language::GetStringPrinterEscapingHelper(
117 lldb_private::formatters::StringPrinter::GetPrintableElementType
118 elem_type) {
119 return StringPrinter::GetDefaultEscapingHelper(elem_type);
Enrico Granataac494532015-09-09 22:30:24 +0000120}
121
Jim Ingham0e0984e2015-09-02 01:06:46 +0000122struct language_name_pair {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 const char *name;
124 LanguageType type;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000125};
126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127struct language_name_pair language_names[] = {
Jim Ingham0e0984e2015-09-02 01:06:46 +0000128 // To allow GetNameForLanguageType to be a simple array lookup, the first
129 // part of this array must follow enum LanguageType exactly.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 {"unknown", eLanguageTypeUnknown},
131 {"c89", eLanguageTypeC89},
132 {"c", eLanguageTypeC},
133 {"ada83", eLanguageTypeAda83},
134 {"c++", eLanguageTypeC_plus_plus},
135 {"cobol74", eLanguageTypeCobol74},
136 {"cobol85", eLanguageTypeCobol85},
137 {"fortran77", eLanguageTypeFortran77},
138 {"fortran90", eLanguageTypeFortran90},
139 {"pascal83", eLanguageTypePascal83},
140 {"modula2", eLanguageTypeModula2},
141 {"java", eLanguageTypeJava},
142 {"c99", eLanguageTypeC99},
143 {"ada95", eLanguageTypeAda95},
144 {"fortran95", eLanguageTypeFortran95},
145 {"pli", eLanguageTypePLI},
146 {"objective-c", eLanguageTypeObjC},
147 {"objective-c++", eLanguageTypeObjC_plus_plus},
148 {"upc", eLanguageTypeUPC},
149 {"d", eLanguageTypeD},
150 {"python", eLanguageTypePython},
151 {"opencl", eLanguageTypeOpenCL},
152 {"go", eLanguageTypeGo},
153 {"modula3", eLanguageTypeModula3},
154 {"haskell", eLanguageTypeHaskell},
155 {"c++03", eLanguageTypeC_plus_plus_03},
156 {"c++11", eLanguageTypeC_plus_plus_11},
157 {"ocaml", eLanguageTypeOCaml},
158 {"rust", eLanguageTypeRust},
159 {"c11", eLanguageTypeC11},
160 {"swift", eLanguageTypeSwift},
161 {"julia", eLanguageTypeJulia},
162 {"dylan", eLanguageTypeDylan},
163 {"c++14", eLanguageTypeC_plus_plus_14},
164 {"fortran03", eLanguageTypeFortran03},
165 {"fortran08", eLanguageTypeFortran08},
Jim Ingham0e0984e2015-09-02 01:06:46 +0000166 // Vendor Extensions
Kate Stoneb9c1b512016-09-06 20:57:50 +0000167 {"mipsassem", eLanguageTypeMipsAssembler},
168 {"renderscript", eLanguageTypeExtRenderScript},
Jim Ingham0e0984e2015-09-02 01:06:46 +0000169 // Now synonyms, in arbitrary order
Kate Stoneb9c1b512016-09-06 20:57:50 +0000170 {"objc", eLanguageTypeObjC},
171 {"objc++", eLanguageTypeObjC_plus_plus},
172 {"pascal", eLanguageTypePascal83}};
Jim Ingham0e0984e2015-09-02 01:06:46 +0000173
Kate Stoneb9c1b512016-09-06 20:57:50 +0000174static uint32_t num_languages =
175 sizeof(language_names) / sizeof(struct language_name_pair);
Jim Ingham0e0984e2015-09-02 01:06:46 +0000176
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000177LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
178 for (const auto &L : language_names) {
179 if (string.equals_lower(L.name))
180 return static_cast<LanguageType>(L.type);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181 }
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000182
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 return eLanguageTypeUnknown;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000184}
185
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186const char *Language::GetNameForLanguageType(LanguageType language) {
187 if (language < num_languages)
188 return language_names[language].name;
189 else
190 return language_names[eLanguageTypeUnknown].name;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000191}
192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193void Language::PrintAllLanguages(Stream &s, const char *prefix,
194 const char *suffix) {
195 for (uint32_t i = 1; i < num_languages; i++) {
196 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
197 }
Jim Ingham0e0984e2015-09-02 01:06:46 +0000198}
199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200void Language::ForAllLanguages(
201 std::function<bool(lldb::LanguageType)> callback) {
202 for (uint32_t i = 1; i < num_languages; i++) {
203 if (!callback(language_names[i].type))
204 break;
205 }
Enrico Granata28b38312015-09-02 01:31:10 +0000206}
207
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208bool Language::LanguageIsCPlusPlus(LanguageType language) {
209 switch (language) {
210 case eLanguageTypeC_plus_plus:
211 case eLanguageTypeC_plus_plus_03:
212 case eLanguageTypeC_plus_plus_11:
213 case eLanguageTypeC_plus_plus_14:
214 case eLanguageTypeObjC_plus_plus:
215 return true;
216 default:
Enrico Granata675f49b2015-10-07 18:36:53 +0000217 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000218 }
Enrico Granata675f49b2015-10-07 18:36:53 +0000219}
220
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221bool Language::LanguageIsObjC(LanguageType language) {
222 switch (language) {
223 case eLanguageTypeObjC:
224 case eLanguageTypeObjC_plus_plus:
225 return true;
226 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000227 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000229}
230
Kate Stoneb9c1b512016-09-06 20:57:50 +0000231bool Language::LanguageIsC(LanguageType language) {
232 switch (language) {
233 case eLanguageTypeC:
234 case eLanguageTypeC89:
235 case eLanguageTypeC99:
236 case eLanguageTypeC11:
237 return true;
238 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000239 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000240 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000241}
242
Kate Stoneb9c1b512016-09-06 20:57:50 +0000243bool Language::LanguageIsPascal(LanguageType language) {
244 switch (language) {
245 case eLanguageTypePascal83:
246 return true;
247 default:
Enrico Granatad4129b42015-11-19 01:11:53 +0000248 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000249 }
Enrico Granatad4129b42015-11-19 01:11:53 +0000250}
251
Kate Stoneb9c1b512016-09-06 20:57:50 +0000252LanguageType Language::GetPrimaryLanguage(LanguageType language) {
253 switch (language) {
254 case eLanguageTypeC_plus_plus:
255 case eLanguageTypeC_plus_plus_03:
256 case eLanguageTypeC_plus_plus_11:
257 case eLanguageTypeC_plus_plus_14:
258 return eLanguageTypeC_plus_plus;
259 case eLanguageTypeC:
260 case eLanguageTypeC89:
261 case eLanguageTypeC99:
262 case eLanguageTypeC11:
263 return eLanguageTypeC;
264 case eLanguageTypeObjC:
265 case eLanguageTypeObjC_plus_plus:
266 return eLanguageTypeObjC;
267 case eLanguageTypePascal83:
268 case eLanguageTypeCobol74:
269 case eLanguageTypeCobol85:
270 case eLanguageTypeFortran77:
271 case eLanguageTypeFortran90:
272 case eLanguageTypeFortran95:
273 case eLanguageTypeFortran03:
274 case eLanguageTypeFortran08:
275 case eLanguageTypeAda83:
276 case eLanguageTypeAda95:
277 case eLanguageTypeModula2:
278 case eLanguageTypeJava:
279 case eLanguageTypePLI:
280 case eLanguageTypeUPC:
281 case eLanguageTypeD:
282 case eLanguageTypePython:
283 case eLanguageTypeOpenCL:
284 case eLanguageTypeGo:
285 case eLanguageTypeModula3:
286 case eLanguageTypeHaskell:
287 case eLanguageTypeOCaml:
288 case eLanguageTypeRust:
289 case eLanguageTypeSwift:
290 case eLanguageTypeJulia:
291 case eLanguageTypeDylan:
292 case eLanguageTypeMipsAssembler:
293 case eLanguageTypeExtRenderScript:
294 case eLanguageTypeUnknown:
295 default:
296 return language;
297 }
Jim Inghama2023572015-12-18 02:14:04 +0000298}
299
Kate Stoneb9c1b512016-09-06 20:57:50 +0000300void Language::GetLanguagesSupportingTypeSystems(
301 std::set<lldb::LanguageType> &languages,
302 std::set<lldb::LanguageType> &languages_for_expressions) {
303 uint32_t idx = 0;
304
305 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::
306 GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) {
307 (*enumerate)(languages, languages_for_expressions);
308 }
309}
310
311void Language::GetLanguagesSupportingREPLs(
312 std::set<lldb::LanguageType> &languages) {
313 uint32_t idx = 0;
314
315 while (REPLEnumerateSupportedLanguages enumerate =
316 PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(
317 idx++)) {
318 (*enumerate)(languages);
319 }
320}
321
322std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
323 return nullptr;
324}
325
326const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
327
328size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
329 const char *key, ResultSet &results,
330 bool append) {
331 if (!exe_scope || !exe_scope->CalculateTarget().get())
332 return false;
333
334 if (!key || !key[0])
335 return false;
336
337 if (!append)
338 results.clear();
339
340 size_t old_size = results.size();
341
342 if (this->Find_Impl(exe_scope, key, results))
343 return results.size() - old_size;
344 return 0;
345}
346
Enrico Granata63db2392016-11-01 18:50:49 +0000347bool Language::ImageListTypeScavenger::Find_Impl(
348 ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
349 bool result = false;
350
351 Target *target = exe_scope->CalculateTarget().get();
352 if (target) {
353 const auto &images(target->GetImages());
354 SymbolContext null_sc;
355 ConstString cs_key(key);
356 llvm::DenseSet<SymbolFile *> searched_sym_files;
357 TypeList matches;
358 images.FindTypes(null_sc, cs_key, false, UINT32_MAX, searched_sym_files,
359 matches);
360 for (const auto &match : matches.Types()) {
361 if (match.get()) {
362 CompilerType compiler_type(match->GetFullCompilerType());
363 compiler_type = AdjustForInclusion(compiler_type);
364 if (!compiler_type)
365 continue;
366 std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
367 new Result(compiler_type));
368 results.insert(std::move(scavengeresult));
369 result = true;
370 }
371 }
372 }
373
374 return result;
375}
376
Kate Stoneb9c1b512016-09-06 20:57:50 +0000377bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
378 ConstString type_hint,
379 std::string &prefix,
380 std::string &suffix) {
381 return false;
382}
383
384DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
385 return nullptr;
386}
387
388LazyBool Language::IsLogicalTrue(ValueObject &valobj, Error &error) {
389 return eLazyBoolCalculate;
390}
391
392bool Language::IsNilReference(ValueObject &valobj) { return false; }
393
394bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
395
396bool Language::GetFunctionDisplayName(const SymbolContext *sc,
397 const ExecutionContext *exe_ctx,
398 FunctionNameRepresentation representation,
399 Stream &s) {
400 return false;
401}
402
403void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
404 Stream &s) {
405 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
406}
407
408void Language::GetDefaultExceptionResolverDescription(bool catch_on,
409 bool throw_on,
410 Stream &s) {
411 s.Printf("Exception breakpoint (catch: %s throw: %s)",
412 catch_on ? "on" : "off", throw_on ? "on" : "off");
Jim Inghama2023572015-12-18 02:14:04 +0000413}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000414//----------------------------------------------------------------------
415// Constructor
416//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000417Language::Language() {}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000418
419//----------------------------------------------------------------------
420// Destructor
421//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000422Language::~Language() {}