This is the main part of a change to add breakpoint save and restore to lldb.

Still to come:
1) SB API's
2) Testcases
3) Loose ends:
   a) serialize Thread options
   b) serialize Exception resolvers
4) "break list --file" should list breakpoints contained in a file and
   "break read -f 1 3 5" should then read in only those breakpoints.

<rdar://problem/12611863>

llvm-svn: 281273
diff --git a/lldb/source/Target/LanguageRuntime.cpp b/lldb/source/Target/LanguageRuntime.cpp
index 16cd12d..83c6afa 100644
--- a/lldb/source/Target/LanguageRuntime.cpp
+++ b/lldb/source/Target/LanguageRuntime.cpp
@@ -23,80 +23,83 @@
 using namespace lldb;
 using namespace lldb_private;
 
-class ExceptionSearchFilter : public SearchFilter {
-public:
-  ExceptionSearchFilter(const lldb::TargetSP &target_sp,
-                        lldb::LanguageType language,
-                        bool update_module_list = true)
-      : SearchFilter(target_sp), m_language(language),
-        m_language_runtime(nullptr), m_filter_sp() {
-    if (update_module_list)
-      UpdateModuleListIfNeeded();
-  }
-
-  ~ExceptionSearchFilter() override = default;
-
-  bool ModulePasses(const lldb::ModuleSP &module_sp) override {
+ExceptionSearchFilter::ExceptionSearchFilter(const lldb::TargetSP &target_sp,
+                                             lldb::LanguageType language,
+                                             bool update_module_list)
+    : SearchFilter(target_sp, FilterTy::Exception), m_language(language),
+      m_language_runtime(nullptr), m_filter_sp() {
+  if (update_module_list)
     UpdateModuleListIfNeeded();
-    if (m_filter_sp)
-      return m_filter_sp->ModulePasses(module_sp);
-    return false;
-  }
+}
 
-  bool ModulePasses(const FileSpec &spec) override {
-    UpdateModuleListIfNeeded();
-    if (m_filter_sp)
-      return m_filter_sp->ModulePasses(spec);
-    return false;
-  }
+bool ExceptionSearchFilter::ModulePasses(const lldb::ModuleSP &module_sp) {
+  UpdateModuleListIfNeeded();
+  if (m_filter_sp)
+    return m_filter_sp->ModulePasses(module_sp);
+  return false;
+}
 
-  void Search(Searcher &searcher) override {
-    UpdateModuleListIfNeeded();
-    if (m_filter_sp)
-      m_filter_sp->Search(searcher);
-  }
+bool ExceptionSearchFilter::ModulePasses(const FileSpec &spec) {
+  UpdateModuleListIfNeeded();
+  if (m_filter_sp)
+    return m_filter_sp->ModulePasses(spec);
+  return false;
+}
 
-  void GetDescription(Stream *s) override {
-    UpdateModuleListIfNeeded();
-    if (m_filter_sp)
-      m_filter_sp->GetDescription(s);
-  }
+void ExceptionSearchFilter::Search(Searcher &searcher) {
+  UpdateModuleListIfNeeded();
+  if (m_filter_sp)
+    m_filter_sp->Search(searcher);
+}
 
-protected:
-  LanguageType m_language;
-  LanguageRuntime *m_language_runtime;
-  SearchFilterSP m_filter_sp;
+void ExceptionSearchFilter::GetDescription(Stream *s) {
+  UpdateModuleListIfNeeded();
+  if (m_filter_sp)
+    m_filter_sp->GetDescription(s);
+}
 
-  SearchFilterSP DoCopyForBreakpoint(Breakpoint &breakpoint) override {
-    return SearchFilterSP(
-        new ExceptionSearchFilter(TargetSP(), m_language, false));
-  }
-
-  void UpdateModuleListIfNeeded() {
-    ProcessSP process_sp(m_target_sp->GetProcessSP());
-    if (process_sp) {
-      bool refreash_filter = !m_filter_sp;
-      if (m_language_runtime == nullptr) {
-        m_language_runtime = process_sp->GetLanguageRuntime(m_language);
-        refreash_filter = true;
-      } else {
-        LanguageRuntime *language_runtime =
-            process_sp->GetLanguageRuntime(m_language);
-        if (m_language_runtime != language_runtime) {
-          m_language_runtime = language_runtime;
-          refreash_filter = true;
-        }
-      }
-
-      if (refreash_filter && m_language_runtime) {
-        m_filter_sp = m_language_runtime->CreateExceptionSearchFilter();
-      }
+void ExceptionSearchFilter::UpdateModuleListIfNeeded() {
+  ProcessSP process_sp(m_target_sp->GetProcessSP());
+  if (process_sp) {
+    bool refreash_filter = !m_filter_sp;
+    if (m_language_runtime == nullptr) {
+      m_language_runtime = process_sp->GetLanguageRuntime(m_language);
+      refreash_filter = true;
     } else {
-      m_filter_sp.reset();
-      m_language_runtime = nullptr;
+      LanguageRuntime *language_runtime =
+          process_sp->GetLanguageRuntime(m_language);
+      if (m_language_runtime != language_runtime) {
+        m_language_runtime = language_runtime;
+        refreash_filter = true;
+      }
     }
+
+    if (refreash_filter && m_language_runtime) {
+      m_filter_sp = m_language_runtime->CreateExceptionSearchFilter();
+    }
+  } else {
+    m_filter_sp.reset();
+    m_language_runtime = nullptr;
   }
-};
+}
+
+SearchFilterSP
+ExceptionSearchFilter::DoCopyForBreakpoint(Breakpoint &breakpoint) {
+  return SearchFilterSP(
+      new ExceptionSearchFilter(TargetSP(), m_language, false));
+}
+
+SearchFilter *ExceptionSearchFilter::CreateFromStructuredData(
+    Target &target, StructuredData::Dictionary &data_dict, Error &error) {
+  SearchFilter *result = nullptr;
+  return result;
+}
+
+StructuredData::ObjectSP ExceptionSearchFilter::SerializeToStructuredData() {
+  StructuredData::ObjectSP result_sp;
+
+  return result_sp;
+}
 
 // The Target is the one that knows how to create breakpoints, so this function
 // is meant to be used either by the target or internally in