zequanwu updated this revision to Diff 475628.
zequanwu added a comment.
Herald added subscribers: llvm-commits, mstorsjo.
Herald added a project: LLVM.

Add `settings set plugin.process.minidump.abi msvc/gnu` to override minidump 
abi triple.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D137873/new/

https://reviews.llvm.org/D137873

Files:
  lldb/source/Plugins/Process/minidump/CMakeLists.txt
  lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
  lldb/source/Plugins/Process/minidump/ProcessMinidump.h
  lldb/source/Plugins/Process/minidump/ProcessMinidumpProperties.td
  lldb/test/Shell/Minidump/Windows/find-module.test
  llvm/utils/gn/secondary/lldb/source/Plugins/Process/minidump/BUILD.gn

Index: llvm/utils/gn/secondary/lldb/source/Plugins/Process/minidump/BUILD.gn
===================================================================
--- llvm/utils/gn/secondary/lldb/source/Plugins/Process/minidump/BUILD.gn
+++ llvm/utils/gn/secondary/lldb/source/Plugins/Process/minidump/BUILD.gn
@@ -1,7 +1,20 @@
+import("//lldb/utils/TableGen/lldb_tablegen.gni")
+
+lldb_tablegen("ProcessMinidumpProperties") {
+  args = [ "-gen-lldb-property-defs" ]
+}
+
+lldb_tablegen("ProcessMinidumpPropertiesEnum") {
+  args = [ "-gen-lldb-property-enum-defs" ]
+  td_file = "ProcessMinidumpProperties.td"
+}
+
 static_library("minidump") {
   output_name = "lldbPluginProcessMinidump"
   configs += [ "//llvm/utils/gn/build:lldb_code" ]
   deps = [
+    ":ProcessMinidumpProperties",
+    ":ProcessMinidumpPropertiesEnum",
     "//lldb/source/Core",
     "//lldb/source/Plugins/Process/Utility",
     "//lldb/source/Plugins/Process/elf-core",
Index: lldb/test/Shell/Minidump/Windows/find-module.test
===================================================================
--- lldb/test/Shell/Minidump/Windows/find-module.test
+++ lldb/test/Shell/Minidump/Windows/find-module.test
@@ -4,7 +4,21 @@
 RUN: yaml2obj %S/Inputs/find-module.exe.yaml -o %T/find-module.exe
 RUN: yaml2obj %S/Inputs/find-module.dmp.yaml -o %T/find-module.dmp
 RUN: %lldb -O "settings set target.exec-search-paths %T" \
-RUN:   -c %T/find-module.dmp -o "image dump objfile" -o exit | FileCheck %s
+RUN:   -c %T/find-module.dmp -o "image dump objfile" -o "target list" -o exit \
+RUN:   | FileCheck -DABI=msvc -DFILENAME=%basename_t.tmp %s
+
+RUN: %lldb -O "settings set plugin.process.minidump.abi msvc" \
+RUN:   -O "settings set target.exec-search-paths %T" \
+RUN:   -c %T/find-module.dmp -o "image dump objfile" -o "target list" -o exit \
+RUN:   | FileCheck -DABI=msvc -DFILENAME=%basename_t.tmp %s
+
+RUN: %lldb -O "settings set plugin.process.minidump.abi gnu" \
+RUN:   -O "settings set target.exec-search-paths %T" \
+RUN:   -c %T/find-module.dmp -o "image dump objfile" -o "target list" -o exit \
+RUN:   | FileCheck -DABI=gnu -DFILENAME=%basename_t.tmp %s
 
 CHECK-LABEL: image dump objfile
 CHECK: ObjectFilePECOFF, file = '{{.*}}find-module.exe', arch = i386
+
+CHECK-LABEL: target list
+CHECK: arch=i386-pc-windows-[[ABI]]
Index: lldb/source/Plugins/Process/minidump/ProcessMinidumpProperties.td
===================================================================
--- /dev/null
+++ lldb/source/Plugins/Process/minidump/ProcessMinidumpProperties.td
@@ -0,0 +1,9 @@
+include "../../../../include/lldb/Core/PropertiesBase.td"
+
+let Definition = "processminidump" in {
+  def ABI: Property<"abi", "Enum">,
+    Global,
+    DefaultEnumValue<"llvm::Triple::UnknownEnvironment">,
+    EnumValues<"OptionEnumValues(g_abi_enums)">,
+    Desc<"ABI to use when loading a Windows minidump. This configures the C++ ABI used, which affects things like the handling of class layout. Accepted values are: `msvc` for the MSVC ABI, `gnu` for the MinGW / Itanium ABI, and `default` to follow the default target if it is a Windows triple or use the MSVC ABI by default.">;
+}
Index: lldb/source/Plugins/Process/minidump/ProcessMinidump.h
===================================================================
--- lldb/source/Plugins/Process/minidump/ProcessMinidump.h
+++ lldb/source/Plugins/Process/minidump/ProcessMinidump.h
@@ -35,6 +35,8 @@
 
   static void Initialize();
 
+  static void DebuggerInitialize(Debugger &debugger);
+
   static void Terminate();
 
   static llvm::StringRef GetPluginNameStatic() { return "minidump"; }
Index: lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
===================================================================
--- lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
+++ lldb/source/Plugins/Process/minidump/ProcessMinidump.cpp
@@ -21,6 +21,7 @@
 #include "lldb/Interpreter/CommandReturnObject.h"
 #include "lldb/Interpreter/OptionArgParser.h"
 #include "lldb/Interpreter/OptionGroupBoolean.h"
+#include "lldb/Interpreter/OptionValueProperties.h"
 #include "lldb/Target/JITLoaderList.h"
 #include "lldb/Target/MemoryRegionInfo.h"
 #include "lldb/Target/SectionLoadList.h"
@@ -46,6 +47,55 @@
 
 namespace {
 
+static constexpr OptionEnumValueElement g_abi_enums[] = {
+    {
+        llvm::Triple::UnknownEnvironment,
+        "default",
+        "Use default target (if it is Windows) or MSVC",
+    },
+    {
+        llvm::Triple::MSVC,
+        "msvc",
+        "MSVC ABI",
+    },
+    {
+        llvm::Triple::GNU,
+        "gnu",
+        "MinGW / Itanium ABI",
+    },
+};
+
+#define LLDB_PROPERTIES_processminidump
+#include "ProcessMinidumpProperties.inc"
+
+enum {
+#define LLDB_PROPERTIES_processminidump
+#include "ProcessMinidumpPropertiesEnum.inc"
+};
+
+class PluginProperties : public Properties {
+public:
+  static ConstString GetSettingName() {
+    return ConstString(ProcessMinidump::GetPluginNameStatic());
+  }
+
+  PluginProperties() {
+    m_collection_sp = std::make_shared<OptionValueProperties>(GetSettingName());
+    m_collection_sp->Initialize(g_processminidump_properties);
+  }
+
+  llvm::Triple::EnvironmentType ABI() const {
+    return (llvm::Triple::EnvironmentType)
+        m_collection_sp->GetPropertyAtIndexAsEnumeration(
+            nullptr, ePropertyABI, llvm::Triple::UnknownEnvironment);
+  }
+};
+
+static PluginProperties &GetGlobalPluginProperties() {
+  static PluginProperties g_settings;
+  return g_settings;
+}
+
 /// A minimal ObjectFile implementation providing a dummy object file for the
 /// cases when the real module binary is not available. This allows the module
 /// to show up in "image list" and symbols to be added to it.
@@ -249,12 +299,23 @@
   static llvm::once_flag g_once_flag;
 
   llvm::call_once(g_once_flag, []() {
-    PluginManager::RegisterPlugin(GetPluginNameStatic(),
-                                  GetPluginDescriptionStatic(),
-                                  ProcessMinidump::CreateInstance);
+    PluginManager::RegisterPlugin(
+        GetPluginNameStatic(), GetPluginDescriptionStatic(),
+        ProcessMinidump::CreateInstance, DebuggerInitialize);
   });
 }
 
+void ProcessMinidump::DebuggerInitialize(Debugger &debugger) {
+  if (!PluginManager::GetSettingForProcessPlugin(
+          debugger, PluginProperties::GetSettingName())) {
+    const bool is_global_setting = true;
+    PluginManager::CreateSettingForProcessPlugin(
+        debugger, GetGlobalPluginProperties().GetValueProperties(),
+        ConstString("Properties for the minidump process plug-in."),
+        is_global_setting);
+  }
+}
+
 void ProcessMinidump::Terminate() {
   PluginManager::UnregisterPlugin(ProcessMinidump::CreateInstance);
 }
@@ -388,14 +449,24 @@
 }
 
 ArchSpec ProcessMinidump::GetArchitecture() {
+  // "settings set plugin.process.minidump.abi" overrides the env in minidump.
+  ArchSpec arch = m_minidump_parser->GetArchitecture();
+  llvm::Triple::EnvironmentType env = GetGlobalPluginProperties().ABI();
+  if (env == llvm::Triple::UnknownEnvironment)
+    env = arch.GetTriple().getEnvironment() != llvm::Triple::UnknownEnvironment
+              ? arch.GetTriple().getEnvironment()
+              : llvm::Triple::MSVC;
+
   if (!m_is_wow64) {
-    return m_minidump_parser->GetArchitecture();
+    arch.GetTriple().setEnvironment(env);
+    return arch;
   }
 
   llvm::Triple triple;
   triple.setVendor(llvm::Triple::VendorType::UnknownVendor);
   triple.setArch(llvm::Triple::ArchType::x86);
   triple.setOS(llvm::Triple::OSType::Win32);
+  triple.setEnvironment(env);
   return ArchSpec(triple);
 }
 
Index: lldb/source/Plugins/Process/minidump/CMakeLists.txt
===================================================================
--- lldb/source/Plugins/Process/minidump/CMakeLists.txt
+++ lldb/source/Plugins/Process/minidump/CMakeLists.txt
@@ -1,3 +1,11 @@
+lldb_tablegen(ProcessMinidumpProperties.inc -gen-lldb-property-defs
+  SOURCE ProcessMinidumpProperties.td
+  TARGET LLDBPluginProcessMinidumpPropertiesGen)
+
+lldb_tablegen(ProcessMinidumpPropertiesEnum.inc -gen-lldb-property-enum-defs
+  SOURCE ProcessMinidumpProperties.td
+  TARGET LLDBPluginProcessMinidumpPropertiesEnumGen)
+
 add_lldb_library(lldbPluginProcessMinidump PLUGIN
   MinidumpTypes.cpp
   MinidumpParser.cpp
@@ -19,3 +27,7 @@
     Object
     Support
   )
+
+add_dependencies(lldbPluginProcessMinidump
+  LLDBPluginProcessMinidumpPropertiesGen
+  LLDBPluginProcessMinidumpPropertiesEnumGen)
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to