timotheecour updated this revision to Diff 137940.
timotheecour added a comment.

- format
- use llvm::sys::DynamicLibrary
- added DLanguageProperties


https://reviews.llvm.org/D44321

Files:
  include/lldb/Core/Mangled.h
  include/lldb/Core/PluginManager.h
  source/API/SystemInitializerFull.cpp
  source/Core/CMakeLists.txt
  source/Core/Mangled.cpp
  source/Core/PluginManager.cpp
  source/Plugins/Language/CMakeLists.txt
  source/Plugins/Language/D/CMakeLists.txt
  source/Plugins/Language/D/DLanguage.cpp
  source/Plugins/Language/D/DLanguage.h

Index: source/Plugins/Language/D/DLanguage.h
===================================================================
--- /dev/null
+++ source/Plugins/Language/D/DLanguage.h
@@ -0,0 +1,74 @@
+//===-- DLanguage.h ---------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef liblldb_DLanguage_h_
+#define liblldb_DLanguage_h_
+
+// C Includes
+// C++ Includes
+// Other libraries and framework includes
+// Project includes
+#include "lldb/Target/Language.h"
+#include "lldb/lldb-private.h"
+
+namespace lldb_private {
+
+class DLanguageProperties : public Properties {
+public:
+  DLanguageProperties();
+
+  ~DLanguageProperties() override;
+
+  llvm::StringRef GetPluginfileDlang();
+};
+
+class DLanguage : public Language {
+public:
+  typedef std::shared_ptr<DLanguageProperties> DLanguagePropertiesSP;
+
+  DLanguage() = default;
+
+  ~DLanguage() override = default;
+
+  lldb::LanguageType GetLanguageType() const override {
+    return lldb::eLanguageTypeD;
+  }
+
+  //------------------------------------------------------------------
+  // Static Functions
+  //------------------------------------------------------------------
+  static void Initialize();
+
+  static void Terminate();
+
+  static lldb_private::Language *CreateInstance(lldb::LanguageType language);
+
+  static void DebuggerInitialize(lldb_private::Debugger &debugger);
+
+  static DLanguage *Instance();
+
+  static const DLanguagePropertiesSP &GetGlobalProperties();
+
+  static lldb_private::ConstString GetPluginNameStatic();
+
+  static bool IsDMangledName(const char *name);
+  // Consider using non-static methods
+  static char *demangle(const ConstString &mangled);
+
+  //------------------------------------------------------------------
+  // PluginInterface protocol
+  //------------------------------------------------------------------
+  ConstString GetPluginName() override;
+
+  uint32_t GetPluginVersion() override;
+};
+
+} // namespace lldb_private
+
+#endif // liblldb_DLanguage_h_
Index: source/Plugins/Language/D/DLanguage.cpp
===================================================================
--- /dev/null
+++ source/Plugins/Language/D/DLanguage.cpp
@@ -0,0 +1,151 @@
+//===-- DLanguage.cpp -------------------------------------------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "DLanguage.h"
+
+#include "lldb/Core/PluginManager.h"
+#include "lldb/Interpreter/OptionValueProperties.h"
+#include "lldb/Interpreter/OptionValueString.h"
+#include "lldb/Interpreter/Property.h"
+#include "lldb/Utility/ConstString.h"
+#include "lldb/Utility/Log.h"
+#include "llvm/Support/DynamicLibrary.h"
+
+#include <dlfcn.h>
+
+using namespace lldb;
+using namespace lldb_private;
+
+using llvm::sys::DynamicLibrary;
+
+namespace {
+
+template <typename Fun>
+Fun *getTypedSymbol(DynamicLibrary &lib, const char *symbol) {
+  return reinterpret_cast<Fun *>(lib.getAddressOfSymbol(symbol));
+}
+
+// D Plugin will define these symbols. They're declared to use with decltype.
+extern "C" {
+char *lldbd_demangle(size_t length, const char *mangled);
+void d_initialize();
+}
+
+static PropertyDefinition g_properties[] = {
+    {"pluginfile", OptionValue::eTypeString, true,
+     OptionValueString::eOptionEncodeCharacterEscapeSequences, "", nullptr,
+     "The plugin shared library file to use for D language."},
+};
+
+enum {
+  ePropertyPluginfileDlang,
+};
+
+} // anonymous namespace
+
+// DLanguageProperties
+DLanguageProperties::~DLanguageProperties() = default;
+
+DLanguageProperties::DLanguageProperties() : Properties() {
+  m_collection_sp.reset(
+      new OptionValueProperties(DLanguage::GetPluginNameStatic()));
+  m_collection_sp->Initialize(g_properties);
+}
+
+// DLanguage
+llvm::StringRef DLanguageProperties::GetPluginfileDlang() {
+  const uint32_t idx = ePropertyPluginfileDlang;
+  assert(m_collection_sp);
+  return m_collection_sp->GetPropertyAtIndexAsString(
+      nullptr, idx, g_properties[idx].default_cstr_value);
+}
+
+void DLanguage::Initialize() {
+  PluginManager::RegisterPlugin(GetPluginNameStatic(), "D Language",
+                                CreateInstance, DebuggerInitialize);
+}
+
+void DLanguage::DebuggerInitialize(Debugger &debugger) {
+  if (!PluginManager::GetSettingForLanguagePlugin(debugger,
+                                                  GetPluginNameStatic())) {
+    const bool is_global_setting = true;
+    PluginManager::CreateSettingForLanguagePlugin(
+        debugger, GetGlobalProperties()->GetValueProperties(),
+        ConstString("Properties for the dlang plug-in."), is_global_setting);
+  }
+}
+
+void DLanguage::Terminate() { PluginManager::UnregisterPlugin(CreateInstance); }
+
+lldb_private::ConstString DLanguage::GetPluginNameStatic() {
+  static ConstString g_name("D");
+  return g_name;
+}
+
+lldb_private::ConstString DLanguage::GetPluginName() {
+  return GetPluginNameStatic();
+}
+
+uint32_t DLanguage::GetPluginVersion() { return 1; }
+
+Language *DLanguage::CreateInstance(lldb::LanguageType language) {
+  switch (language) {
+  case lldb::eLanguageTypeD:
+    return DLanguage::Instance();
+  default:
+    return nullptr;
+  }
+}
+
+const DLanguage::DLanguagePropertiesSP &DLanguage::GetGlobalProperties() {
+  static DLanguage::DLanguagePropertiesSP *g_settings_sp_ptr =
+      new DLanguage::DLanguagePropertiesSP(new DLanguageProperties());
+  return *g_settings_sp_ptr;
+}
+
+DLanguage *DLanguage::Instance() {
+  static auto ret = new DLanguage();
+  return ret;
+}
+
+char *DLanguage::demangle(const ConstString &mangled) {
+  auto len = mangled.GetLength();
+  auto s = mangled.GetCString();
+  static auto fun = []() -> decltype(lldbd_demangle) * {
+    std::string file =
+        DLanguage::GetGlobalProperties()->GetPluginfileDlang().str();
+    std::string errMsg;
+    auto lib2 = DynamicLibrary::getPermanentLibrary(file.c_str(), &errMsg);
+
+    if (!file.empty() && !lib2.isValid()) {
+      Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_STEP));
+      if (log) {
+        log->Printf("errMsg:%s\b", errMsg.c_str());
+      }
+      return nullptr;
+    }
+
+    auto fun0 = getTypedSymbol<decltype(d_initialize)>(lib2, "d_initialize");
+    assert(fun0);
+    (*fun0)();
+
+    auto fun = getTypedSymbol<decltype(lldbd_demangle)>(lib2, "lldbd_demangle");
+    assert(fun);
+    return fun;
+  }();
+  if (!fun)
+    return nullptr;
+  return (*fun)(len, s);
+}
+
+bool DLanguage::IsDMangledName(const char *name) {
+  if (name == nullptr)
+    return false;
+  return (name[0] != '\0' && name[0] == '_' && name[1] == 'D');
+}
Index: source/Plugins/Language/D/CMakeLists.txt
===================================================================
--- /dev/null
+++ source/Plugins/Language/D/CMakeLists.txt
@@ -0,0 +1,7 @@
+add_lldb_library(lldbPluginDLanguage PLUGIN
+  DLanguage.cpp
+  
+  LINK_LIBS
+    lldbCore
+    lldbTarget
+)
Index: source/Plugins/Language/CMakeLists.txt
===================================================================
--- source/Plugins/Language/CMakeLists.txt
+++ source/Plugins/Language/CMakeLists.txt
@@ -4,3 +4,4 @@
 add_subdirectory(ObjC)
 add_subdirectory(ObjCPlusPlus)
 add_subdirectory(OCaml)
