blob: 8fef32a3b18694136296519233842ba7c1588da6 [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"
Enrico Granata63db2392016-11-01 18:50:49 +000018#include "lldb/Symbol/SymbolFile.h"
19#include "lldb/Symbol/TypeList.h"
20#include "lldb/Target/Target.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000021#include "lldb/Utility/Stream.h"
Enrico Granata5f9d3102015-08-27 21:33:50 +000022
Kamil Rytarowskic5f28e22017-02-06 17:55:02 +000023#include "llvm/Support/Threading.h"
24
Enrico Granata5f9d3102015-08-27 21:33:50 +000025using namespace lldb;
26using namespace lldb_private;
Enrico Granataac494532015-09-09 22:30:24 +000027using namespace lldb_private::formatters;
Enrico Granata5f9d3102015-08-27 21:33:50 +000028
29typedef std::unique_ptr<Language> LanguageUP;
30typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
31
Kate Stoneb9c1b512016-09-06 20:57:50 +000032static LanguagesMap &GetLanguagesMap() {
33 static LanguagesMap *g_map = nullptr;
Kamil Rytarowskic5f28e22017-02-06 17:55:02 +000034 static llvm::once_flag g_initialize;
Kate Stoneb9c1b512016-09-06 20:57:50 +000035
Kamil Rytarowskic5f28e22017-02-06 17:55:02 +000036 llvm::call_once(g_initialize, [] {
Kate Stoneb9c1b512016-09-06 20:57:50 +000037 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
38 // destructor chain
39 });
40
41 return *g_map;
Enrico Granata5f9d3102015-08-27 21:33:50 +000042}
Kate Stoneb9c1b512016-09-06 20:57:50 +000043static std::mutex &GetLanguagesMutex() {
44 static std::mutex *g_mutex = nullptr;
Kamil Rytarowskic5f28e22017-02-06 17:55:02 +000045 static llvm::once_flag g_initialize;
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000046
Kamil Rytarowskic5f28e22017-02-06 17:55:02 +000047 llvm::call_once(g_initialize, [] {
Kate Stoneb9c1b512016-09-06 20:57:50 +000048 g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
49 // destructor chain
50 });
Saleem Abdulrasool16ff8602016-05-18 01:59:10 +000051
Kate Stoneb9c1b512016-09-06 20:57:50 +000052 return *g_mutex;
Enrico Granata5f9d3102015-08-27 21:33:50 +000053}
54
Kate Stoneb9c1b512016-09-06 20:57:50 +000055Language *Language::FindPlugin(lldb::LanguageType language) {
56 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
57 LanguagesMap &map(GetLanguagesMap());
58 auto iter = map.find(language), end = map.end();
59 if (iter != end)
60 return iter->second.get();
61
62 Language *language_ptr = nullptr;
63 LanguageCreateInstance create_callback;
64
65 for (uint32_t idx = 0;
66 (create_callback =
67 PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
68 ++idx) {
69 language_ptr = create_callback(language);
70
71 if (language_ptr) {
72 map[language] = std::unique_ptr<Language>(language_ptr);
73 return language_ptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +000074 }
Kate Stoneb9c1b512016-09-06 20:57:50 +000075 }
76
77 return nullptr;
Enrico Granata5f9d3102015-08-27 21:33:50 +000078}
79
Kate Stoneb9c1b512016-09-06 20:57:50 +000080void Language::ForEach(std::function<bool(Language *)> callback) {
81 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
82 LanguagesMap &map(GetLanguagesMap());
83 for (const auto &entry : map) {
84 if (!callback(entry.second.get()))
85 break;
86 }
Enrico Granata5f9d3102015-08-27 21:33:50 +000087}
88
Kate Stoneb9c1b512016-09-06 20:57:50 +000089bool Language::IsTopLevelFunction(Function &function) { return false; }
90
91lldb::TypeCategoryImplSP Language::GetFormatters() { return nullptr; }
92
93HardcodedFormatters::HardcodedFormatFinder Language::GetHardcodedFormats() {
94 return {};
Enrico Granata6754e042015-09-30 23:12:22 +000095}
96
Kate Stoneb9c1b512016-09-06 20:57:50 +000097HardcodedFormatters::HardcodedSummaryFinder Language::GetHardcodedSummaries() {
98 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +000099}
100
101HardcodedFormatters::HardcodedSyntheticFinder
Kate Stoneb9c1b512016-09-06 20:57:50 +0000102Language::GetHardcodedSynthetics() {
103 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +0000104}
105
106HardcodedFormatters::HardcodedValidatorFinder
Kate Stoneb9c1b512016-09-06 20:57:50 +0000107Language::GetHardcodedValidators() {
108 return {};
Enrico Granata7cb59e12015-09-16 18:28:11 +0000109}
110
Enrico Granatad3233c12015-09-09 01:10:46 +0000111std::vector<ConstString>
Kate Stoneb9c1b512016-09-06 20:57:50 +0000112Language::GetPossibleFormattersMatches(ValueObject &valobj,
113 lldb::DynamicValueType use_dynamic) {
114 return {};
Enrico Granatad3233c12015-09-09 01:10:46 +0000115}
116
Enrico Granataac494532015-09-09 22:30:24 +0000117lldb_private::formatters::StringPrinter::EscapingHelper
Kate Stoneb9c1b512016-09-06 20:57:50 +0000118Language::GetStringPrinterEscapingHelper(
119 lldb_private::formatters::StringPrinter::GetPrintableElementType
120 elem_type) {
121 return StringPrinter::GetDefaultEscapingHelper(elem_type);
Enrico Granataac494532015-09-09 22:30:24 +0000122}
123
Jim Ingham0e0984e2015-09-02 01:06:46 +0000124struct language_name_pair {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000125 const char *name;
126 LanguageType type;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000127};
128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129struct language_name_pair language_names[] = {
Jim Ingham0e0984e2015-09-02 01:06:46 +0000130 // To allow GetNameForLanguageType to be a simple array lookup, the first
131 // part of this array must follow enum LanguageType exactly.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 {"unknown", eLanguageTypeUnknown},
133 {"c89", eLanguageTypeC89},
134 {"c", eLanguageTypeC},
135 {"ada83", eLanguageTypeAda83},
136 {"c++", eLanguageTypeC_plus_plus},
137 {"cobol74", eLanguageTypeCobol74},
138 {"cobol85", eLanguageTypeCobol85},
139 {"fortran77", eLanguageTypeFortran77},
140 {"fortran90", eLanguageTypeFortran90},
141 {"pascal83", eLanguageTypePascal83},
142 {"modula2", eLanguageTypeModula2},
143 {"java", eLanguageTypeJava},
144 {"c99", eLanguageTypeC99},
145 {"ada95", eLanguageTypeAda95},
146 {"fortran95", eLanguageTypeFortran95},
147 {"pli", eLanguageTypePLI},
148 {"objective-c", eLanguageTypeObjC},
149 {"objective-c++", eLanguageTypeObjC_plus_plus},
150 {"upc", eLanguageTypeUPC},
151 {"d", eLanguageTypeD},
152 {"python", eLanguageTypePython},
153 {"opencl", eLanguageTypeOpenCL},
154 {"go", eLanguageTypeGo},
155 {"modula3", eLanguageTypeModula3},
156 {"haskell", eLanguageTypeHaskell},
157 {"c++03", eLanguageTypeC_plus_plus_03},
158 {"c++11", eLanguageTypeC_plus_plus_11},
159 {"ocaml", eLanguageTypeOCaml},
160 {"rust", eLanguageTypeRust},
161 {"c11", eLanguageTypeC11},
162 {"swift", eLanguageTypeSwift},
163 {"julia", eLanguageTypeJulia},
164 {"dylan", eLanguageTypeDylan},
165 {"c++14", eLanguageTypeC_plus_plus_14},
166 {"fortran03", eLanguageTypeFortran03},
167 {"fortran08", eLanguageTypeFortran08},
Jim Ingham0e0984e2015-09-02 01:06:46 +0000168 // Vendor Extensions
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169 {"mipsassem", eLanguageTypeMipsAssembler},
170 {"renderscript", eLanguageTypeExtRenderScript},
Jim Ingham0e0984e2015-09-02 01:06:46 +0000171 // Now synonyms, in arbitrary order
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172 {"objc", eLanguageTypeObjC},
173 {"objc++", eLanguageTypeObjC_plus_plus},
174 {"pascal", eLanguageTypePascal83}};
Jim Ingham0e0984e2015-09-02 01:06:46 +0000175
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176static uint32_t num_languages =
177 sizeof(language_names) / sizeof(struct language_name_pair);
Jim Ingham0e0984e2015-09-02 01:06:46 +0000178
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000179LanguageType Language::GetLanguageTypeFromString(llvm::StringRef string) {
180 for (const auto &L : language_names) {
181 if (string.equals_lower(L.name))
182 return static_cast<LanguageType>(L.type);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000183 }
Zachary Turner6fa7681b2016-09-17 02:00:02 +0000184
Kate Stoneb9c1b512016-09-06 20:57:50 +0000185 return eLanguageTypeUnknown;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000186}
187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188const char *Language::GetNameForLanguageType(LanguageType language) {
189 if (language < num_languages)
190 return language_names[language].name;
191 else
192 return language_names[eLanguageTypeUnknown].name;
Jim Ingham0e0984e2015-09-02 01:06:46 +0000193}
194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195void Language::PrintAllLanguages(Stream &s, const char *prefix,
196 const char *suffix) {
197 for (uint32_t i = 1; i < num_languages; i++) {
198 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
199 }
Jim Ingham0e0984e2015-09-02 01:06:46 +0000200}
201
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202void Language::ForAllLanguages(
203 std::function<bool(lldb::LanguageType)> callback) {
204 for (uint32_t i = 1; i < num_languages; i++) {
205 if (!callback(language_names[i].type))
206 break;
207 }
Enrico Granata28b38312015-09-02 01:31:10 +0000208}
209
Kate Stoneb9c1b512016-09-06 20:57:50 +0000210bool Language::LanguageIsCPlusPlus(LanguageType language) {
211 switch (language) {
212 case eLanguageTypeC_plus_plus:
213 case eLanguageTypeC_plus_plus_03:
214 case eLanguageTypeC_plus_plus_11:
215 case eLanguageTypeC_plus_plus_14:
216 case eLanguageTypeObjC_plus_plus:
217 return true;
218 default:
Enrico Granata675f49b2015-10-07 18:36:53 +0000219 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000220 }
Enrico Granata675f49b2015-10-07 18:36:53 +0000221}
222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223bool Language::LanguageIsObjC(LanguageType language) {
224 switch (language) {
225 case eLanguageTypeObjC:
226 case eLanguageTypeObjC_plus_plus:
227 return true;
228 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000229 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000231}
232
Kate Stoneb9c1b512016-09-06 20:57:50 +0000233bool Language::LanguageIsC(LanguageType language) {
234 switch (language) {
235 case eLanguageTypeC:
236 case eLanguageTypeC89:
237 case eLanguageTypeC99:
238 case eLanguageTypeC11:
239 return true;
240 default:
Enrico Granata608d67c2015-11-10 22:39:15 +0000241 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000242 }
Enrico Granata608d67c2015-11-10 22:39:15 +0000243}
244
Kate Stoneb9c1b512016-09-06 20:57:50 +0000245bool Language::LanguageIsPascal(LanguageType language) {
246 switch (language) {
247 case eLanguageTypePascal83:
248 return true;
249 default:
Enrico Granatad4129b42015-11-19 01:11:53 +0000250 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000251 }
Enrico Granatad4129b42015-11-19 01:11:53 +0000252}
253
Kate Stoneb9c1b512016-09-06 20:57:50 +0000254LanguageType Language::GetPrimaryLanguage(LanguageType language) {
255 switch (language) {
256 case eLanguageTypeC_plus_plus:
257 case eLanguageTypeC_plus_plus_03:
258 case eLanguageTypeC_plus_plus_11:
259 case eLanguageTypeC_plus_plus_14:
260 return eLanguageTypeC_plus_plus;
261 case eLanguageTypeC:
262 case eLanguageTypeC89:
263 case eLanguageTypeC99:
264 case eLanguageTypeC11:
265 return eLanguageTypeC;
266 case eLanguageTypeObjC:
267 case eLanguageTypeObjC_plus_plus:
268 return eLanguageTypeObjC;
269 case eLanguageTypePascal83:
270 case eLanguageTypeCobol74:
271 case eLanguageTypeCobol85:
272 case eLanguageTypeFortran77:
273 case eLanguageTypeFortran90:
274 case eLanguageTypeFortran95:
275 case eLanguageTypeFortran03:
276 case eLanguageTypeFortran08:
277 case eLanguageTypeAda83:
278 case eLanguageTypeAda95:
279 case eLanguageTypeModula2:
280 case eLanguageTypeJava:
281 case eLanguageTypePLI:
282 case eLanguageTypeUPC:
283 case eLanguageTypeD:
284 case eLanguageTypePython:
285 case eLanguageTypeOpenCL:
286 case eLanguageTypeGo:
287 case eLanguageTypeModula3:
288 case eLanguageTypeHaskell:
289 case eLanguageTypeOCaml:
290 case eLanguageTypeRust:
291 case eLanguageTypeSwift:
292 case eLanguageTypeJulia:
293 case eLanguageTypeDylan:
294 case eLanguageTypeMipsAssembler:
295 case eLanguageTypeExtRenderScript:
296 case eLanguageTypeUnknown:
297 default:
298 return language;
299 }
Jim Inghama2023572015-12-18 02:14:04 +0000300}
301
Kate Stoneb9c1b512016-09-06 20:57:50 +0000302void Language::GetLanguagesSupportingTypeSystems(
303 std::set<lldb::LanguageType> &languages,
304 std::set<lldb::LanguageType> &languages_for_expressions) {
305 uint32_t idx = 0;
306
307 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::
308 GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++)) {
309 (*enumerate)(languages, languages_for_expressions);
310 }
311}
312
313void Language::GetLanguagesSupportingREPLs(
314 std::set<lldb::LanguageType> &languages) {
315 uint32_t idx = 0;
316
317 while (REPLEnumerateSupportedLanguages enumerate =
318 PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(
319 idx++)) {
320 (*enumerate)(languages);
321 }
322}
323
324std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
325 return nullptr;
326}
327
328const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
329
330size_t Language::TypeScavenger::Find(ExecutionContextScope *exe_scope,
331 const char *key, ResultSet &results,
332 bool append) {
333 if (!exe_scope || !exe_scope->CalculateTarget().get())
334 return false;
335
336 if (!key || !key[0])
337 return false;
338
339 if (!append)
340 results.clear();
341
342 size_t old_size = results.size();
343
344 if (this->Find_Impl(exe_scope, key, results))
345 return results.size() - old_size;
346 return 0;
347}
348
Enrico Granata63db2392016-11-01 18:50:49 +0000349bool Language::ImageListTypeScavenger::Find_Impl(
350 ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
351 bool result = false;
352
353 Target *target = exe_scope->CalculateTarget().get();
354 if (target) {
355 const auto &images(target->GetImages());
356 SymbolContext null_sc;
357 ConstString cs_key(key);
358 llvm::DenseSet<SymbolFile *> searched_sym_files;
359 TypeList matches;
360 images.FindTypes(null_sc, cs_key, false, UINT32_MAX, searched_sym_files,
361 matches);
362 for (const auto &match : matches.Types()) {
363 if (match.get()) {
364 CompilerType compiler_type(match->GetFullCompilerType());
365 compiler_type = AdjustForInclusion(compiler_type);
366 if (!compiler_type)
367 continue;
368 std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
369 new Result(compiler_type));
370 results.insert(std::move(scavengeresult));
371 result = true;
372 }
373 }
374 }
375
376 return result;
377}
378
Kate Stoneb9c1b512016-09-06 20:57:50 +0000379bool Language::GetFormatterPrefixSuffix(ValueObject &valobj,
380 ConstString type_hint,
381 std::string &prefix,
382 std::string &suffix) {
383 return false;
384}
385
386DumpValueObjectOptions::DeclPrintingHelper Language::GetDeclPrintingHelper() {
387 return nullptr;
388}
389
390LazyBool Language::IsLogicalTrue(ValueObject &valobj, Error &error) {
391 return eLazyBoolCalculate;
392}
393
394bool Language::IsNilReference(ValueObject &valobj) { return false; }
395
396bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
397
398bool Language::GetFunctionDisplayName(const SymbolContext *sc,
399 const ExecutionContext *exe_ctx,
400 FunctionNameRepresentation representation,
401 Stream &s) {
402 return false;
403}
404
405void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
406 Stream &s) {
407 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
408}
409
410void Language::GetDefaultExceptionResolverDescription(bool catch_on,
411 bool throw_on,
412 Stream &s) {
413 s.Printf("Exception breakpoint (catch: %s throw: %s)",
414 catch_on ? "on" : "off", throw_on ? "on" : "off");
Jim Inghama2023572015-12-18 02:14:04 +0000415}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000416//----------------------------------------------------------------------
417// Constructor
418//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000419Language::Language() {}
Enrico Granata5f9d3102015-08-27 21:33:50 +0000420
421//----------------------------------------------------------------------
422// Destructor
423//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000424Language::~Language() {}