LLDB mainline
Language.cpp
Go to the documentation of this file.
1//===-- Language.cpp ------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include <array>
10#include <atomic>
11#include <functional>
12#include <map>
13#include <mutex>
14
16
21#include "lldb/Target/Target.h"
22#include "lldb/Utility/Stream.h"
23
24#include "llvm/BinaryFormat/Dwarf.h"
25#include "llvm/Support/Threading.h"
26
27using namespace lldb;
28using namespace lldb_private;
29using namespace lldb_private::formatters;
30
31typedef std::unique_ptr<Language> LanguageUP;
32typedef std::map<lldb::LanguageType, LanguageUP> LanguagesMap;
33
34#define LLDB_PROPERTIES_language
35#include "TargetProperties.inc"
36
37enum {
38#define LLDB_PROPERTIES_language
39#include "TargetPropertiesEnum.inc"
40};
41
43 static LanguageProperties g_settings;
44 return g_settings;
45}
46
48 static constexpr llvm::StringLiteral g_setting_name("language");
49 return g_setting_name;
50}
51
53 m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
54 m_collection_sp->Initialize(g_language_properties_def);
55}
56
58 const uint32_t idx = ePropertyEnableFilterForLineBreakpoints;
60 idx, g_language_properties[idx].default_uint_value != 0);
61}
62
64 static LanguagesMap *g_map = nullptr;
65 static llvm::once_flag g_initialize;
66
67 llvm::call_once(g_initialize, [] {
68 g_map = new LanguagesMap(); // NOTE: INTENTIONAL LEAK due to global
69 // destructor chain
70 });
71
72 return *g_map;
73}
74static std::mutex &GetLanguagesMutex() {
75 static std::mutex *g_mutex = nullptr;
76 static llvm::once_flag g_initialize;
77
78 llvm::call_once(g_initialize, [] {
79 g_mutex = new std::mutex(); // NOTE: INTENTIONAL LEAK due to global
80 // destructor chain
81 });
82
83 return *g_mutex;
84}
85
87 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
89 auto iter = map.find(language), end = map.end();
90 if (iter != end)
91 return iter->second.get();
92
93 Language *language_ptr = nullptr;
94
95 for (auto create_callback : PluginManager::GetLanguageCreateCallbacks()) {
96 language_ptr = create_callback(language);
97
98 if (language_ptr) {
99 map[language] = std::unique_ptr<Language>(language_ptr);
100 return language_ptr;
101 }
102 }
103
104 return nullptr;
105}
106
107Language *Language::FindPlugin(llvm::StringRef file_path) {
108 Language *result = nullptr;
109 ForEach([&result, file_path](Language *language) {
110 if (language->IsSourceFile(file_path)) {
111 result = language;
113 }
115 });
116 return result;
117}
118
120 llvm::StringRef file_path) {
121 Language *result = FindPlugin(language);
122 // Finding a language by file path is slower, we so we use this as the
123 // fallback.
124 if (!result)
125 result = FindPlugin(file_path);
126 return result;
127}
128
129Language *
131 if (scheme == Mangled::eManglingSchemeNone)
132 return nullptr;
133
134 // Mangled calls this for every name it demangles with a plugin, so avoid
135 // taking the lock in ForEach() each time. Language instances are never
136 // destroyed, so the plugin can be cached once it's found. Misses aren't
137 // cached, since the plugin may not be registered yet.
138 static std::array<std::atomic<Language *>, Mangled::kNumManglingSchemes>
139 g_plugins;
140 if (Language *language = g_plugins[scheme].load(std::memory_order_acquire))
141 return language;
142
143 Language *result = nullptr;
144 ForEach([&result, scheme](Language *language) {
145 if (language->HandlesManglingScheme(scheme)) {
146 result = language;
148 }
150 });
151 if (result)
152 g_plugins[scheme].store(result, std::memory_order_release);
153 return result;
154}
155
157 llvm::function_ref<IterationAction(Language *)> callback) {
158 // If we want to iterate over all languages, we first have to complete the
159 // LanguagesMap.
160 static llvm::once_flag g_initialize;
161 llvm::call_once(g_initialize, [] {
162 for (unsigned lang = eLanguageTypeUnknown; lang < eNumLanguageTypes;
163 ++lang) {
164 FindPlugin(static_cast<lldb::LanguageType>(lang));
165 }
166 });
167
168 // callback may call a method in Language that attempts to acquire the same
169 // lock (such as Language::ForEach or Language::FindPlugin). To avoid a
170 // deadlock, we do not use callback while holding the lock.
171 std::vector<Language *> loaded_plugins;
172 {
173 std::lock_guard<std::mutex> guard(GetLanguagesMutex());
175 for (const auto &entry : map) {
176 if (entry.second)
177 loaded_plugins.push_back(entry.second.get());
178 }
179 }
180
181 for (auto *lang : loaded_plugins) {
182 if (callback(lang) == IterationAction::Stop)
183 break;
184 }
185}
186
187llvm::Expected<LanguageType>
190 LanguageType exception_language = eLanguageTypeUnknown;
191
192 llvm::StringRef error_context;
193 switch (language) {
194 case eLanguageTypeC89:
195 case eLanguageTypeC:
196 case eLanguageTypeC99:
197 case eLanguageTypeC11:
198 exception_language = eLanguageTypeC;
199 break;
204 exception_language = eLanguageTypeC_plus_plus;
205 break;
207 error_context =
208 "Set exception breakpoints separately for c++ and objective-c";
209 break;
211 error_context = "Unknown language type for exception breakpoint";
212 break;
213 default:
214 if (Language *languagePlugin = Language::FindPlugin(language)) {
215 if (languagePlugin->SupportsExceptionBreakpointsOnThrow() ||
216 languagePlugin->SupportsExceptionBreakpointsOnCatch()) {
217 exception_language = language;
218 break;
219 }
220 }
221 error_context = "Unsupported language type for exception breakpoint";
222 }
223 if (!error_context.empty())
224 return llvm::createStringError(llvm::inconvertibleErrorCode(),
225 error_context);
226 return exception_language;
227}
228
229bool Language::IsTopLevelFunction(Function &function) { return false; }
230
232
236
240
243 return {};
244}
245
246std::vector<FormattersMatchCandidate>
248 lldb::DynamicValueType use_dynamic) {
249 return {};
250}
251
256
258 // To allow GetNameForLanguageType to be a simple array lookup, the first
259 // part of this array must follow enum LanguageType exactly.
260 {"unknown", eLanguageTypeUnknown},
261 {"c89", eLanguageTypeC89},
262 {"c", eLanguageTypeC},
263 {"ada83", eLanguageTypeAda83},
265 {"cobol74", eLanguageTypeCobol74},
266 {"cobol85", eLanguageTypeCobol85},
267 {"fortran77", eLanguageTypeFortran77},
268 {"fortran90", eLanguageTypeFortran90},
269 {"pascal83", eLanguageTypePascal83},
270 {"modula2", eLanguageTypeModula2},
271 {"java", eLanguageTypeJava},
272 {"c99", eLanguageTypeC99},
273 {"ada95", eLanguageTypeAda95},
274 {"fortran95", eLanguageTypeFortran95},
275 {"pli", eLanguageTypePLI},
276 {"objective-c", eLanguageTypeObjC},
277 {"objective-c++", eLanguageTypeObjC_plus_plus},
278 {"upc", eLanguageTypeUPC},
279 {"d", eLanguageTypeD},
280 {"python", eLanguageTypePython},
281 {"opencl", eLanguageTypeOpenCL},
282 {"go", eLanguageTypeGo},
283 {"modula3", eLanguageTypeModula3},
284 {"haskell", eLanguageTypeHaskell},
287 {"ocaml", eLanguageTypeOCaml},
288 {"rust", eLanguageTypeRust},
289 {"c11", eLanguageTypeC11},
290 {"swift", eLanguageTypeSwift},
291 {"julia", eLanguageTypeJulia},
292 {"dylan", eLanguageTypeDylan},
294 {"fortran03", eLanguageTypeFortran03},
295 {"fortran08", eLanguageTypeFortran08},
296 {"renderscript", eLanguageTypeRenderScript},
297 {"bliss", eLanguageTypeBLISS},
298 {"kotlin", eLanguageTypeKotlin},
299 {"zig", eLanguageTypeZig},
300 {"crystal", eLanguageTypeCrystal},
301 {"<invalid language>",
302 static_cast<LanguageType>(
303 0x0029)}, // Not yet taken by any language in the DWARF spec
304 // and thus has no entry in LanguageType
307 {"c17", eLanguageTypeC17},
308 {"fortran18", eLanguageTypeFortran18},
309 {"ada2005", eLanguageTypeAda2005},
310 {"ada2012", eLanguageTypeAda2012},
311 {"HIP", eLanguageTypeHIP},
312 {"assembly", eLanguageTypeAssembly},
313 {"c-sharp", eLanguageTypeC_sharp},
314 {"mojo", eLanguageTypeMojo},
315 // Vendor Extensions
316 {"assembler", eLanguageTypeMipsAssembler},
317 // Now synonyms, in arbitrary order
318 {"objc", eLanguageTypeObjC},
319 {"objc++", eLanguageTypeObjC_plus_plus},
320 {"pascal", eLanguageTypePascal83}};
321
322static uint32_t num_languages =
323 sizeof(language_names) / sizeof(struct language_name_pair);
324
326 for (const auto &L : language_names) {
327 if (string.equals_insensitive(L.name))
328 return L.type;
329 }
330
332}
333
335 if (language < num_languages)
336 return language_names[language].name;
337 else
339}
340
342 return SourceLanguage(language).GetDescription();
343}
344
346 llvm::StringRef prefix,
347 llvm::StringRef suffix) {
349 for (size_t idx = 0; idx < num_languages; ++idx) {
350 auto const &lang = language_names[idx];
351 if (supported[lang.type])
352 s << prefix << lang.name << suffix;
353 }
354}
355
356void Language::PrintAllLanguages(Stream &s, const char *prefix,
357 const char *suffix) {
358 for (uint32_t i = 1; i < num_languages; i++) {
359 s.Printf("%s%s%s", prefix, language_names[i].name, suffix);
360 }
361}
362
364 llvm::function_ref<IterationAction(lldb::LanguageType)> callback) {
365 for (uint32_t i = 1; i < num_languages; i++) {
366 if (callback(language_names[i].type) == IterationAction::Stop)
367 break;
368 }
369}
370
372 switch (language) {
380 return true;
381 default:
382 return false;
383 }
384}
385
387 switch (language) {
390 return true;
391 default:
392 return false;
393 }
394}
395
397 switch (language) {
398 case eLanguageTypeC:
399 case eLanguageTypeC89:
400 case eLanguageTypeC99:
401 case eLanguageTypeC11:
402 return true;
403 default:
404 return false;
405 }
406}
407
409 switch (language) {
410 case eLanguageTypeC:
411 case eLanguageTypeC89:
412 case eLanguageTypeC99:
413 case eLanguageTypeC11:
422 return true;
423 default:
424 return false;
425 }
426}
427
429 switch (language) {
436 return true;
437 default:
438 return false;
439 }
440}
441
443 switch (language) {
445 return true;
446 default:
447 return false;
448 }
449}
450
500
501std::set<lldb::LanguageType> Language::GetSupportedLanguages() {
502 std::set<lldb::LanguageType> supported_languages;
503 ForEach([&](Language *lang) {
504 supported_languages.emplace(lang->GetLanguageType());
506 });
507 return supported_languages;
508}
509
513
517
521
522std::unique_ptr<Language::TypeScavenger> Language::GetTypeScavenger() {
523 return nullptr;
524}
525
526const char *Language::GetLanguageSpecificTypeLookupHelp() { return nullptr; }
527
529 const char *key, ResultSet &results,
530 bool append) {
531 if (!exe_scope || !exe_scope->CalculateTarget().get())
532 return false;
533
534 if (!key || !key[0])
535 return false;
536
537 if (!append)
538 results.clear();
539
540 size_t old_size = results.size();
541
542 if (this->Find_Impl(exe_scope, key, results))
543 return results.size() - old_size;
544 return 0;
545}
546
548 ExecutionContextScope *exe_scope, const char *key, ResultSet &results) {
549 bool result = false;
550
551 Target *target = exe_scope->CalculateTarget().get();
552 if (target) {
553 const auto &images(target->GetImages());
554 TypeQuery query(key);
555 TypeResults type_results;
556 images.FindTypes(nullptr, query, type_results);
557 for (const auto &match : type_results.GetTypeMap().Types()) {
558 if (match) {
559 CompilerType compiler_type(match->GetFullCompilerType());
560 compiler_type = AdjustForInclusion(compiler_type);
561 if (!compiler_type)
562 continue;
563 std::unique_ptr<Language::TypeScavenger::Result> scavengeresult(
564 new Result(compiler_type));
565 results.insert(std::move(scavengeresult));
566 result = true;
567 }
568 }
569 }
570
571 return result;
572}
573
574std::pair<llvm::StringRef, llvm::StringRef>
575Language::GetFormatterPrefixSuffix(llvm::StringRef type_hint) {
576 return std::pair<llvm::StringRef, llvm::StringRef>();
577}
578
579bool Language::DemangledNameContainsPath(llvm::StringRef path,
580 ConstString demangled) const {
581 // The base implementation does a simple contains comparision:
582 if (path.empty())
583 return false;
584 return demangled.GetStringRef().contains(path);
585}
586
590
594
595bool Language::IsNilReference(ValueObject &valobj) { return false; }
596
597bool Language::IsUninitializedReference(ValueObject &valobj) { return false; }
598
600 const ExecutionContext *exe_ctx,
601 FunctionNameRepresentation representation,
602 Stream &s) {
603 return false;
604}
605
606void Language::GetExceptionResolverDescription(bool catch_on, bool throw_on,
607 Stream &s) {
608 GetDefaultExceptionResolverDescription(catch_on, throw_on, s);
609}
610
612 bool throw_on,
613 Stream &s) {
614 s.Printf("Exception breakpoint (catch: %s throw: %s)",
615 catch_on ? "on" : "off", throw_on ? "on" : "off");
616}
617
618std::optional<bool> Language::GetBooleanFromString(llvm::StringRef str) const {
619 return llvm::StringSwitch<std::optional<bool>>(str)
620 .Case("true", {true})
621 .Case("false", {false})
622 .Default({});
623}
624
625// Constructor
626Language::Language() = default;
627
628// Destructor
629Language::~Language() = default;
630
631static std::optional<llvm::dwarf::SourceLanguage>
633 if (language_type <= lldb::eLanguageTypeLastStandardLanguage)
634 return static_cast<llvm::dwarf::SourceLanguage>(language_type);
635
636 switch (language_type) {
638 return llvm::dwarf::DW_LANG_Mips_Assembler;
639 default:
640 return std::nullopt;
641 }
642}
643
645 std::optional<llvm::dwarf::SourceLanguage> dwarf_lang =
646 ToDwarfSourceLanguage(language_type);
647 if (!dwarf_lang)
648 return;
649
650 auto lname = llvm::dwarf::toDW_LNAME(*dwarf_lang);
651 if (!lname)
652 return;
653 name = lname->first;
654 version = lname->second;
655}
656
658 if (auto lang = llvm::dwarf::toDW_LANG((llvm::dwarf::SourceLanguageName)name,
659 version))
660 return (lldb::LanguageType)*lang;
662}
663
664llvm::StringRef SourceLanguage::GetDescription() const {
665 return llvm::dwarf::LanguageDescription(
666 static_cast<llvm::dwarf::SourceLanguageName>(name), version);
667}
668bool SourceLanguage::IsC() const { return name == llvm::dwarf::DW_LNAME_C; }
669
671 return name == llvm::dwarf::DW_LNAME_ObjC;
672}
673
675 return name == llvm::dwarf::DW_LNAME_C_plus_plus;
676}
677
679 const lldb::LanguageType &language, llvm::raw_ostream &OS,
680 llvm::StringRef Options) {
682}
static llvm::raw_ostream & error(Stream &strm)
static std::optional< llvm::dwarf::SourceLanguage > ToDwarfSourceLanguage(lldb::LanguageType language_type)
Definition Language.cpp:632
struct language_name_pair language_names[]
Definition Language.cpp:257
std::map< lldb::LanguageType, LanguageUP > LanguagesMap
Definition Language.cpp:32
static LanguagesMap & GetLanguagesMap()
Definition Language.cpp:63
static uint32_t num_languages
Definition Language.cpp:322
static std::mutex & GetLanguagesMutex()
Definition Language.cpp:74
std::unique_ptr< Language > LanguageUP
Definition Language.cpp:31
Generic representation of a type in a programming language.
A uniqued constant string class.
Definition ConstString.h:40
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
std::function< bool(llvm::StringRef, llvm::StringRef, const DumpValueObjectOptions &, Stream &)> DeclPrintingHelper
"lldb/Target/ExecutionContextScope.h" Inherit from this if your object can reconstruct its execution ...
virtual lldb::TargetSP CalculateTarget()=0
"lldb/Target/ExecutionContext.h" A class that contains an execution context.
A class that describes a function.
Definition Function.h:386
HardcodedFormatterFinders< SyntheticChildren > HardcodedSyntheticFinder
HardcodedFormatterFinders< TypeSummaryImpl > HardcodedSummaryFinder
HardcodedFormatterFinders< TypeFormatImpl > HardcodedFormatFinder
static llvm::StringRef GetSettingName()
Definition Language.cpp:47
bool GetEnableFilterForLineBreakpoints() const
Definition Language.cpp:57
virtual CompilerType AdjustForInclusion(CompilerType &candidate)=0
bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, ResultSet &results) override
Definition Language.cpp:547
std::set< std::unique_ptr< Result > > ResultSet
Definition Language.h:57
virtual bool Find_Impl(ExecutionContextScope *exe_scope, const char *key, ResultSet &results)=0
size_t Find(ExecutionContextScope *exe_scope, const char *key, ResultSet &results, bool append=true)
Definition Language.cpp:528
virtual bool IsSourceFile(llvm::StringRef file_path) const =0
static void PrintSupportedLanguagesForExpressions(Stream &s, llvm::StringRef prefix, llvm::StringRef suffix)
Prints to the specified stream 's' each language type that the current target supports for expression...
Definition Language.cpp:345
static LanguageSet GetLanguagesSupportingREPLs()
Definition Language.cpp:518
static LanguageSet GetLanguagesSupportingTypeSystems()
Definition Language.cpp:510
virtual std::optional< bool > GetBooleanFromString(llvm::StringRef str) const
Definition Language.cpp:618
virtual std::vector< FormattersMatchCandidate > GetPossibleFormattersMatches(ValueObject &valobj, lldb::DynamicValueType use_dynamic)
Definition Language.cpp:247
virtual lldb::TypeCategoryImplSP GetFormatters()
Definition Language.cpp:231
static void ForEach(llvm::function_ref< IterationAction(Language *)> callback)
Definition Language.cpp:156
static void ForAllLanguages(llvm::function_ref< IterationAction(lldb::LanguageType)> callback)
Definition Language.cpp:363
static Language * FindPlugin(lldb::LanguageType language)
Definition Language.cpp:86
static const char * GetNameForLanguageType(lldb::LanguageType language)
Returns the internal LLDB name for the specified language.
Definition Language.cpp:334
virtual DumpValueObjectOptions::DeclPrintingHelper GetDeclPrintingHelper()
Definition Language.cpp:587
static LanguageProperties & GetGlobalLanguageProperties()
Definition Language.cpp:42
virtual LazyBool IsLogicalTrue(ValueObject &valobj, Status &error)
Definition Language.cpp:591
virtual const char * GetLanguageSpecificTypeLookupHelp()
Definition Language.cpp:526
virtual bool GetFunctionDisplayName(const SymbolContext &sc, const ExecutionContext *exe_ctx, FunctionNameRepresentation representation, Stream &s)
Definition Language.cpp:599
virtual std::pair< llvm::StringRef, llvm::StringRef > GetFormatterPrefixSuffix(llvm::StringRef type_hint)
An individual data formatter may apply to several types and cross language boundaries.
Definition Language.cpp:575
static bool LanguageIsC(lldb::LanguageType language)
Definition Language.cpp:396
virtual lldb::LanguageType GetLanguageType() const =0
virtual HardcodedFormatters::HardcodedSummaryFinder GetHardcodedSummaries()
Definition Language.cpp:237
static void GetDefaultExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
Definition Language.cpp:611
virtual bool HandlesManglingScheme(Mangled::ManglingScheme scheme) const
Returns true if this language handles the names mangled with scheme.
Definition Language.h:334
virtual bool DemangledNameContainsPath(llvm::StringRef path, ConstString demangled) const
Definition Language.cpp:579
static bool LanguageIsCPlusPlus(lldb::LanguageType language)
Definition Language.cpp:371
static llvm::StringRef GetDisplayNameForLanguageType(lldb::LanguageType language)
Returns a user-friendly name for the specified language.
Definition Language.cpp:341
static Language * FindPluginForManglingScheme(Mangled::ManglingScheme scheme)
Returns the Language that handles names mangled with scheme, or a nullptr if there is none.
Definition Language.cpp:130
static lldb::LanguageType GetPrimaryLanguage(lldb::LanguageType language)
Definition Language.cpp:451
static bool LanguageIsPascal(lldb::LanguageType language)
Definition Language.cpp:442
virtual bool IsNilReference(ValueObject &valobj)
Definition Language.cpp:595
virtual bool IsUninitializedReference(ValueObject &valobj)
Definition Language.cpp:597
static void PrintAllLanguages(Stream &s, const char *prefix, const char *suffix)
Definition Language.cpp:356
static llvm::Expected< lldb::LanguageType > GetExceptionLanguageForLanguage(llvm::StringRef lang_name)
Definition Language.cpp:188
virtual HardcodedFormatters::HardcodedSyntheticFinder GetHardcodedSynthetics()
Definition Language.cpp:242
virtual std::unique_ptr< TypeScavenger > GetTypeScavenger()
Definition Language.cpp:522
static bool LanguageIsFortran(lldb::LanguageType language)
Definition Language.cpp:428
static LanguageSet GetLanguagesSupportingTypeSystemsForExpressions()
Definition Language.cpp:514
virtual bool IsTopLevelFunction(Function &function)
Definition Language.cpp:229
virtual void GetExceptionResolverDescription(bool catch_on, bool throw_on, Stream &s)
Definition Language.cpp:606
static lldb::LanguageType GetLanguageTypeFromString(const char *string)=delete
static bool LanguageIsCFamily(lldb::LanguageType language)
Equivalent to LanguageIsC||LanguageIsObjC||LanguageIsCPlusPlus.
Definition Language.cpp:408
static std::set< lldb::LanguageType > GetSupportedLanguages()
Definition Language.cpp:501
virtual HardcodedFormatters::HardcodedFormatFinder GetHardcodedFormats()
Definition Language.cpp:233
static bool LanguageIsObjC(lldb::LanguageType language)
Definition Language.cpp:386
static constexpr size_t kNumManglingSchemes
The number of mangling schemes.
Definition Mangled.h:52
A command line option parsing protocol class.
Definition Options.h:58
static LanguageSet GetAllTypeSystemSupportedLanguagesForExpressions()
static LanguageSet GetREPLAllTypeSystemSupportedLanguages()
static LanguageSet GetAllTypeSystemSupportedLanguagesForTypes()
static llvm::SmallVector< LanguageCreateInstance > GetLanguageCreateCallbacks()
lldb::OptionValuePropertiesSP m_collection_sp
T GetPropertyAtIndexAs(uint32_t idx, T default_value, const ExecutionContext *exe_ctx=nullptr) const
An error handling class.
Definition Status.h:118
A stream class that can stream formatted output to a file.
Definition Stream.h:28
size_t Printf(const char *format,...) __attribute__((format(printf
Output printf formatted output to the stream.
Definition Stream.cpp:134
Defines a symbol context baton that can be handed other debug core functions.
const ModuleList & GetImages() const
Get accessor for the images for this process.
Definition Target.h:1282
TypeIterable Types() const
Definition TypeMap.h:47
A class that contains all state required for type lookups.
This class tracks the state and results of a TypeQuery.
A class that represents a running process on the host machine.
IterationAction
Useful for callbacks whose return type indicates whether to continue iteration or short-circuit.
LanguageType
Programming language type.
@ eLanguageTypeC_plus_plus_20
ISO C++:2020.
@ eLanguageTypeC_plus_plus_14
ISO C++:2014.
@ eLanguageTypeHaskell
Haskell.
@ eLanguageTypeRenderScript
@ eLanguageTypePLI
ANSI PL/I:1976.
@ eLanguageTypeC11
ISO C:2011.
@ eLanguageTypeJava
Java.
@ eLanguageTypeFortran08
ISO Fortran 2008.
@ eLanguageTypeFortran18
@ eLanguageTypeC99
ISO C:1999.
@ eLanguageTypePascal83
ISO Pascal:1983.
@ eLanguageTypeModula3
Modula 3.
@ eLanguageTypeModula2
ISO Modula-2:1996.
@ eLanguageTypeOCaml
OCaml.
@ eLanguageTypeMipsAssembler
Mips_Assembler.
@ eLanguageTypeC_plus_plus_03
ISO C++:2003.
@ eLanguageTypeUnknown
Unknown or invalid language value.
@ eLanguageTypeRust
Rust.
@ eLanguageTypeFortran95
ISO Fortran 95.
@ eLanguageTypeC_sharp
@ eLanguageTypeAda2012
@ eLanguageTypeC_plus_plus_17
ISO C++:2017.
@ eLanguageTypeCrystal
@ eLanguageTypeObjC_plus_plus
Objective-C++.
@ eLanguageTypeC_plus_plus_11
ISO C++:2011.
@ eLanguageTypeSwift
Swift.
@ eLanguageTypeC89
ISO C:1989.
@ eLanguageTypeAda83
ISO Ada:1983.
@ eLanguageTypeJulia
Julia.
@ eLanguageTypeGo
Go.
@ eLanguageTypeFortran77
ISO Fortran 77.
@ eLanguageTypeKotlin
@ eLanguageTypeCobol85
ISO Cobol:1985.
@ eLanguageTypeUPC
Unified Parallel C.
@ eLanguageTypeC
Non-standardized C, such as K&R.
@ eLanguageTypeAda95
ISO Ada:1995.
@ eLanguageTypeCobol74
ISO Cobol:1974.
@ eLanguageTypePython
Python.
@ eLanguageTypeAda2005
@ eLanguageTypeOpenCL
OpenCL.
@ eLanguageTypeAssembly
@ eLanguageTypeD
D.
@ eLanguageTypeFortran90
ISO Fortran 90.
@ eLanguageTypeObjC
Objective-C.
@ eLanguageTypeC_plus_plus
ISO C++:1998.
@ eLanguageTypeLastStandardLanguage
@ eLanguageTypeDylan
Dylan.
@ eLanguageTypeFortran03
ISO Fortran 2003.
std::shared_ptr< lldb_private::TypeCategoryImpl > TypeCategoryImplSP
LanguageType type
Definition Language.cpp:254
const char * name
Definition Language.cpp:253
A SmallBitVector that represents a set of source languages (lldb::LanguageType).
A type-erased pair of llvm::dwarf::SourceLanguageName and version.
lldb::LanguageType AsLanguageType() const
Definition Language.cpp:657
llvm::StringRef GetDescription() const
Definition Language.cpp:664
static void format(const lldb::LanguageType &language, llvm::raw_ostream &OS, llvm::StringRef Options)
Definition Language.cpp:678