+add_subdirectory(D)
Index: source/Core/PluginManager.cpp
===================================================================
--- source/Core/PluginManager.cpp
+++ source/Core/PluginManager.cpp
@@ -741,11 +741,14 @@
 #pragma mark Language
 
 struct LanguageInstance {
-  LanguageInstance() : name(), description(), create_callback(nullptr) {}
+  LanguageInstance()
+      : name(), description(), create_callback(nullptr),
+        debugger_init_callback(nullptr) {}
 
   ConstString name;
   std::string description;
   LanguageCreateInstance create_callback;
+  DebuggerInitializeCallback debugger_init_callback;
 };
 
 typedef std::vector<LanguageInstance> LanguageInstances;
@@ -760,16 +763,18 @@
   return g_instances;
 }
 
-bool PluginManager::RegisterPlugin(const ConstString &name,
-                                   const char *description,
-                                   LanguageCreateInstance create_callback) {
+bool PluginManager::RegisterPlugin(
+    const ConstString &name, const char *description,
+    LanguageCreateInstance create_callback,
+    DebuggerInitializeCallback debugger_init_callback) {
   if (create_callback) {
     LanguageInstance instance;
     assert((bool)name);
     instance.name = name;
     if (description && description[0])
       instance.description = description;
     instance.create_callback = create_callback;
+    instance.debugger_init_callback = debugger_init_callback;
     std::lock_guard<std::recursive_mutex> guard(GetLanguageMutex());
     GetLanguageInstances().push_back(instance);
   }
@@ -2358,6 +2363,15 @@
         plugin.debugger_init_callback(debugger);
     }
   }
