[Lldb-commits] [lldb] [LLDB][SaveCore] Add SBCoreDumpOptions Object, and SBProcess::SaveCore() overload (PR #98403)

Jacob Lalonde via lldb-commits lldb-commits at lists.llvm.org
Tue Jul 16 17:38:30 PDT 2024


https://github.com/Jlalond updated https://github.com/llvm/llvm-project/pull/98403

>From 4752adac6b8d39512bbfb46726205ceb2301d1c2 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
Date: Tue, 9 Jul 2024 13:30:46 -0700
Subject: [PATCH 1/4] Create CoreDumpOption class, and SB equivalent

---
 lldb/include/lldb/API/SBCoreDumpOptions.h     | 37 +++++++++++++++++++
 lldb/source/API/SBCoreDumpOptions.cpp         | 16 ++++++++
 .../Plugins/ObjectFile/CoreDumpOptions.cpp    | 25 +++++++++++++
 .../Plugins/ObjectFile/CoreDumpOptions.h      | 37 +++++++++++++++++++
 4 files changed, 115 insertions(+)
 create mode 100644 lldb/include/lldb/API/SBCoreDumpOptions.h
 create mode 100644 lldb/source/API/SBCoreDumpOptions.cpp
 create mode 100644 lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp
 create mode 100644 lldb/source/Plugins/ObjectFile/CoreDumpOptions.h

diff --git a/lldb/include/lldb/API/SBCoreDumpOptions.h b/lldb/include/lldb/API/SBCoreDumpOptions.h
new file mode 100644
index 0000000000000..523fa34c17f36
--- /dev/null
+++ b/lldb/include/lldb/API/SBCoreDumpOptions.h
@@ -0,0 +1,37 @@
+//===-- SBCoreDumpOptions.h -------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_API_SBCOREDUMPOPTIONS_H
+#define LLDB_API_SBCOREDUMPOPTIONS_H
+
+namespace lldb {
+
+class LLDB_API SBCoreDumpOptions {
+public:
+  SBCoreDumpOptions() {};
+  SBStatisticsOptions(const lldb::SBCoreDumpOptions &rhs);
+  ~SBExpressionOptions() = default;
+
+  const SBStatisticsOptions &operator=(const lldb::SBStatisticsOptions &rhs);
+
+  void SetCoreDumpPluginName(const char* plugin);
+  const char* GetCoreDumpPluginName();
+
+  void SetCoreDumpStyle(const char* style);
+  const char* GetCoreDumpStyle();
+
+  void SetOutputFilePath(const char* path);
+  const char* GetOutputFilePath();
+
+private:
+  std::unique_ptr<lldb_private::SBCoreDumpOptions> m_opaque_up;
+}; // SBCoreDumpOptions
+
+}; // namespace lldb
+
+#endif // LLDB_API_SBCOREDUMPOPTIONS_H
diff --git a/lldb/source/API/SBCoreDumpOptions.cpp b/lldb/source/API/SBCoreDumpOptions.cpp
new file mode 100644
index 0000000000000..d051c5b6bef6b
--- /dev/null
+++ b/lldb/source/API/SBCoreDumpOptions.cpp
@@ -0,0 +1,16 @@
+//===-- SBCoreDumpOptions.cpp -----------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/API/SBCoreDumpOptions.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+void SBCoreDumpOptions::SetCoreDumpPluginName(const char *name) {
+
+};
diff --git a/lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp b/lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp
new file mode 100644
index 0000000000000..00333d1550790
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp
@@ -0,0 +1,25 @@
+//===-- CoreDumpOptions.cpp -------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/API/CoreDumpOptions.h"
+
+CoreDumpOptions::SetCoreDumpPluginName(const char *name) {
+  m_core_dump_plugin_name = name;
+}
+
+CoreDumpOptions::GetCoreDumpPluginName() { return m_core_dump_plugin_name; }
+
+CoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
+  m_core_dump_style = style;
+}
+
+CoreDumpOptions::GetCoreDumpStyle() { return m_core_dump_style; }
+
+CoreDumpOptions::SetCoreDumpFile(const char *file) { m_core_dump_file = file; }
+
+CoreDumpOptions::GetCoreDumpFile() { return m_core_dump_file; }
diff --git a/lldb/source/Plugins/ObjectFile/CoreDumpOptions.h b/lldb/source/Plugins/ObjectFile/CoreDumpOptions.h
new file mode 100644
index 0000000000000..fe369b0490674
--- /dev/null
+++ b/lldb/source/Plugins/ObjectFile/CoreDumpOptions.h
@@ -0,0 +1,37 @@
+//===-- CoreDumpOptions.h ---------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_COREDUMPOPTIONS_H
+#define LLDB_SOURCE_PLUGINS_OBJECTFILE_COREDUMPOPTIONS_H
+
+#include <string>
+
+using namespace lldb;
+
+class CoreDumpOptions {
+  public:
+    CoreDumpOptions() {};
+    ~CoreDumpOptions() = default;
+
+
+  void SetCoreDumpPluginName(const char* name);
+  const char* GetCoreDumpPluginName() const;
+
+  void SetCoreDumpStyle(lldb::SaveCoreStyle style);
+  lldb::SaveCoreStyle GetCoreDumpStyle() const;
+
+  void SetOutputFilePath(const char* path);
+  const char* GetOutputFilePath() const;
+
+private:
+  std::string m_core_dump_plugin_name;
+  std::string m_output_file_path;
+  lldb::SaveCoreStyle m_core_dump_style = lldb::eSaveCoreStyleNone;
+};
+
+#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_COREDUMPOPTIONS_H

>From 3acae92ae678092064164e8e492c4789132b81cc Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
Date: Wed, 10 Jul 2024 15:07:41 -0700
Subject: [PATCH 2/4] Finish all the plumbing and successfully migrate
 TestProcessSaveCoreMinidump to the new SBCoreDumpOptions API

---
 lldb/bindings/headers.swig                    |  1 +
 .../interface/SBCoreDumpOptionsDocstrings.i   |  0
 lldb/bindings/interfaces.swig                 |  2 +
 lldb/include/lldb/API/LLDB.h                  |  1 +
 lldb/include/lldb/API/SBCoreDumpOptions.h     | 29 +++++-----
 lldb/include/lldb/API/SBDefines.h             |  1 +
 lldb/include/lldb/API/SBProcess.h             |  6 +++
 lldb/include/lldb/Core/PluginManager.h        |  4 +-
 .../lldb/Symbol}/CoreDumpOptions.h            | 24 +++++----
 lldb/include/lldb/lldb-private-interfaces.h   |  4 +-
 lldb/source/API/CMakeLists.txt                |  1 +
 lldb/source/API/SBCoreDumpOptions.cpp         | 53 ++++++++++++++++++-
 lldb/source/API/SBProcess.cpp                 | 19 +++++--
 lldb/source/Commands/CommandObjectProcess.cpp |  6 ++-
 lldb/source/Core/PluginManager.cpp            | 22 ++++----
 .../Plugins/ObjectFile/CoreDumpOptions.cpp    | 25 ---------
 .../ObjectFile/Mach-O/ObjectFileMachO.cpp     |  8 +--
 .../ObjectFile/Mach-O/ObjectFileMachO.h       |  3 +-
 .../Minidump/ObjectFileMinidump.cpp           | 11 ++--
 .../ObjectFile/Minidump/ObjectFileMinidump.h  |  3 +-
 .../ObjectFile/PECOFF/ObjectFilePECOFF.cpp    |  7 ++-
 .../ObjectFile/PECOFF/ObjectFilePECOFF.h      |  3 +-
 .../ObjectFile/PECOFF/WindowsMiniDump.cpp     |  3 +-
 .../ObjectFile/PECOFF/WindowsMiniDump.h       |  2 +-
 lldb/source/Symbol/CMakeLists.txt             |  1 +
 lldb/source/Symbol/CoreDumpOptions.cpp        | 35 ++++++++++++
 .../postmortem/minidump/TestMiniDump.py       |  1 +
 .../process_save_core/TestProcessSaveCore.py  |  1 +
 .../TestProcessSaveCoreMinidump.py            | 15 ++++--
 29 files changed, 198 insertions(+), 93 deletions(-)
 create mode 100644 lldb/bindings/interface/SBCoreDumpOptionsDocstrings.i
 rename lldb/{source/Plugins/ObjectFile => include/lldb/Symbol}/CoreDumpOptions.h (54%)
 delete mode 100644 lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp
 create mode 100644 lldb/source/Symbol/CoreDumpOptions.cpp

diff --git a/lldb/bindings/headers.swig b/lldb/bindings/headers.swig
index c91504604b6ac..d65472648ec59 100644
--- a/lldb/bindings/headers.swig
+++ b/lldb/bindings/headers.swig
@@ -21,6 +21,7 @@
 #include "lldb/API/SBCommandReturnObject.h"
 #include "lldb/API/SBCommunication.h"
 #include "lldb/API/SBCompileUnit.h"
+#include "lldb/API/SBCoreDumpOptions.h"
 #include "lldb/API/SBData.h"
 #include "lldb/API/SBDebugger.h"
 #include "lldb/API/SBDeclaration.h"
diff --git a/lldb/bindings/interface/SBCoreDumpOptionsDocstrings.i b/lldb/bindings/interface/SBCoreDumpOptionsDocstrings.i
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/lldb/bindings/interfaces.swig b/lldb/bindings/interfaces.swig
index 0953f4c72a910..d25c25dbfc2af 100644
--- a/lldb/bindings/interfaces.swig
+++ b/lldb/bindings/interfaces.swig
@@ -25,6 +25,7 @@
 %include "./interface/SBCommandReturnObjectDocstrings.i"
 %include "./interface/SBCommunicationDocstrings.i"
 %include "./interface/SBCompileUnitDocstrings.i"
