aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Target/Language.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Target/Language.cpp')
-rw-r--r--lldb/source/Target/Language.cpp45
1 files changed, 32 insertions, 13 deletions
diff --git a/lldb/source/Target/Language.cpp b/lldb/source/Target/Language.cpp
index 484d9ba..395718e 100644
--- a/lldb/source/Target/Language.cpp
+++ b/lldb/source/Target/Language.cpp
@@ -111,9 +111,9 @@ Language *Language::FindPlugin(llvm::StringRef file_path) {
ForEach([&result, file_path](Language *language) {
if (language->IsSourceFile(file_path)) {
result = language;
- return false;
+ return IterationAction::Stop;
}
- return true;
+ return IterationAction::Continue;
});
return result;
}
@@ -128,7 +128,8 @@ Language *Language::FindPlugin(LanguageType language,
return result;
}
-void Language::ForEach(std::function<bool(Language *)> callback) {
+void Language::ForEach(
+ llvm::function_ref<IterationAction(Language *)> callback) {
// If we want to iterate over all languages, we first have to complete the
// LanguagesMap.
static llvm::once_flag g_initialize;
@@ -153,7 +154,7 @@ void Language::ForEach(std::function<bool(Language *)> callback) {
}
for (auto *lang : loaded_plugins) {
- if (!callback(lang))
+ if (callback(lang) == IterationAction::Stop)
break;
}
}
@@ -270,6 +271,10 @@ const char *Language::GetNameForLanguageType(LanguageType language) {
return language_names[eLanguageTypeUnknown].name;
}
+llvm::StringRef Language::GetDisplayNameForLanguageType(LanguageType language) {
+ return SourceLanguage(language).GetDescription();
+}
+
void Language::PrintSupportedLanguagesForExpressions(Stream &s,
llvm::StringRef prefix,
llvm::StringRef suffix) {
@@ -289,9 +294,9 @@ void Language::PrintAllLanguages(Stream &s, const char *prefix,
}
void Language::ForAllLanguages(
- std::function<bool(lldb::LanguageType)> callback) {
+ llvm::function_ref<IterationAction(lldb::LanguageType)> callback) {
for (uint32_t i = 1; i < num_languages; i++) {
- if (!callback(language_names[i].type))
+ if (callback(language_names[i].type) == IterationAction::Stop)
break;
}
}
@@ -416,7 +421,7 @@ std::set<lldb::LanguageType> Language::GetSupportedLanguages() {
std::set<lldb::LanguageType> supported_languages;
ForEach([&](Language *lang) {
supported_languages.emplace(lang->GetLanguageType());
- return true;
+ return IterationAction::Continue;
});
return supported_languages;
}
@@ -542,9 +547,26 @@ Language::Language() = default;
// Destructor
Language::~Language() = default;
+static std::optional<llvm::dwarf::SourceLanguage>
+ToDwarfSourceLanguage(lldb::LanguageType language_type) {
+ if (language_type < lldb::eLanguageTypeLastStandardLanguage)
+ return static_cast<llvm::dwarf::SourceLanguage>(language_type);
+
+ switch (language_type) {
+ case eLanguageTypeMipsAssembler:
+ return llvm::dwarf::DW_LANG_Mips_Assembler;
+ default:
+ return std::nullopt;
+ }
+}
+
SourceLanguage::SourceLanguage(lldb::LanguageType language_type) {
- auto lname =
- llvm::dwarf::toDW_LNAME((llvm::dwarf::SourceLanguage)language_type);
+ std::optional<llvm::dwarf::SourceLanguage> dwarf_lang =
+ ToDwarfSourceLanguage(language_type);
+ if (!dwarf_lang)
+ return;
+
+ auto lname = llvm::dwarf::toDW_LNAME(*dwarf_lang);
if (!lname)
return;
name = lname->first;
@@ -559,11 +581,8 @@ lldb::LanguageType SourceLanguage::AsLanguageType() const {
}
llvm::StringRef SourceLanguage::GetDescription() const {
- LanguageType type = AsLanguageType();
- if (type)
- return Language::GetNameForLanguageType(type);
return llvm::dwarf::LanguageDescription(
- (llvm::dwarf::SourceLanguageName)name);
+ static_cast<llvm::dwarf::SourceLanguageName>(name));
}
bool SourceLanguage::IsC() const { return name == llvm::dwarf::DW_LNAME_C; }