+
+  // Initialize the LanguagePlugin plugins
+  {
+    std::lock_guard<std::recursive_mutex> guard(GetLanguageMutex());
+    for (auto &plugin : GetLanguageInstances()) {
+      if (plugin.debugger_init_callback)
+        plugin.debugger_init_callback(debugger);
+    }
+  }
 }
 
 // This is the preferred new way to register plugin specific settings.  e.g.
@@ -2480,6 +2494,7 @@
 const char *kSymbolFilePluginName("symbol-file");
 const char *kJITLoaderPluginName("jit-loader");
 const char *kStructuredDataPluginName("structured-data");
+const char *kLanguagePluginName("language");
 
 } // anonymous namespace
 
@@ -2609,3 +2624,18 @@
       ConstString("Settings for structured data plug-ins"), properties_sp,
       description, is_global_property);
 }
+
+lldb::OptionValuePropertiesSP
+PluginManager::GetSettingForLanguagePlugin(Debugger &debugger,
+                                           const ConstString &setting_name) {
+  return GetSettingForPlugin(debugger, setting_name,
+                             ConstString(kLanguagePluginName));
+}
+
+bool PluginManager::CreateSettingForLanguagePlugin(
+    Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
+    const ConstString &description, bool is_global_property) {
+  return CreateSettingForPlugin(debugger, ConstString(kLanguagePluginName),
+                                ConstString("Settings for language plug-ins"),
+                                properties_sp, description, is_global_property);
+}
Index: source/Core/Mangled.cpp
===================================================================
--- source/Core/Mangled.cpp
+++ source/Core/Mangled.cpp
@@ -36,6 +36,7 @@
 #include "lldb/lldb-enumerations.h" // for LanguageType
 
 #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
+#include "Plugins/Language/D/DLanguage.h"
 #include "Plugins/Language/ObjC/ObjCLanguage.h"
 
 #include "llvm/ADT/StringRef.h"    // for StringRef
@@ -74,6 +75,8 @@
       return Mangled::eManglingSchemeMSVC;
     if (s[0] == '_' && s[1] == 'Z')
       return Mangled::eManglingSchemeItanium;