+%include "./interface/SBCoreDumpOptionsDocstrings.i"
 %include "./interface/SBDataDocstrings.i"
 %include "./interface/SBDebuggerDocstrings.i"
 %include "./interface/SBDeclarationDocstrings.i"
@@ -101,6 +102,7 @@
 %include "lldb/API/SBCommandReturnObject.h"
 %include "lldb/API/SBCommunication.h"
 %include "lldb/API/SBCompileUnit.h"
+%include "lldb/API/SBCoreDumpOptions.h"
 %include "lldb/API/SBData.h"
 %include "lldb/API/SBDebugger.h"
 %include "lldb/API/SBDeclaration.h"
diff --git a/lldb/include/lldb/API/LLDB.h b/lldb/include/lldb/API/LLDB.h
index d8cc9f5067fe9..74817ac99ed2b 100644
--- a/lldb/include/lldb/API/LLDB.h
+++ b/lldb/include/lldb/API/LLDB.h
@@ -23,6 +23,7 @@
 #include "lldb/API/SBCommandReturnObject.h"
 #include "lldb/API/SBCommunication.h"
 #include "lldb/API/SBCompileUnit.h"
+#include "lldb/API/SBCoreDumpOptions.h"
 #include "lldb/API/SBData.h"
 #include "lldb/API/SBDebugger.h"
 #include "lldb/API/SBDeclaration.h"
diff --git a/lldb/include/lldb/API/SBCoreDumpOptions.h b/lldb/include/lldb/API/SBCoreDumpOptions.h
index 523fa34c17f36..b3e81ceee852a 100644
--- a/lldb/include/lldb/API/SBCoreDumpOptions.h
+++ b/lldb/include/lldb/API/SBCoreDumpOptions.h
@@ -9,29 +9,34 @@
 #ifndef LLDB_API_SBCOREDUMPOPTIONS_H
 #define LLDB_API_SBCOREDUMPOPTIONS_H
 
+#include "lldb/API/SBDefines.h"
+#include "lldb/Symbol/CoreDumpOptions.h"
+
 namespace lldb {
 
 class LLDB_API SBCoreDumpOptions {
 public:
-  SBCoreDumpOptions() {};
-  SBStatisticsOptions(const lldb::SBCoreDumpOptions &rhs);
-  ~SBExpressionOptions() = default;
+  SBCoreDumpOptions(const char* filePath);
+  SBCoreDumpOptions(const lldb::SBCoreDumpOptions &rhs);
+  ~SBCoreDumpOptions() = default;
 
-  const SBStatisticsOptions &operator=(const lldb::SBStatisticsOptions &rhs);
+  const SBCoreDumpOptions &operator=(const lldb::SBCoreDumpOptions &rhs);
 
   void SetCoreDumpPluginName(const char* plugin);
-  const char* GetCoreDumpPluginName();
+  const std::optional<const char *> GetCoreDumpPluginName() const;
+
+  void SetCoreDumpStyle(lldb::SaveCoreStyle style);
+  const std::optional<lldb::SaveCoreStyle> GetCoreDumpStyle() const;
 
-  void SetCoreDumpStyle(const char* style);
-  const char* GetCoreDumpStyle();
+  const char * GetOutputFile() const;
 
-  void SetOutputFilePath(const char* path);
-  const char* GetOutputFilePath();
+protected:
+  friend class SBProcess;
+  lldb_private::CoreDumpOptions &Ref() const;
 
 private:
-  std::unique_ptr<lldb_private::SBCoreDumpOptions> m_opaque_up;
+  std::unique_ptr<lldb_private::CoreDumpOptions> m_opaque_up;
 }; // SBCoreDumpOptions
-
-}; // namespace lldb
+} // namespace lldb
 
 #endif // LLDB_API_SBCOREDUMPOPTIONS_H
diff --git a/lldb/include/lldb/API/SBDefines.h b/lldb/include/lldb/API/SBDefines.h
index 87c0a1c3661ca..eb9c59169eaed 100644
--- a/lldb/include/lldb/API/SBDefines.h
+++ b/lldb/include/lldb/API/SBDefines.h
@@ -61,6 +61,7 @@ class LLDB_API SBCommandPluginInterface;
 class LLDB_API SBCommandReturnObject;
 class LLDB_API SBCommunication;
 class LLDB_API SBCompileUnit;
+class LLDB_API SBCoreDumpOptions;
 class LLDB_API SBData;
 class LLDB_API SBDebugger;
 class LLDB_API SBDeclaration;
