1 //===-- Language.cpp -------------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
14 #include "lldb/Target/Language.h"
16 #include "lldb/Core/PluginManager.h"
17 #include "lldb/Core/Stream.h"
20 using namespace lldb_private;
21 using namespace lldb_private::formatters;
23 typedef std::unique_ptr<Language> LanguageUP;
24 typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
29 static LanguagesMap *g_map = nullptr;
30 static std::once_flag g_initialize;
32 std::call_once(g_initialize, [] {
33 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global destructor chain
41 static std::mutex *g_mutex = nullptr;
42 static std::once_flag g_initialize;
44 std::call_once(g_initialize, [] {
45 g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global destructor chain
52 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();
58 return iter->second.get();
60 Language *language_ptr = nullptr;
61 LanguageCreateInstance create_callback;
63 for (uint32_t idx = 0;
64 (create_callback = PluginManager::GetLanguageCreateCallbackAtIndex(idx)) != nullptr;
67 language_ptr = create_callback(language);
71 map[language] = std::unique_ptr<Language>(language_ptr);
80 Language::ForEach (std::function<bool(Language*)> callback)
82 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
83 LanguagesMap& map(GetLanguagesMap());
84 for (const auto& entry : map)
86 if (!callback(entry.second.get()))
92 Language::IsTopLevelFunction (Function& function)
97 lldb::TypeCategoryImplSP
98 Language::GetFormatters ()
103 HardcodedFormatters::HardcodedFormatFinder
104 Language::GetHardcodedFormats ()
109 HardcodedFormatters::HardcodedSummaryFinder
110 Language::GetHardcodedSummaries ()
115 HardcodedFormatters::HardcodedSyntheticFinder
116 Language::GetHardcodedSynthetics ()
121 HardcodedFormatters::HardcodedValidatorFinder
122 Language::GetHardcodedValidators ()
127 std::vector<ConstString>
128 Language::GetPossibleFormattersMatches (ValueObject& valobj, lldb::DynamicValueType use_dynamic)
133 lldb_private::formatters::StringPrinter::EscapingHelper
134 Language::GetStringPrinterEscapingHelper (lldb_private::formatters::StringPrinter::GetPrintableElementType elem_type)
136 return StringPrinter::GetDefaultEscapingHelper(elem_type);
139 struct language_name_pair {
144 struct language_name_pair language_names[] =
146 // To allow GetNameForLanguageType to be a simple array lookup, the first
147 // part of this array must follow enum LanguageType exactly.
148 { "unknown", eLanguageTypeUnknown },
149 { "c89", eLanguageTypeC89 },
150 { "c", eLanguageTypeC },
151 { "ada83", eLanguageTypeAda83 },
152 { "c++", eLanguageTypeC_plus_plus },
153 { "cobol74", eLanguageTypeCobol74 },
154 { "cobol85", eLanguageTypeCobol85 },
155 { "fortran77", eLanguageTypeFortran77 },
156 { "fortran90", eLanguageTypeFortran90 },
157 { "pascal83", eLanguageTypePascal83 },
158 { "modula2", eLanguageTypeModula2 },
159 { "java", eLanguageTypeJava },
160 { "c99", eLanguageTypeC99 },
161 { "ada95", eLanguageTypeAda95 },
162 { "fortran95", eLanguageTypeFortran95 },
163 { "pli", eLanguageTypePLI },
164 { "objective-c", eLanguageTypeObjC },
165 { "objective-c++", eLanguageTypeObjC_plus_plus },
166 { "upc", eLanguageTypeUPC },
167 { "d", eLanguageTypeD },
168 { "python", eLanguageTypePython },
169 { "opencl", eLanguageTypeOpenCL },
170 { "go", eLanguageTypeGo },
171 { "modula3", eLanguageTypeModula3 },
172 { "haskell", eLanguageTypeHaskell },
173 { "c++03", eLanguageTypeC_plus_plus_03 },
174 { "c++11", eLanguageTypeC_plus_plus_11 },
175 { "ocaml", eLanguageTypeOCaml },
176 { "rust", eLanguageTypeRust },
177 { "c11", eLanguageTypeC11 },
178 { "swift", eLanguageTypeSwift },
179 { "julia", eLanguageTypeJulia },
180 { "dylan", eLanguageTypeDylan },
181 { "c++14", eLanguageTypeC_plus_plus_14 },
182 { "fortran03", eLanguageTypeFortran03 },
183 { "fortran08", eLanguageTypeFortran08 },
185 { "mipsassem", eLanguageTypeMipsAssembler },
186 { "renderscript", eLanguageTypeExtRenderScript},
187 // Now synonyms, in arbitrary order
188 { "objc", eLanguageTypeObjC },
189 { "objc++", eLanguageTypeObjC_plus_plus },
190 { "pascal", eLanguageTypePascal83 }
193 static uint32_t num_languages = sizeof(language_names) / sizeof (struct language_name_pair);
196 Language::GetLanguageTypeFromString (const char *string)
198 for (uint32_t i = 0; i < num_languages; i++)
200 if (strcasecmp (language_names[i].name, string) == 0)
201 return (LanguageType) language_names[i].type;
203 return eLanguageTypeUnknown;
207 Language::GetNameForLanguageType (LanguageType language)
209 if (language < num_languages)
210 return language_names[language].name;
212 return language_names[eLanguageTypeUnknown].name;
216 Language::PrintAllLanguages (Stream &s, const char *prefix, const char *suffix)
218 for (uint32_t i = 1; i < num_languages; i++)
220 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
225 Language::ForAllLanguages (std::function<bool(lldb::LanguageType)> callback)
227 for (uint32_t i = 1; i < num_languages; i++)
229 if (!callback(language_names[i].type))
235 Language::LanguageIsCPlusPlus (LanguageType language)
239 case eLanguageTypeC_plus_plus:
240 case eLanguageTypeC_plus_plus_03:
241 case eLanguageTypeC_plus_plus_11:
242 case eLanguageTypeC_plus_plus_14:
243 case eLanguageTypeObjC_plus_plus:
251 Language::LanguageIsObjC (LanguageType language)
255 case eLanguageTypeObjC:
256 case eLanguageTypeObjC_plus_plus:
264 Language::LanguageIsC (LanguageType language)
269 case eLanguageTypeC89:
270 case eLanguageTypeC99:
271 case eLanguageTypeC11:
279 Language::LanguageIsPascal (LanguageType language)
283 case eLanguageTypePascal83:
291 Language::GetPrimaryLanguage (LanguageType language)
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;
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:
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:
342 Language::GetLanguagesSupportingTypeSystems (std::set<lldb::LanguageType> &languages,
343 std::set<lldb::LanguageType> &languages_for_expressions)
347 while (TypeSystemEnumerateSupportedLanguages enumerate = PluginManager::GetTypeSystemEnumerateSupportedLanguagesCallbackAtIndex(idx++))
349 (*enumerate)(languages, languages_for_expressions);
354 Language::GetLanguagesSupportingREPLs (std::set<lldb::LanguageType> &languages)
358 while (REPLEnumerateSupportedLanguages enumerate = PluginManager::GetREPLEnumerateSupportedLanguagesCallbackAtIndex(idx++))
360 (*enumerate)(languages);
364 std::unique_ptr<Language::TypeScavenger>
365 Language::GetTypeScavenger ()
371 Language::GetLanguageSpecificTypeLookupHelp ()
377 Language::TypeScavenger::Find (ExecutionContextScope *exe_scope,
382 if (!exe_scope || !exe_scope->CalculateTarget().get())
391 size_t old_size = results.size();
393 if (this->Find_Impl(exe_scope, key, results))
394 return results.size() - old_size;
399 Language::GetFormatterPrefixSuffix (ValueObject& valobj, ConstString type_hint,
400 std::string& prefix, std::string& suffix)
405 DumpValueObjectOptions::DeclPrintingHelper
406 Language::GetDeclPrintingHelper ()
412 Language::IsLogicalTrue (ValueObject& valobj,
415 return eLazyBoolCalculate;
419 Language::IsNilReference (ValueObject& valobj)
425 Language::IsUninitializedReference (ValueObject& valobj)
431 Language::GetFunctionDisplayName (const SymbolContext *sc,
432 const ExecutionContext *exe_ctx,
433 FunctionNameRepresentation representation,
440 Language::GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
442 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
446 Language::GetDefaultExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
448 s.Printf ("Exception breakpoint (catch: %s throw: %s)",
449 catch_on ? "on" : "off",
450 throw_on ? "on" : "off");
452 //----------------------------------------------------------------------
454 //----------------------------------------------------------------------
459 //----------------------------------------------------------------------
461 //----------------------------------------------------------------------
462 Language::~Language()