+    if (DLanguage::IsDMangledName(s))
+      return Mangled::eManglingSchemeD;
   }
   return Mangled::eManglingSchemeNone;
 }
@@ -322,6 +325,10 @@
         }
         break;
       }
+      case eManglingSchemeD: {
+        demangled_name = DLanguage::demangle(m_mangled);
+        break;
+      }
       case eManglingSchemeNone:
         break;
       }
@@ -431,6 +438,8 @@
         return lldb::eLanguageTypeC_plus_plus;
       else if (ObjCLanguage::IsPossibleObjCMethodName(mangled_name))
         return lldb::eLanguageTypeObjC;
+      else if (DLanguage::IsDMangledName(mangled_name))
+        return lldb::eLanguageTypeD;
     }
   } else {
     // ObjC names aren't really mangled, so they won't necessarily be in the 
Index: source/Core/CMakeLists.txt
===================================================================
--- source/Core/CMakeLists.txt
+++ source/Core/CMakeLists.txt
@@ -69,6 +69,7 @@
     lldbPluginProcessUtility
     lldbPluginCPlusPlusLanguage
     lldbPluginObjCLanguage
+    lldbPluginDLanguage
     lldbPluginObjectFileJIT
     ${LLDB_CURSES_LIBS}
 
Index: source/API/SystemInitializerFull.cpp
===================================================================
--- source/API/SystemInitializerFull.cpp
+++ source/API/SystemInitializerFull.cpp
@@ -56,6 +56,7 @@
 #include "Plugins/InstrumentationRuntime/UBSan/UBSanRuntime.h"
 #include "Plugins/JITLoader/GDB/JITLoaderGDB.h"
 #include "Plugins/Language/CPlusPlus/CPlusPlusLanguage.h"
+#include "Plugins/Language/D/DLanguage.h"
 #include "Plugins/Language/Go/GoLanguage.h"
 #include "Plugins/Language/Java/JavaLanguage.h"
 #include "Plugins/Language/OCaml/OCamlLanguage.h"
@@ -290,6 +291,7 @@
   ClangASTContext::Initialize();
   GoASTContext::Initialize();
   JavaASTContext::Initialize();
+  DLanguage::Initialize();
   OCamlASTContext::Initialize();
 
   ABIMacOSX_i386::Initialize();
@@ -419,6 +421,7 @@
   ClangASTContext::Terminate();
   GoASTContext::Terminate();
   JavaASTContext::Terminate();
+  DLanguage::Terminate();
   OCamlASTContext::Terminate();
 
   ABIMacOSX_i386::Terminate();
Index: include/lldb/Core/PluginManager.h
===================================================================
--- include/lldb/Core/PluginManager.h
+++ include/lldb/Core/PluginManager.h
@@ -148,8 +148,10 @@
   //------------------------------------------------------------------
   // Language
   //------------------------------------------------------------------
-  static bool RegisterPlugin(const ConstString &name, const char *description,
-                             LanguageCreateInstance create_callback);
+  static bool
+  RegisterPlugin(const ConstString &name, const char *description,
+                 LanguageCreateInstance create_callback,
+                 DebuggerInitializeCallback debugger_init_callback = nullptr);
 
   static bool UnregisterPlugin(LanguageCreateInstance create_callback);
 
@@ -540,6 +542,14 @@
   static bool CreateSettingForStructuredDataPlugin(
       Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
       const ConstString &description, bool is_global_property);
+
+  static lldb::OptionValuePropertiesSP
+  GetSettingForLanguagePlugin(Debugger &debugger,
+                              const ConstString &setting_name);
+
+  static bool CreateSettingForLanguagePlugin(
+      Debugger &debugger, const lldb::OptionValuePropertiesSP &properties_sp,
+      const ConstString &description, bool is_global_property);
 };
 
 } // namespace lldb_private
Index: include/lldb/Core/Mangled.h
===================================================================
--- include/lldb/Core/Mangled.h
+++ include/lldb/Core/Mangled.h
@@ -49,7 +49,8 @@
   enum ManglingScheme {
     eManglingSchemeNone = 0,
     eManglingSchemeMSVC,
-    eManglingSchemeItanium
+    eManglingSchemeItanium,
+    eManglingSchemeD
   };
 
   //----------------------------------------------------------------------
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to