diff --git a/lldb/include/lldb/API/SBProcess.h b/lldb/include/lldb/API/SBProcess.h
index a6ab7ae759918..913aa7992a4fd 100644
--- a/lldb/include/lldb/API/SBProcess.h
+++ b/lldb/include/lldb/API/SBProcess.h
@@ -378,6 +378,12 @@ class LLDB_API SBProcess {
   /// \param[in] file_name - The name of the file to save the core file to.
   lldb::SBError SaveCore(const char *file_name);
 
+  /// Save the state of the process with the desired settings
+  /// as defined in the options object.
+  ///
+  /// \param[in] options - The options to use when saving the core file.
+  lldb::SBError SaveCore(SBCoreDumpOptions &options);
+
   /// Query the address load_addr and store the details of the memory
   /// region that contains it in the supplied SBMemoryRegionInfo object.
   /// To iterate over all memory regions use GetMemoryRegionList.
diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h
index f2296e2920238..dcc3a8a062265 100644
--- a/lldb/include/lldb/Core/PluginManager.h
+++ b/lldb/include/lldb/Core/PluginManager.h
@@ -191,9 +191,7 @@ class PluginManager {
   GetObjectFileCreateMemoryCallbackForPluginName(llvm::StringRef name);
 
   static Status SaveCore(const lldb::ProcessSP &process_sp,
-                         const FileSpec &outfile,
-                         lldb::SaveCoreStyle &core_style,
-                         llvm::StringRef plugin_name);
+                         lldb_private::CoreDumpOptions &core_options);
 
   // ObjectContainer
   static bool RegisterPlugin(
diff --git a/lldb/source/Plugins/ObjectFile/CoreDumpOptions.h b/lldb/include/lldb/Symbol/CoreDumpOptions.h
similarity index 54%
rename from lldb/source/Plugins/ObjectFile/CoreDumpOptions.h
rename to lldb/include/lldb/Symbol/CoreDumpOptions.h
index fe369b0490674..435031a510d80 100644
--- a/lldb/source/Plugins/ObjectFile/CoreDumpOptions.h
+++ b/lldb/include/lldb/Symbol/CoreDumpOptions.h
@@ -9,29 +9,35 @@
 #ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_COREDUMPOPTIONS_H
 #define LLDB_SOURCE_PLUGINS_OBJECTFILE_COREDUMPOPTIONS_H
 
+#include "lldb/Utility/FileSpec.h"
+#include "lldb/lldb-forward.h"
+#include "lldb/lldb-types.h"
+
+#include <optional>
 #include <string>
 
-using namespace lldb;
+namespace lldb_private {
 
 class CoreDumpOptions {
   public:
-    CoreDumpOptions() {};
+    CoreDumpOptions(const lldb_private::FileSpec &fspec) :
+      m_core_dump_file(std::move(fspec)) {};
     ~CoreDumpOptions() = default;
 
 
-  void SetCoreDumpPluginName(const char* name);
-  const char* GetCoreDumpPluginName() const;
+  void SetCoreDumpPluginName(llvm::StringRef name);
+  std::optional<llvm::StringRef> GetCoreDumpPluginName() const;
 
   void SetCoreDumpStyle(lldb::SaveCoreStyle style);
   lldb::SaveCoreStyle GetCoreDumpStyle() const;
 
-  void SetOutputFilePath(const char* path);
-  const char* GetOutputFilePath() const;
+  const lldb_private::FileSpec& GetOutputFile() const;
 
 private:
-  std::string m_core_dump_plugin_name;
-  std::string m_output_file_path;
-  lldb::SaveCoreStyle m_core_dump_style = lldb::eSaveCoreStyleNone;
+  std::optional<std::string> m_core_dump_plugin_name;
+  const lldb_private::FileSpec m_core_dump_file;
+  lldb::SaveCoreStyle m_core_dump_style = lldb::eSaveCoreUnspecified;
 };
+} // namespace lldb_private
 
 #endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_COREDUMPOPTIONS_H
diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h
index cdd9b51d9329c..0948a0482b201 100644
--- a/lldb/include/lldb/lldb-private-interfaces.h
+++ b/lldb/include/lldb/lldb-private-interfaces.h
@@ -9,6 +9,7 @@
 #ifndef LLDB_LLDB_PRIVATE_INTERFACES_H
 #define LLDB_LLDB_PRIVATE_INTERFACES_H
 
+#include "lldb/Symbol/CoreDumpOptions.h"
 #include "lldb/lldb-enumerations.h"
 #include "lldb/lldb-forward.h"
 #include "lldb/lldb-private-enumerations.h"
@@ -55,8 +56,7 @@ typedef ObjectFile *(*ObjectFileCreateMemoryInstance)(
     const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
     const lldb::ProcessSP &process_sp, lldb::addr_t offset);
 typedef bool (*ObjectFileSaveCore)(const lldb::ProcessSP &process_sp,
-                                   const FileSpec &outfile,
-                                   lldb::SaveCoreStyle &core_style,
+                                   lldb_private::CoreDumpOptions &core_options,
                                    Status &error);
 typedef EmulateInstruction *(*EmulateInstructionCreateInstance)(
     const ArchSpec &arch, InstructionType inst_type);
diff --git a/lldb/source/API/CMakeLists.txt b/lldb/source/API/CMakeLists.txt
index 6397101609315..d8cb532f4015f 100644
--- a/lldb/source/API/CMakeLists.txt
+++ b/lldb/source/API/CMakeLists.txt
@@ -56,6 +56,7 @@ add_lldb_library(liblldb SHARED ${option_framework}
   SBCommandReturnObject.cpp
   SBCommunication.cpp
   SBCompileUnit.cpp
+  SBCoreDumpOptions.cpp
   SBData.cpp
   SBDebugger.cpp
   SBDeclaration.cpp
diff --git a/lldb/source/API/SBCoreDumpOptions.cpp b/lldb/source/API/SBCoreDumpOptions.cpp
index d051c5b6bef6b..f7eab4231d819 100644
--- a/lldb/source/API/SBCoreDumpOptions.cpp
+++ b/lldb/source/API/SBCoreDumpOptions.cpp
@@ -7,10 +7,59 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/API/SBCoreDumpOptions.h"
+#include "lldb/Symbol/CoreDumpOptions.h"
+#include "lldb/Utility/Instrumentation.h"
+#include "lldb/Host/FileSystem.h"
+
+#include "Utils.h"
 
 using namespace lldb;
-using namespace lldb_private;
+
+SBCoreDumpOptions::SBCoreDumpOptions(const char* filePath) {
+  LLDB_INSTRUMENT_VA(this, filePath);
+  lldb_private::FileSpec fspec(filePath);
+  lldb_private::FileSystem::Instance().Resolve(fspec);
+  m_opaque_up = std::make_unique<lldb_private::CoreDumpOptions>(fspec);
+}
+
+SBCoreDumpOptions::SBCoreDumpOptions(const SBCoreDumpOptions &rhs) {
+  LLDB_INSTRUMENT_VA(this, rhs);
+
+  m_opaque_up = clone(rhs.m_opaque_up);
+}
+
+const SBCoreDumpOptions &
+SBCoreDumpOptions::operator=(const SBCoreDumpOptions &rhs) {
+  LLDB_INSTRUMENT_VA(this, rhs);
+
+  if (this != &rhs)
+    m_opaque_up = clone(rhs.m_opaque_up);
+  return *this;
+}
 
 void SBCoreDumpOptions::SetCoreDumpPluginName(const char *name) {
+  m_opaque_up->SetCoreDumpPluginName(name);
+}
+
+void SBCoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
+  m_opaque_up->SetCoreDumpStyle(style);
+}
+
+const std::optional<const char *> SBCoreDumpOptions::GetCoreDumpPluginName() const {
+  const auto &name = m_opaque_up->GetCoreDumpPluginName();
+  if (name->empty())
+    return std::nullopt;
+  return name->data();
+}
+
+const char * SBCoreDumpOptions::GetOutputFile() const {
+  return m_opaque_up->GetOutputFile().GetFilename().AsCString();
+}
+
+const std::optional<lldb::SaveCoreStyle> SBCoreDumpOptions::GetCoreDumpStyle() const {
+  return m_opaque_up->GetCoreDumpStyle();
+}
 
-};
+lldb_private::CoreDumpOptions& SBCoreDumpOptions::Ref() const {
+  return *m_opaque_up.get();
+}
diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp
index efb3c8def2796..ef4641c43464b 100644
--- a/lldb/source/API/SBProcess.cpp
+++ b/lldb/source/API/SBProcess.cpp
@@ -34,6 +34,7 @@
 
 #include "lldb/API/SBBroadcaster.h"
 #include "lldb/API/SBCommandReturnObject.h"
+#include "lldb/API/SBCoreDumpOptions.h"
 #include "lldb/API/SBDebugger.h"
 #include "lldb/API/SBEvent.h"
 #include "lldb/API/SBFile.h"
@@ -1222,7 +1223,18 @@ lldb::SBError SBProcess::SaveCore(const char *file_name) {
 lldb::SBError SBProcess::SaveCore(const char *file_name,
                                   const char *flavor,
                                   SaveCoreStyle core_style) {
-  LLDB_INSTRUMENT_VA(this, file_name, flavor, core_style);
+  SBCoreDumpOptions options(file_name);
+  options.SetCoreDumpPluginName(flavor);
+  options.SetCoreDumpStyle(core_style);
+  return SaveCore(options);
+}
+
+lldb::SBError SBProcess::SaveCore(SBCoreDumpOptions &options) {
+
+  LLDB_INSTRUMENT_VA(this, 
+      options.GetOutputFile(), 
+      options.GetCoreDumpPluginName(), 
+      options.GetCoreDumpStyle());
 
   lldb::SBError error;
   ProcessSP process_sp(GetSP());
@@ -1239,10 +1251,7 @@ lldb::SBError SBProcess::SaveCore(const char *file_name,
     return error;
   }
 
-  FileSpec core_file(file_name);
-  FileSystem::Instance().Resolve(core_file);
-  error.ref() = PluginManager::SaveCore(process_sp, core_file, core_style,
-                                        flavor);
+  error.ref() = PluginManager::SaveCore(process_sp, options.Ref());
 
   return error;
 }
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index 3587a8f529e4a..382b4058c74b3 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -1304,9 +1304,11 @@ class CommandObjectProcessSaveCore : public CommandObjectParsed {
         FileSpec output_file(command.GetArgumentAtIndex(0));
         FileSystem::Instance().Resolve(output_file);
         SaveCoreStyle corefile_style = m_options.m_requested_save_core_style;
+        CoreDumpOptions core_dump_options(output_file);
+        core_dump_options.SetCoreDumpPluginName(m_options.m_requested_plugin_name);
+        core_dump_options.SetCoreDumpStyle(corefile_style);
         Status error =
-            PluginManager::SaveCore(process_sp, output_file, corefile_style,
-                                    m_options.m_requested_plugin_name);
+            PluginManager::SaveCore(process_sp, core_dump_options);
         if (error.Success()) {
           if (corefile_style == SaveCoreStyle::eSaveCoreDirtyOnly ||
               corefile_style == SaveCoreStyle::eSaveCoreStackOnly) {
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index b428370d7f333..346d38248e7c2 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -8,6 +8,7 @@
 
 #include "lldb/Core/PluginManager.h"
 
+#include "lldb/Symbol/CoreDumpOptions.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Host/FileSystem.h"
 #include "lldb/Host/HostInfo.h"
@@ -689,12 +690,10 @@ PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(
 }
 
 Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
-                               const FileSpec &outfile,
-                               lldb::SaveCoreStyle &core_style,
-                               llvm::StringRef plugin_name) {
-  if (plugin_name.empty()) {
+                               lldb_private::CoreDumpOptions &options) {
+  if (options.GetCoreDumpPluginName()->empty()) {
     // Try saving core directly from the process plugin first.
-    llvm::Expected<bool> ret = process_sp->SaveCore(outfile.GetPath());
+    llvm::Expected<bool> ret = process_sp->SaveCore(options.GetOutputFile().GetPath());
     if (!ret)
       return Status(ret.takeError());
     if (ret.get())
@@ -705,17 +704,22 @@ Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
   Status error;
   auto &instances = GetObjectFileInstances().GetInstances();
   for (auto &instance : instances) {
-    if (plugin_name.empty() || instance.name == plugin_name) {
+    if (options.GetCoreDumpPluginName()->empty() || instance.name == options.GetCoreDumpPluginName()) {
       if (instance.save_core &&
-          instance.save_core(process_sp, outfile, core_style, error))
+          instance.save_core(process_sp, options, error))
         return error;
     }
   }
-  error.SetErrorString(
-      "no ObjectFile plugins were able to save a core for this process");
+
+  // Check to see if any of the object file plugins tried and failed to save.
+  // If none ran, set the error message.
+  if (error.Success())
+    error.SetErrorString(
+        "no ObjectFile plugins were able to save a core for this process");
   return error;
 }
 
+
 #pragma mark ObjectContainer
 
 struct ObjectContainerInstance
diff --git a/lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp b/lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp
deleted file mode 100644
index 00333d1550790..0000000000000
--- a/lldb/source/Plugins/ObjectFile/CoreDumpOptions.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-//===-- CoreDumpOptions.cpp -------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "lldb/API/CoreDumpOptions.h"
-
-CoreDumpOptions::SetCoreDumpPluginName(const char *name) {
-  m_core_dump_plugin_name = name;
-}
-
-CoreDumpOptions::GetCoreDumpPluginName() { return m_core_dump_plugin_name; }
-
-CoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
-  m_core_dump_style = style;
-}
-
-CoreDumpOptions::GetCoreDumpStyle() { return m_core_dump_style; }
-
-CoreDumpOptions::SetCoreDumpFile(const char *file) { m_core_dump_file = file; }
-
-CoreDumpOptions::GetCoreDumpFile() { return m_core_dump_file; }
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 0dcb1bed23548..f5ade48af07dc 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -6518,9 +6518,11 @@ struct page_object {
   uint32_t prot;
 };
 
-bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
-                               const FileSpec &outfile,
-                               lldb::SaveCoreStyle &core_style, Status &error) {
+bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp, 
+                               lldb_private::CoreDumpOptions &core_options,
+                               Status &error) {
+  auto core_style = core_options.GetCoreDumpStyle();
+  const auto outfile = core_options.GetOutputFile();
   if (!process_sp)
     return false;
 
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index 55bc688126eb3..d77f0f68cdf11 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -62,8 +62,7 @@ class ObjectFileMachO : public lldb_private::ObjectFile {
                                         lldb_private::ModuleSpecList &specs);
 
   static bool SaveCore(const lldb::ProcessSP &process_sp,
-                       const lldb_private::FileSpec &outfile,
-                       lldb::SaveCoreStyle &core_style,
+                       lldb_private::CoreDumpOptions &core_options,
                        lldb_private::Status &error);
 
   static bool MagicBytesMatch(lldb::DataBufferSP data_sp, lldb::addr_t offset,
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
index 7c875aa3223ed..f7c833edefb5d 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
+++ b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
@@ -56,18 +56,17 @@ size_t ObjectFileMinidump::GetModuleSpecifications(
 }
 
 bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp,
-                                  const lldb_private::FileSpec &outfile,
-                                  lldb::SaveCoreStyle &core_style,
+                                  lldb_private::CoreDumpOptions &core_options,
                                   lldb_private::Status &error) {
   // Set default core style if it isn't set.
-  if (core_style == SaveCoreStyle::eSaveCoreUnspecified)
-    core_style = SaveCoreStyle::eSaveCoreStackOnly;
+  if (core_options.GetCoreDumpStyle() == SaveCoreStyle::eSaveCoreUnspecified)
+    core_options.SetCoreDumpStyle(SaveCoreStyle::eSaveCoreStackOnly);
 
   if (!process_sp)
     return false;
 
   llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open(
-      outfile, File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
+      core_options.GetOutputFile(), File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
   if (!maybe_core_file) {
     error = maybe_core_file.takeError();
     return false;
@@ -119,7 +118,7 @@ bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp,
 
   // Note: add memory HAS to be the last thing we do. It can overflow into 64b
   // land and many RVA's only support 32b
-  error = builder.AddMemoryList(core_style);
+  error = builder.AddMemoryList(core_options.GetCoreDumpStyle());
   if (error.Fail()) {
     LLDB_LOGF(log, "AddMemoryList failed: %s", error.AsCString());
     return false;
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h
index b5c40445fe742..81e7b3339ab39 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h
+++ b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h
@@ -55,8 +55,7 @@ class ObjectFileMinidump : public lldb_private::PluginInterface {
 
   // Saves dump in Minidump file format
   static bool SaveCore(const lldb::ProcessSP &process_sp,
-                       const lldb_private::FileSpec &outfile,
-                       lldb::SaveCoreStyle &core_style,
+                       lldb_private::CoreDumpOptions &core_options,
                        lldb_private::Status &error);
 
 private:
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
index be0020cad5bee..4cd01d7f74bd6 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
@@ -355,11 +355,10 @@ size_t ObjectFilePECOFF::GetModuleSpecifications(
 }
 
 bool ObjectFilePECOFF::SaveCore(const lldb::ProcessSP &process_sp,
-                                const lldb_private::FileSpec &outfile,
-                                lldb::SaveCoreStyle &core_style,
+                                lldb_private::CoreDumpOptions &core_options,
                                 lldb_private::Status &error) {
-  core_style = eSaveCoreFull;
-  return SaveMiniDump(process_sp, outfile, error);
+  core_options.SetCoreDumpStyle(lldb::eSaveCoreFull);
+  return SaveMiniDump(process_sp, core_options, error);
 }
 
 bool ObjectFilePECOFF::MagicBytesMatch(DataBufferSP data_sp) {
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
index c59701fa65ec3..1074604864978 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
@@ -82,8 +82,7 @@ class ObjectFilePECOFF : public lldb_private::ObjectFile {
                                         lldb_private::ModuleSpecList &specs);
 
   static bool SaveCore(const lldb::ProcessSP &process_sp,
-                       const lldb_private::FileSpec &outfile,
-                       lldb::SaveCoreStyle &core_style,
+                       lldb_private::CoreDumpOptions &core_options,
                        lldb_private::Status &error);
 
   static bool MagicBytesMatch(lldb::DataBufferSP data_sp);
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
index e5cb36910dd25..7fafc9a4370e8 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
@@ -21,11 +21,12 @@
 namespace lldb_private {
 
 bool SaveMiniDump(const lldb::ProcessSP &process_sp,
-                  const lldb_private::FileSpec &outfile,
+                  CoreDumpOptions &core_options,
                   lldb_private::Status &error) {
   if (!process_sp)
     return false;
 #ifdef _WIN32
+  const auto outfile = core_options.GetOutputFile();
   HANDLE process_handle = ::OpenProcess(
       PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_sp->GetID());
   const std::string file_name = outfile.GetPath();
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
index 04b93e221362a..f94d873989a18 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
@@ -14,7 +14,7 @@
 namespace lldb_private {
 
 bool SaveMiniDump(const lldb::ProcessSP &process_sp,
-                  const lldb_private::FileSpec &outfile,
+                  CoreDumpOptions &core_options,
                   lldb_private::Status &error);
 
 } // namespace lldb_private
diff --git a/lldb/source/Symbol/CMakeLists.txt b/lldb/source/Symbol/CMakeLists.txt
index ad3488dcdfcec..f1a2e25cdef48 100644
--- a/lldb/source/Symbol/CMakeLists.txt
+++ b/lldb/source/Symbol/CMakeLists.txt
@@ -6,6 +6,7 @@ add_lldb_library(lldbSymbol NO_PLUGIN_DEPENDENCIES
   CompilerDecl.cpp
   CompilerDeclContext.cpp
   CompilerType.cpp
+  CoreDumpOptions.cpp
   DWARFCallFrameInfo.cpp
   DebugMacros.cpp
   DeclVendor.cpp
diff --git a/lldb/source/Symbol/CoreDumpOptions.cpp b/lldb/source/Symbol/CoreDumpOptions.cpp
new file mode 100644
index 0000000000000..688105a6aea2f
--- /dev/null
+++ b/lldb/source/Symbol/CoreDumpOptions.cpp
@@ -0,0 +1,35 @@
+//===-- CoreDumpOptions.cpp -------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "lldb/Symbol/CoreDumpOptions.h"
+
+using namespace lldb;
+using namespace lldb_private;
+
+void CoreDumpOptions::SetCoreDumpPluginName(const llvm::StringRef name) {
+  m_core_dump_plugin_name = name.data();
+}
+
+std::optional<llvm::StringRef> CoreDumpOptions::GetCoreDumpPluginName() const { 
+  if (!m_core_dump_plugin_name)
+    return std::nullopt;
+  return m_core_dump_plugin_name->data();
+}
+
+void CoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
+  m_core_dump_style = style;
+}
+
+lldb::SaveCoreStyle CoreDumpOptions::GetCoreDumpStyle() const { 
+  // If unspecified, default to stack only
+  if (m_core_dump_style == lldb::eSaveCoreUnspecified)
+    return lldb::eSaveCoreStackOnly;
+  return m_core_dump_style;
+}
+
+const lldb_private::FileSpec& CoreDumpOptions::GetOutputFile() const { return m_core_dump_file; }
diff --git a/lldb/test/API/functionalities/postmortem/minidump/TestMiniDump.py b/lldb/test/API/functionalities/postmortem/minidump/TestMiniDump.py
index 8fe5d2a1d8562..101950da16d36 100644
--- a/lldb/test/API/functionalities/postmortem/minidump/TestMiniDump.py
+++ b/lldb/test/API/functionalities/postmortem/minidump/TestMiniDump.py
@@ -130,6 +130,7 @@ def test_deeper_stack_in_mini_dump(self):
             process = target.LaunchSimple(
                 None, None, self.get_process_working_directory()
             )
+
             self.assertState(process.GetState(), lldb.eStateStopped)
             self.assertTrue(process.SaveCore(core))
             self.assertTrue(os.path.isfile(core))
diff --git a/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py b/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
index c3f0e7597758a..b6406579f3c55 100644
--- a/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
+++ b/lldb/test/API/functionalities/process_save_core/TestProcessSaveCore.py
@@ -21,6 +21,7 @@ def test_cannot_save_core_unless_process_stopped(self):
         target = self.dbg.CreateTarget(exe)
         process = target.LaunchSimple(None, None, self.get_process_working_directory())
         self.assertNotEqual(process.GetState(), lldb.eStateStopped)
+        options = SBCoreDumpOptions(core)
         error = process.SaveCore(core)
         self.assertTrue(error.Fail())
 
diff --git a/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py b/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
index 1e171e726fb6b..27492756f6b4a 100644
--- a/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
+++ b/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
@@ -132,8 +132,11 @@ def test_save_linux_mini_dump(self):
                 stacks_to_sp_map,
             )
 
+            options = lldb.SBCoreDumpOptions(core_sb_stack)
+            options.SetCoreDumpPluginName("minidump")
+            options.SetCoreDumpStyle(lldb.eSaveCoreStackOnly)
             # validate saving via SBProcess
-            error = process.SaveCore(core_sb_stack, "minidump", lldb.eSaveCoreStackOnly)
+            error = process.SaveCore(options)
             self.assertTrue(error.Success())
             self.assertTrue(os.path.isfile(core_sb_stack))
             self.verify_core_file(
@@ -144,7 +147,10 @@ def test_save_linux_mini_dump(self):
                 stacks_to_sp_map,
             )
 
-            error = process.SaveCore(core_sb_dirty, "minidump", lldb.eSaveCoreDirtyOnly)
+            options = lldb.SBCoreDumpOptions(core_sb_dirty)
+            options.SetCoreDumpPluginName("minidump")
+            options.SetCoreDumpStyle(lldb.eSaveCoreDirtyOnly)
+            error = process.SaveCore(options)
             self.assertTrue(error.Success())
             self.assertTrue(os.path.isfile(core_sb_dirty))
             self.verify_core_file(
@@ -157,7 +163,10 @@ def test_save_linux_mini_dump(self):
 
             # Minidump can now save full core files, but they will be huge and
             # they might cause this test to timeout.
-            error = process.SaveCore(core_sb_full, "minidump", lldb.eSaveCoreFull)
+            options = lldb.SBCoreDumpOptions(core_sb_full)
+            options.SetCoreDumpPluginName("minidump")
+            options.SetCoreDumpStyle(lldb.eSaveCoreFull)
+            error = process.SaveCore(options)
             self.assertTrue(error.Success())
             self.assertTrue(os.path.isfile(core_sb_full))
             self.verify_core_file(

>From e8425792f02c60e74c0070c3674e54d41f06205b Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
Date: Wed, 10 Jul 2024 15:20:51 -0700
Subject: [PATCH 3/4] Add descriptions to sbcoredumpoptions methods. Run
 git-clang-format

---
 lldb/include/lldb/API/SBCoreDumpOptions.h     | 23 ++++++++++++++++---
 lldb/include/lldb/Symbol/CoreDumpOptions.h    | 11 ++++-----
 lldb/source/API/SBCoreDumpOptions.cpp         | 14 ++++++-----
 lldb/source/API/SBProcess.cpp                 |  7 +++---
 lldb/source/Commands/CommandObjectProcess.cpp |  6 ++---
 lldb/source/Core/PluginManager.cpp            | 12 +++++-----
 .../ObjectFile/Mach-O/ObjectFileMachO.cpp     |  2 +-
 .../Minidump/ObjectFileMinidump.cpp           |  3 ++-
 .../ObjectFile/PECOFF/WindowsMiniDump.cpp     |  3 +--
 .../ObjectFile/PECOFF/WindowsMiniDump.h       |  3 +--
 lldb/source/Symbol/CoreDumpOptions.cpp        |  8 ++++---
 11 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/lldb/include/lldb/API/SBCoreDumpOptions.h b/lldb/include/lldb/API/SBCoreDumpOptions.h
index b3e81ceee852a..48baf448492b4 100644
--- a/lldb/include/lldb/API/SBCoreDumpOptions.h
+++ b/lldb/include/lldb/API/SBCoreDumpOptions.h
@@ -16,19 +16,36 @@ namespace lldb {
 
 class LLDB_API SBCoreDumpOptions {
 public:
-  SBCoreDumpOptions(const char* filePath);
+  SBCoreDumpOptions(const char *filePath);
   SBCoreDumpOptions(const lldb::SBCoreDumpOptions &rhs);
   ~SBCoreDumpOptions() = default;
 
   const SBCoreDumpOptions &operator=(const lldb::SBCoreDumpOptions &rhs);
 
-  void SetCoreDumpPluginName(const char* plugin);
+  /// Set the Core dump plugin name.
+  ///
+  /// \param plugin Name of the object file plugin.
+  void SetCoreDumpPluginName(const char *plugin);
+
+  /// Get the Core dump plugin name, if set.
+  ///
+  /// \return The name of the plugin, or nullopt if not set.
   const std::optional<const char *> GetCoreDumpPluginName() const;
 
+  /// Set the Core dump style.
+  ///
+  /// \param style The style of the core dump.
   void SetCoreDumpStyle(lldb::SaveCoreStyle style);
+
+  /// Get the Core dump style, if set.
+  ///
+  /// \return The core dump style, or nullopt if not set.
   const std::optional<lldb::SaveCoreStyle> GetCoreDumpStyle() const;
 
-  const char * GetOutputFile() const;
+  /// Get the output file path
+  ///
+  /// \return The output file path.
+  const char *GetOutputFile() const;
 
 protected:
   friend class SBProcess;
diff --git a/lldb/include/lldb/Symbol/CoreDumpOptions.h b/lldb/include/lldb/Symbol/CoreDumpOptions.h
index 435031a510d80..b5482bcf24359 100644
--- a/lldb/include/lldb/Symbol/CoreDumpOptions.h
+++ b/lldb/include/lldb/Symbol/CoreDumpOptions.h
@@ -19,11 +19,10 @@
 namespace lldb_private {
 
 class CoreDumpOptions {
-  public:
-    CoreDumpOptions(const lldb_private::FileSpec &fspec) :
-      m_core_dump_file(std::move(fspec)) {};
-    ~CoreDumpOptions() = default;
-
+public:
+  CoreDumpOptions(const lldb_private::FileSpec &fspec)
+      : m_core_dump_file(std::move(fspec)){};
+  ~CoreDumpOptions() = default;
 
   void SetCoreDumpPluginName(llvm::StringRef name);
   std::optional<llvm::StringRef> GetCoreDumpPluginName() const;
@@ -31,7 +30,7 @@ class CoreDumpOptions {
   void SetCoreDumpStyle(lldb::SaveCoreStyle style);
   lldb::SaveCoreStyle GetCoreDumpStyle() const;
 
-  const lldb_private::FileSpec& GetOutputFile() const;
+  const lldb_private::FileSpec &GetOutputFile() const;
 
 private:
   std::optional<std::string> m_core_dump_plugin_name;
diff --git a/lldb/source/API/SBCoreDumpOptions.cpp b/lldb/source/API/SBCoreDumpOptions.cpp
index f7eab4231d819..944f44e75039b 100644
--- a/lldb/source/API/SBCoreDumpOptions.cpp
+++ b/lldb/source/API/SBCoreDumpOptions.cpp
@@ -7,15 +7,15 @@
 //===----------------------------------------------------------------------===//
 
 #include "lldb/API/SBCoreDumpOptions.h"
+#include "lldb/Host/FileSystem.h"
 #include "lldb/Symbol/CoreDumpOptions.h"
 #include "lldb/Utility/Instrumentation.h"
-#include "lldb/Host/FileSystem.h"
 
 #include "Utils.h"
 
 using namespace lldb;
 
-SBCoreDumpOptions::SBCoreDumpOptions(const char* filePath) {
+SBCoreDumpOptions::SBCoreDumpOptions(const char *filePath) {
   LLDB_INSTRUMENT_VA(this, filePath);
   lldb_private::FileSpec fspec(filePath);
   lldb_private::FileSystem::Instance().Resolve(fspec);
@@ -45,21 +45,23 @@ void SBCoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
   m_opaque_up->SetCoreDumpStyle(style);
 }
 
-const std::optional<const char *> SBCoreDumpOptions::GetCoreDumpPluginName() const {
+const std::optional<const char *>
+SBCoreDumpOptions::GetCoreDumpPluginName() const {
   const auto &name = m_opaque_up->GetCoreDumpPluginName();
   if (name->empty())
     return std::nullopt;
   return name->data();
 }
 
-const char * SBCoreDumpOptions::GetOutputFile() const {
+const char *SBCoreDumpOptions::GetOutputFile() const {
   return m_opaque_up->GetOutputFile().GetFilename().AsCString();
 }
 
-const std::optional<lldb::SaveCoreStyle> SBCoreDumpOptions::GetCoreDumpStyle() const {
+const std::optional<lldb::SaveCoreStyle>
+SBCoreDumpOptions::GetCoreDumpStyle() const {
   return m_opaque_up->GetCoreDumpStyle();
 }
 
-lldb_private::CoreDumpOptions& SBCoreDumpOptions::Ref() const {
+lldb_private::CoreDumpOptions &SBCoreDumpOptions::Ref() const {
   return *m_opaque_up.get();
 }
diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp
index ef4641c43464b..436b615bab920 100644
--- a/lldb/source/API/SBProcess.cpp
+++ b/lldb/source/API/SBProcess.cpp
@@ -1231,10 +1231,9 @@ lldb::SBError SBProcess::SaveCore(const char *file_name,
 
 lldb::SBError SBProcess::SaveCore(SBCoreDumpOptions &options) {
 
-  LLDB_INSTRUMENT_VA(this, 
-      options.GetOutputFile(), 
-      options.GetCoreDumpPluginName(), 
-      options.GetCoreDumpStyle());
+  LLDB_INSTRUMENT_VA(this, options.GetOutputFile(),
+                     options.GetCoreDumpPluginName(),
+                     options.GetCoreDumpStyle());
 
   lldb::SBError error;
   ProcessSP process_sp(GetSP());
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index 382b4058c74b3..f17c50ee22ac3 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -1305,10 +1305,10 @@ class CommandObjectProcessSaveCore : public CommandObjectParsed {
         FileSystem::Instance().Resolve(output_file);
         SaveCoreStyle corefile_style = m_options.m_requested_save_core_style;
         CoreDumpOptions core_dump_options(output_file);
-        core_dump_options.SetCoreDumpPluginName(m_options.m_requested_plugin_name);
+        core_dump_options.SetCoreDumpPluginName(
+            m_options.m_requested_plugin_name);
         core_dump_options.SetCoreDumpStyle(corefile_style);
-        Status error =
-            PluginManager::SaveCore(process_sp, core_dump_options);
+        Status error = PluginManager::SaveCore(process_sp, core_dump_options);
         if (error.Success()) {
           if (corefile_style == SaveCoreStyle::eSaveCoreDirtyOnly ||
               corefile_style == SaveCoreStyle::eSaveCoreStackOnly) {
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index 346d38248e7c2..90231af030d90 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -8,11 +8,11 @@
 
 #include "lldb/Core/PluginManager.h"
 
-#include "lldb/Symbol/CoreDumpOptions.h"
 #include "lldb/Core/Debugger.h"
 #include "lldb/Host/FileSystem.h"
 #include "lldb/Host/HostInfo.h"
 #include "lldb/Interpreter/OptionValueProperties.h"
+#include "lldb/Symbol/CoreDumpOptions.h"
 #include "lldb/Target/Process.h"
 #include "lldb/Utility/FileSpec.h"
 #include "lldb/Utility/Status.h"
@@ -693,7 +693,8 @@ Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
                                lldb_private::CoreDumpOptions &options) {
   if (options.GetCoreDumpPluginName()->empty()) {
     // Try saving core directly from the process plugin first.
-    llvm::Expected<bool> ret = process_sp->SaveCore(options.GetOutputFile().GetPath());
+    llvm::Expected<bool> ret =
+        process_sp->SaveCore(options.GetOutputFile().GetPath());
     if (!ret)
       return Status(ret.takeError());
     if (ret.get())
@@ -704,9 +705,9 @@ Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
   Status error;
   auto &instances = GetObjectFileInstances().GetInstances();
   for (auto &instance : instances) {
-    if (options.GetCoreDumpPluginName()->empty() || instance.name == options.GetCoreDumpPluginName()) {
-      if (instance.save_core &&
-          instance.save_core(process_sp, options, error))
+    if (options.GetCoreDumpPluginName()->empty() ||
+        instance.name == options.GetCoreDumpPluginName()) {
+      if (instance.save_core && instance.save_core(process_sp, options, error))
         return error;
     }
   }
@@ -719,7 +720,6 @@ Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
   return error;
 }
 
-
 #pragma mark ObjectContainer
 
 struct ObjectContainerInstance
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index f5ade48af07dc..bfb1d6d69f002 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -6518,7 +6518,7 @@ struct page_object {
   uint32_t prot;
 };
 
-bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp, 
+bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
                                lldb_private::CoreDumpOptions &core_options,
                                Status &error) {
   auto core_style = core_options.GetCoreDumpStyle();
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
index f7c833edefb5d..a4c7f9d8cf610 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
+++ b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
@@ -66,7 +66,8 @@ bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp,
     return false;
 
   llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open(
-      core_options.GetOutputFile(), File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
+      core_options.GetOutputFile(),
+      File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
   if (!maybe_core_file) {
     error = maybe_core_file.takeError();
     return false;
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
index 7fafc9a4370e8..79eaf36752a85 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
@@ -21,8 +21,7 @@
 namespace lldb_private {
 
 bool SaveMiniDump(const lldb::ProcessSP &process_sp,
-                  CoreDumpOptions &core_options,
-                  lldb_private::Status &error) {
+                  CoreDumpOptions &core_options, lldb_private::Status &error) {
   if (!process_sp)
     return false;
 #ifdef _WIN32
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
index f94d873989a18..eaddfa17b7455 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
@@ -14,8 +14,7 @@
 namespace lldb_private {
 
 bool SaveMiniDump(const lldb::ProcessSP &process_sp,
-                  CoreDumpOptions &core_options,
-                  lldb_private::Status &error);
+                  CoreDumpOptions &core_options, lldb_private::Status &error);
 
 } // namespace lldb_private
 
diff --git a/lldb/source/Symbol/CoreDumpOptions.cpp b/lldb/source/Symbol/CoreDumpOptions.cpp
index 688105a6aea2f..78e7e1a3e8617 100644
--- a/lldb/source/Symbol/CoreDumpOptions.cpp
+++ b/lldb/source/Symbol/CoreDumpOptions.cpp
@@ -15,7 +15,7 @@ void CoreDumpOptions::SetCoreDumpPluginName(const llvm::StringRef name) {
   m_core_dump_plugin_name = name.data();
 }
 
-std::optional<llvm::StringRef> CoreDumpOptions::GetCoreDumpPluginName() const { 
+std::optional<llvm::StringRef> CoreDumpOptions::GetCoreDumpPluginName() const {
   if (!m_core_dump_plugin_name)
     return std::nullopt;
   return m_core_dump_plugin_name->data();
@@ -25,11 +25,13 @@ void CoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
   m_core_dump_style = style;
 }
 
-lldb::SaveCoreStyle CoreDumpOptions::GetCoreDumpStyle() const { 
+lldb::SaveCoreStyle CoreDumpOptions::GetCoreDumpStyle() const {
   // If unspecified, default to stack only
   if (m_core_dump_style == lldb::eSaveCoreUnspecified)
     return lldb::eSaveCoreStackOnly;
   return m_core_dump_style;
 }
 
-const lldb_private::FileSpec& CoreDumpOptions::GetOutputFile() const { return m_core_dump_file; }
+const lldb_private::FileSpec &CoreDumpOptions::GetOutputFile() const {
+  return m_core_dump_file;
+}

>From 2673674ffaff7e1e62480928f88f7525c378dbc7 Mon Sep 17 00:00:00 2001
From: Jacob Lalonde <jalalonde at fb.com>
Date: Tue, 16 Jul 2024 17:38:16 -0700
Subject: [PATCH 4/4] Code review feedback on all API's, fix tests, and remove
 default behaviors in each flavor of save core

---
 lldb/include/lldb/API/SBCoreDumpOptions.h     | 25 ++++++++-----
 lldb/include/lldb/API/SBFileSpec.h            |  1 +
 lldb/include/lldb/Core/PluginManager.h        |  2 +-
 lldb/include/lldb/Symbol/CoreDumpOptions.h    | 18 +++++-----
 lldb/include/lldb/lldb-private-interfaces.h   |  2 +-
 lldb/source/API/SBCoreDumpOptions.cpp         | 35 ++++++++++++-------
 lldb/source/API/SBProcess.cpp                 |  4 ++-
 lldb/source/Commands/CommandObjectProcess.cpp | 25 ++++++-------
 lldb/source/Core/PluginManager.cpp            | 11 ++++--
 .../ObjectFile/Mach-O/ObjectFileMachO.cpp     | 12 +++----
 .../ObjectFile/Mach-O/ObjectFileMachO.h       |  2 +-
 .../Minidump/ObjectFileMinidump.cpp           | 10 ++----
 .../ObjectFile/Minidump/ObjectFileMinidump.h  |  2 +-
 .../ObjectFile/PECOFF/ObjectFilePECOFF.cpp    |  3 +-
 .../ObjectFile/PECOFF/ObjectFilePECOFF.h      |  2 +-
 .../ObjectFile/PECOFF/WindowsMiniDump.cpp     |  2 +-
 .../ObjectFile/PECOFF/WindowsMiniDump.h       |  2 +-
 lldb/source/Symbol/CoreDumpOptions.cpp        | 32 ++++++++++-------
 .../TestProcessSaveCoreMinidump.py            | 12 +++++--
 19 files changed, 115 insertions(+), 87 deletions(-)

diff --git a/lldb/include/lldb/API/SBCoreDumpOptions.h b/lldb/include/lldb/API/SBCoreDumpOptions.h
index 48baf448492b4..c9cec5b841ba3 100644
--- a/lldb/include/lldb/API/SBCoreDumpOptions.h
+++ b/lldb/include/lldb/API/SBCoreDumpOptions.h
@@ -16,7 +16,7 @@ namespace lldb {
 
 class LLDB_API SBCoreDumpOptions {
 public:
-  SBCoreDumpOptions(const char *filePath);
+  SBCoreDumpOptions();
   SBCoreDumpOptions(const lldb::SBCoreDumpOptions &rhs);
   ~SBCoreDumpOptions() = default;
 
@@ -29,8 +29,8 @@ class LLDB_API SBCoreDumpOptions {
 
   /// Get the Core dump plugin name, if set.
   ///
-  /// \return The name of the plugin, or nullopt if not set.
-  const std::optional<const char *> GetCoreDumpPluginName() const;
+  /// \return The name of the plugin, or null if not set.
+  const char * GetCoreDumpPluginName() const;
 
   /// Set the Core dump style.
   ///
@@ -39,13 +39,22 @@ class LLDB_API SBCoreDumpOptions {
 
   /// Get the Core dump style, if set.
   ///
-  /// \return The core dump style, or nullopt if not set.
-  const std::optional<lldb::SaveCoreStyle> GetCoreDumpStyle() const;
+  /// \return The core dump style, or undefined if not set.
+  lldb::SaveCoreStyle GetCoreDumpStyle() const;
 
-  /// Get the output file path
+  /// Set the output file path
   ///
-  /// \return The output file path.
-  const char *GetOutputFile() const;
+  /// \param output_file a 
+  /// \class SBFileSpec object that describes the output file.
+  void SetOutputFile(SBFileSpec &output_file);
+
+  /// Get the output file spec
+  ///
+  /// \return The output file spec.
+  SBFileSpec GetOutputFile() const;
+
+  /// Reset all options.
+  void Clear();
 
 protected:
   friend class SBProcess;
diff --git a/lldb/include/lldb/API/SBFileSpec.h b/lldb/include/lldb/API/SBFileSpec.h
index beefa19ad7f36..bcf090d4c0ae2 100644
--- a/lldb/include/lldb/API/SBFileSpec.h
+++ b/lldb/include/lldb/API/SBFileSpec.h
@@ -78,6 +78,7 @@ class LLDB_API SBFileSpec {
   friend class SBTarget;
   friend class SBThread;
   friend class SBTrace;
+  friend class SBCoreDumpOptions;
 
   SBFileSpec(const lldb_private::FileSpec &fspec);
 
diff --git a/lldb/include/lldb/Core/PluginManager.h b/lldb/include/lldb/Core/PluginManager.h
index dcc3a8a062265..297381fa911e6 100644
--- a/lldb/include/lldb/Core/PluginManager.h
+++ b/lldb/include/lldb/Core/PluginManager.h
@@ -191,7 +191,7 @@ class PluginManager {
   GetObjectFileCreateMemoryCallbackForPluginName(llvm::StringRef name);
 
   static Status SaveCore(const lldb::ProcessSP &process_sp,
-                         lldb_private::CoreDumpOptions &core_options);
+                         const lldb_private::CoreDumpOptions &core_options);
 
   // ObjectContainer
   static bool RegisterPlugin(
diff --git a/lldb/include/lldb/Symbol/CoreDumpOptions.h b/lldb/include/lldb/Symbol/CoreDumpOptions.h
index b5482bcf24359..75d70a5967c9f 100644
--- a/lldb/include/lldb/Symbol/CoreDumpOptions.h
+++ b/lldb/include/lldb/Symbol/CoreDumpOptions.h
@@ -20,22 +20,24 @@ namespace lldb_private {
 
 class CoreDumpOptions {
 public:
-  CoreDumpOptions(const lldb_private::FileSpec &fspec)
-      : m_core_dump_file(std::move(fspec)){};
+  CoreDumpOptions() {};
   ~CoreDumpOptions() = default;
 
-  void SetCoreDumpPluginName(llvm::StringRef name);
-  std::optional<llvm::StringRef> GetCoreDumpPluginName() const;
+  void SetCoreDumpPluginName(const char * name);
+  std::optional<std::string> GetCoreDumpPluginName() const;
 
   void SetCoreDumpStyle(lldb::SaveCoreStyle style);
   lldb::SaveCoreStyle GetCoreDumpStyle() const;
 
-  const lldb_private::FileSpec &GetOutputFile() const;
+  void SetOutputFile(lldb_private::FileSpec file);
+  const std::optional<lldb_private::FileSpec> GetOutputFile() const;
+
+  void Clear();
 
 private:
-  std::optional<std::string> m_core_dump_plugin_name;
-  const lldb_private::FileSpec m_core_dump_file;
-  lldb::SaveCoreStyle m_core_dump_style = lldb::eSaveCoreUnspecified;
+  std::optional<std::string> m_plugin_name;
+  std::optional<lldb_private::FileSpec> m_file;
+  std::optional<lldb::SaveCoreStyle> m_style;
 };
 } // namespace lldb_private
 
diff --git a/lldb/include/lldb/lldb-private-interfaces.h b/lldb/include/lldb/lldb-private-interfaces.h
index 0948a0482b201..044a57f87d492 100644
--- a/lldb/include/lldb/lldb-private-interfaces.h
+++ b/lldb/include/lldb/lldb-private-interfaces.h
@@ -56,7 +56,7 @@ typedef ObjectFile *(*ObjectFileCreateMemoryInstance)(
     const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
     const lldb::ProcessSP &process_sp, lldb::addr_t offset);
 typedef bool (*ObjectFileSaveCore)(const lldb::ProcessSP &process_sp,
-                                   lldb_private::CoreDumpOptions &core_options,
+                                   const lldb_private::CoreDumpOptions &core_options,
                                    Status &error);
 typedef EmulateInstruction *(*EmulateInstructionCreateInstance)(
     const ArchSpec &arch, InstructionType inst_type);
diff --git a/lldb/source/API/SBCoreDumpOptions.cpp b/lldb/source/API/SBCoreDumpOptions.cpp
index 944f44e75039b..fc00430a2809f 100644
--- a/lldb/source/API/SBCoreDumpOptions.cpp
+++ b/lldb/source/API/SBCoreDumpOptions.cpp
@@ -6,6 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "lldb/API/SBFileSpec.h"
 #include "lldb/API/SBCoreDumpOptions.h"
 #include "lldb/Host/FileSystem.h"
 #include "lldb/Symbol/CoreDumpOptions.h"
@@ -15,11 +16,8 @@
 
 using namespace lldb;
 
-SBCoreDumpOptions::SBCoreDumpOptions(const char *filePath) {
-  LLDB_INSTRUMENT_VA(this, filePath);
-  lldb_private::FileSpec fspec(filePath);
-  lldb_private::FileSystem::Instance().Resolve(fspec);
-  m_opaque_up = std::make_unique<lldb_private::CoreDumpOptions>(fspec);
+SBCoreDumpOptions::SBCoreDumpOptions() {
+  m_opaque_up = std::make_unique<lldb_private::CoreDumpOptions>();
 }
 
 SBCoreDumpOptions::SBCoreDumpOptions(const SBCoreDumpOptions &rhs) {
@@ -45,19 +43,26 @@ void SBCoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
   m_opaque_up->SetCoreDumpStyle(style);
 }
 
-const std::optional<const char *>
+void SBCoreDumpOptions::SetOutputFile(lldb::SBFileSpec &file_spec) {
+  m_opaque_up->SetOutputFile(file_spec.ref());
+}
+
+const char *
 SBCoreDumpOptions::GetCoreDumpPluginName() const {
-  const auto &name = m_opaque_up->GetCoreDumpPluginName();
-  if (name->empty())
-    return std::nullopt;
-  return name->data();
+  const auto name = m_opaque_up->GetCoreDumpPluginName();
+  if (!name)
+    return nullptr;
+  return lldb_private::ConstString(name.value()).GetCString();
 }
 
-const char *SBCoreDumpOptions::GetOutputFile() const {
-  return m_opaque_up->GetOutputFile().GetFilename().AsCString();
+SBFileSpec SBCoreDumpOptions::GetOutputFile() const {
+  const auto file_spec = m_opaque_up->GetOutputFile();
+  if (file_spec)
+    return SBFileSpec(file_spec.value());
+  return SBFileSpec();
 }
 
-const std::optional<lldb::SaveCoreStyle>
+lldb::SaveCoreStyle
 SBCoreDumpOptions::GetCoreDumpStyle() const {
   return m_opaque_up->GetCoreDumpStyle();
 }
@@ -65,3 +70,7 @@ SBCoreDumpOptions::GetCoreDumpStyle() const {
 lldb_private::CoreDumpOptions &SBCoreDumpOptions::Ref() const {
   return *m_opaque_up.get();
 }
+
+void SBCoreDumpOptions::Clear() {
+  m_opaque_up->Clear();
+}
diff --git a/lldb/source/API/SBProcess.cpp b/lldb/source/API/SBProcess.cpp
index 436b615bab920..a5a8190d97180 100644
--- a/lldb/source/API/SBProcess.cpp
+++ b/lldb/source/API/SBProcess.cpp
@@ -1223,7 +1223,9 @@ lldb::SBError SBProcess::SaveCore(const char *file_name) {
 lldb::SBError SBProcess::SaveCore(const char *file_name,
                                   const char *flavor,
                                   SaveCoreStyle core_style) {
-  SBCoreDumpOptions options(file_name);
+  SBFileSpec fspec(file_name);
+  SBCoreDumpOptions options;
+  options.SetOutputFile(fspec);
   options.SetCoreDumpPluginName(flavor);
   options.SetCoreDumpStyle(core_style);
   return SaveCore(options);
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index f17c50ee22ac3..fedc12b4232fe 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -1256,7 +1256,7 @@ class CommandObjectProcessSaveCore : public CommandObjectParsed {
 
   class CommandOptions : public Options {
   public:
-    CommandOptions() = default;
+    CommandOptions() : m_core_dump_options() {};
 
     ~CommandOptions() override = default;
 
@@ -1271,13 +1271,13 @@ class CommandObjectProcessSaveCore : public CommandObjectParsed {
 
       switch (short_option) {
       case 'p':
-        m_requested_plugin_name = option_arg.str();
+        m_core_dump_options.SetCoreDumpPluginName(option_arg.data());
         break;
       case 's':
-        m_requested_save_core_style =
+        m_core_dump_options.SetCoreDumpStyle(
             (lldb::SaveCoreStyle)OptionArgParser::ToOptionEnum(
                 option_arg, GetDefinitions()[option_idx].enum_values,
-                eSaveCoreUnspecified, error);
+                eSaveCoreUnspecified, error));
         break;
       default:
         llvm_unreachable("Unimplemented option");
@@ -1287,13 +1287,11 @@ class CommandObjectProcessSaveCore : public CommandObjectParsed {
     }
 
     void OptionParsingStarting(ExecutionContext *execution_context) override {
-      m_requested_save_core_style = eSaveCoreUnspecified;
-      m_requested_plugin_name.clear();
+      m_core_dump_options.Clear();
     }
 
     // Instance variables to hold the values for command options.
-    SaveCoreStyle m_requested_save_core_style = eSaveCoreUnspecified;
-    std::string m_requested_plugin_name;
+    CoreDumpOptions m_core_dump_options;
   };
 
 protected:
@@ -1303,15 +1301,12 @@ class CommandObjectProcessSaveCore : public CommandObjectParsed {
       if (command.GetArgumentCount() == 1) {
         FileSpec output_file(command.GetArgumentAtIndex(0));
         FileSystem::Instance().Resolve(output_file);
-        SaveCoreStyle corefile_style = m_options.m_requested_save_core_style;
-        CoreDumpOptions core_dump_options(output_file);
-        core_dump_options.SetCoreDumpPluginName(
-            m_options.m_requested_plugin_name);
-        core_dump_options.SetCoreDumpStyle(corefile_style);
+        auto core_dump_options = m_options.m_core_dump_options;
+        core_dump_options.SetOutputFile(output_file);
         Status error = PluginManager::SaveCore(process_sp, core_dump_options);
         if (error.Success()) {
-          if (corefile_style == SaveCoreStyle::eSaveCoreDirtyOnly ||
-              corefile_style == SaveCoreStyle::eSaveCoreStackOnly) {
+          if (core_dump_options.GetCoreDumpStyle() == SaveCoreStyle::eSaveCoreDirtyOnly ||
+              core_dump_options.GetCoreDumpStyle() == SaveCoreStyle::eSaveCoreStackOnly) {
             result.AppendMessageWithFormat(
                 "\nModified-memory or stack-memory only corefile "
                 "created.  This corefile may \n"
diff --git a/lldb/source/Core/PluginManager.cpp b/lldb/source/Core/PluginManager.cpp
index 90231af030d90..c0a0630cccb9e 100644
--- a/lldb/source/Core/PluginManager.cpp
+++ b/lldb/source/Core/PluginManager.cpp
@@ -690,11 +690,17 @@ PluginManager::GetObjectFileCreateMemoryCallbackForPluginName(
 }
 
 Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
-                               lldb_private::CoreDumpOptions &options) {
+                               const lldb_private::CoreDumpOptions &options) {
+  Status error;
+  if (!options.GetOutputFile()) {
+    error.SetErrorString("No output file specified");
+    return error;
+  }
+
   if (options.GetCoreDumpPluginName()->empty()) {
     // Try saving core directly from the process plugin first.
     llvm::Expected<bool> ret =
-        process_sp->SaveCore(options.GetOutputFile().GetPath());
+        process_sp->SaveCore(options.GetOutputFile()->GetPath());
     if (!ret)
       return Status(ret.takeError());
     if (ret.get())
@@ -702,7 +708,6 @@ Status PluginManager::SaveCore(const lldb::ProcessSP &process_sp,
   }
 
   // Fall back to object plugins.
-  Status error;
   auto &instances = GetObjectFileInstances().GetInstances();
   for (auto &instance : instances) {
     if (options.GetCoreDumpPluginName()->empty() ||
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index bfb1d6d69f002..23183ada04b28 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -6519,17 +6519,13 @@ struct page_object {
 };
 
 bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
-                               lldb_private::CoreDumpOptions &core_options,
+                               const lldb_private::CoreDumpOptions &core_options,
                                Status &error) {
   auto core_style = core_options.GetCoreDumpStyle();
   const auto outfile = core_options.GetOutputFile();
-  if (!process_sp)
+  if (!process_sp || !outfile)
     return false;
 
-  // Default on macOS is to create a dirty-memory-only corefile.
-  if (core_style == SaveCoreStyle::eSaveCoreUnspecified)
-    core_style = SaveCoreStyle::eSaveCoreDirtyOnly;
-
   Target &target = process_sp->GetTarget();
   const ArchSpec target_arch = target.GetArchitecture();
   const llvm::Triple &target_triple = target_arch.GetTriple();
@@ -6813,9 +6809,9 @@ bool ObjectFileMachO::SaveCore(const lldb::ProcessSP &process_sp,
           buffer.PutHex32(segment.flags);
         }
 
-        std::string core_file_path(outfile.GetPath());
+        std::string core_file_path(core_options.GetOutputFile()->GetPath());
         auto core_file = FileSystem::Instance().Open(
-            outfile, File::eOpenOptionWriteOnly | File::eOpenOptionTruncate |
+            outfile.value(), File::eOpenOptionWriteOnly | File::eOpenOptionTruncate |
                          File::eOpenOptionCanCreate);
         if (!core_file) {
           error = core_file.takeError();
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
index d77f0f68cdf11..108b4ad506a3b 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.h
@@ -62,7 +62,7 @@ class ObjectFileMachO : public lldb_private::ObjectFile {
                                         lldb_private::ModuleSpecList &specs);
 
   static bool SaveCore(const lldb::ProcessSP &process_sp,
-                       lldb_private::CoreDumpOptions &core_options,
+                       const lldb_private::CoreDumpOptions &core_options,
                        lldb_private::Status &error);
 
   static bool MagicBytesMatch(lldb::DataBufferSP data_sp, lldb::addr_t offset,
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
index a4c7f9d8cf610..cbcc616fda190 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
+++ b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.cpp
@@ -56,17 +56,13 @@ size_t ObjectFileMinidump::GetModuleSpecifications(
 }
 
 bool ObjectFileMinidump::SaveCore(const lldb::ProcessSP &process_sp,
-                                  lldb_private::CoreDumpOptions &core_options,
+                                  const lldb_private::CoreDumpOptions &core_options,
                                   lldb_private::Status &error) {
-  // Set default core style if it isn't set.
-  if (core_options.GetCoreDumpStyle() == SaveCoreStyle::eSaveCoreUnspecified)
-    core_options.SetCoreDumpStyle(SaveCoreStyle::eSaveCoreStackOnly);
-
-  if (!process_sp)
+  if (!process_sp || !core_options.GetOutputFile())
     return false;
 
   llvm::Expected<lldb::FileUP> maybe_core_file = FileSystem::Instance().Open(
-      core_options.GetOutputFile(),
+      core_options.GetOutputFile().value(),
       File::eOpenOptionWriteOnly | File::eOpenOptionCanCreate);
   if (!maybe_core_file) {
     error = maybe_core_file.takeError();
diff --git a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h
index 81e7b3339ab39..775906b11b3a1 100644
--- a/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h
+++ b/lldb/source/Plugins/ObjectFile/Minidump/ObjectFileMinidump.h
@@ -55,7 +55,7 @@ class ObjectFileMinidump : public lldb_private::PluginInterface {
 
   // Saves dump in Minidump file format
   static bool SaveCore(const lldb::ProcessSP &process_sp,
-                       lldb_private::CoreDumpOptions &core_options,
+                       const lldb_private::CoreDumpOptions &core_options,
                        lldb_private::Status &error);
 
 private:
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
index 4cd01d7f74bd6..7fad1d9434ad5 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.cpp
@@ -355,9 +355,8 @@ size_t ObjectFilePECOFF::GetModuleSpecifications(
 }
 
 bool ObjectFilePECOFF::SaveCore(const lldb::ProcessSP &process_sp,
-                                lldb_private::CoreDumpOptions &core_options,
+                                const lldb_private::CoreDumpOptions &core_options,
                                 lldb_private::Status &error) {
-  core_options.SetCoreDumpStyle(lldb::eSaveCoreFull);
   return SaveMiniDump(process_sp, core_options, error);
 }
 
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
index 1074604864978..0718d5ff72cfa 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/ObjectFilePECOFF.h
@@ -82,7 +82,7 @@ class ObjectFilePECOFF : public lldb_private::ObjectFile {
                                         lldb_private::ModuleSpecList &specs);
 
   static bool SaveCore(const lldb::ProcessSP &process_sp,
-                       lldb_private::CoreDumpOptions &core_options,
+                       const lldb_private::CoreDumpOptions &core_options,
                        lldb_private::Status &error);
 
   static bool MagicBytesMatch(lldb::DataBufferSP data_sp);
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
index 79eaf36752a85..5932fcd70d56f 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.cpp
@@ -21,7 +21,7 @@
 namespace lldb_private {
 
 bool SaveMiniDump(const lldb::ProcessSP &process_sp,
-                  CoreDumpOptions &core_options, lldb_private::Status &error) {
+                  const CoreDumpOptions &core_options, lldb_private::Status &error) {
   if (!process_sp)
     return false;
 #ifdef _WIN32
diff --git a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
index eaddfa17b7455..64e5011384f31 100644
--- a/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
+++ b/lldb/source/Plugins/ObjectFile/PECOFF/WindowsMiniDump.h
@@ -14,7 +14,7 @@
 namespace lldb_private {
 
 bool SaveMiniDump(const lldb::ProcessSP &process_sp,
-                  CoreDumpOptions &core_options, lldb_private::Status &error);
+                  const CoreDumpOptions &core_options, lldb_private::Status &error);
 
 } // namespace lldb_private
 
diff --git a/lldb/source/Symbol/CoreDumpOptions.cpp b/lldb/source/Symbol/CoreDumpOptions.cpp
index 78e7e1a3e8617..0a8fdbb667487 100644
--- a/lldb/source/Symbol/CoreDumpOptions.cpp
+++ b/lldb/source/Symbol/CoreDumpOptions.cpp
@@ -11,27 +11,35 @@
 using namespace lldb;
 using namespace lldb_private;
 
-void CoreDumpOptions::SetCoreDumpPluginName(const llvm::StringRef name) {
-  m_core_dump_plugin_name = name.data();
+void CoreDumpOptions::SetCoreDumpPluginName(const char * name) {
+  m_plugin_name = name;
 }
 
-std::optional<llvm::StringRef> CoreDumpOptions::GetCoreDumpPluginName() const {
-  if (!m_core_dump_plugin_name)
-    return std::nullopt;
-  return m_core_dump_plugin_name->data();
+void CoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
+  m_style = style;
 }
 
-void CoreDumpOptions::SetCoreDumpStyle(lldb::SaveCoreStyle style) {
-  m_core_dump_style = style;
+void CoreDumpOptions::SetOutputFile(FileSpec file) {
+  m_file = file;
+}
+
+std::optional<std::string> CoreDumpOptions::GetCoreDumpPluginName() const {
+  return m_plugin_name;
 }
 
 lldb::SaveCoreStyle CoreDumpOptions::GetCoreDumpStyle() const {
   // If unspecified, default to stack only
-  if (m_core_dump_style == lldb::eSaveCoreUnspecified)
+  if (m_style == lldb::eSaveCoreUnspecified)
     return lldb::eSaveCoreStackOnly;
-  return m_core_dump_style;
+  return m_style.value();
+}
+
+const std::optional<lldb_private::FileSpec> CoreDumpOptions::GetOutputFile() const {
+  return m_file;
 }
 
-const lldb_private::FileSpec &CoreDumpOptions::GetOutputFile() const {
-  return m_core_dump_file;
+void CoreDumpOptions::Clear() {
+  m_file = std::nullopt;
+  m_plugin_name = std::nullopt;
+  m_style = std::nullopt;
 }
diff --git a/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py b/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
index 27492756f6b4a..d4df539d28f60 100644
--- a/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
+++ b/lldb/test/API/functionalities/process_save_core_minidump/TestProcessSaveCoreMinidump.py
@@ -132,7 +132,9 @@ def test_save_linux_mini_dump(self):
                 stacks_to_sp_map,
             )
 
-            options = lldb.SBCoreDumpOptions(core_sb_stack)
+            options = lldb.SBCoreDumpOptions()
+            core_sb_stack_spec = lldb.SBFileSpec(core_sb_stack)
+            options.SetOutputFile(core_sb_stack_spec)
             options.SetCoreDumpPluginName("minidump")
             options.SetCoreDumpStyle(lldb.eSaveCoreStackOnly)
             # validate saving via SBProcess
@@ -147,7 +149,9 @@ def test_save_linux_mini_dump(self):
                 stacks_to_sp_map,
             )
 
-            options = lldb.SBCoreDumpOptions(core_sb_dirty)
+            options = lldb.SBCoreDumpOptions()
+            core_sb_dirty_spec = lldb.SBFileSpec(core_sb_dirty)
+            options.SetOutputFile(core_sb_dirty_spec)
             options.SetCoreDumpPluginName("minidump")
             options.SetCoreDumpStyle(lldb.eSaveCoreDirtyOnly)
             error = process.SaveCore(options)
@@ -163,7 +167,9 @@ def test_save_linux_mini_dump(self):
 
             # Minidump can now save full core files, but they will be huge and
             # they might cause this test to timeout.
-            options = lldb.SBCoreDumpOptions(core_sb_full)
+            options = lldb.SBCoreDumpOptions()
+            core_sb_full_spec = lldb.SBFileSpec(core_sb_full)
+            options.SetOutputFile(core_sb_full_spec)
             options.SetCoreDumpPluginName("minidump")
             options.SetCoreDumpStyle(lldb.eSaveCoreFull)
             error = process.SaveCore(options)



More information about the lldb-commits mailing list