diff --git a/lldb/include/lldb/Target/Language.h b/lldb/include/lldb/Target/Language.h index ff7c60bf68bfc..2d6e5a40a0c0e 100644 --- a/lldb/include/lldb/Target/Language.h +++ b/lldb/include/lldb/Target/Language.h @@ -363,6 +363,10 @@ class Language : public PluginInterface { return false; } + /// Returns true if this Language supports exception breakpoints via a + /// corresponding LanguageRuntime plugin. + virtual bool SupportsExceptionBreakpoints() const { return false; } + protected: // Classes that inherit from Language can see and modify these diff --git a/lldb/source/Commands/CommandObjectBreakpoint.cpp b/lldb/source/Commands/CommandObjectBreakpoint.cpp index cd4c7790f447e..a5fe9273fac76 100644 --- a/lldb/source/Commands/CommandObjectBreakpoint.cpp +++ b/lldb/source/Commands/CommandObjectBreakpoint.cpp @@ -308,9 +308,6 @@ class CommandObjectBreakpointSet : public CommandObjectParsed { case eLanguageTypeC_plus_plus_14: m_exception_language = eLanguageTypeC_plus_plus; break; - case eLanguageTypeObjC: - m_exception_language = eLanguageTypeObjC; - break; case eLanguageTypeObjC_plus_plus: error_context = "Set exception breakpoints separately for c++ and objective-c"; @@ -319,6 +316,12 @@ class CommandObjectBreakpointSet : public CommandObjectParsed { error_context = "Unknown language type for exception breakpoint"; break; default: + if (Language *languagePlugin = Language::FindPlugin(language)) { + if (languagePlugin->SupportsExceptionBreakpoints()) { + m_exception_language = language; + break; + } + } error_context = "Unsupported language type for exception breakpoint"; } if (!error_context.empty()) diff --git a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h index a50f4b036108d..a61d0f128370d 100644 --- a/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h +++ b/lldb/source/Plugins/Language/ObjC/ObjCLanguage.h @@ -194,6 +194,8 @@ class ObjCLanguage : public Language { llvm::StringRef GetInstanceVariableName() override { return "self"; } + bool SupportsExceptionBreakpoints() const override { return true; } + // PluginInterface protocol llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } };