Michael137 updated this revision to Diff 452546.
Michael137 added a comment.

- Return `std::vector` instead of using an output argument


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D131333

Files:
  lldb/include/lldb/Expression/IRExecutionUnit.h
  lldb/include/lldb/Target/Language.h
  lldb/source/Expression/IRExecutionUnit.cpp
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
  lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h

Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
===================================================================
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.h
@@ -135,8 +135,9 @@
   std::vector<ConstString>
   GenerateAlternateFunctionManglings(const ConstString mangled) const override;
 
-  ConstString FindBestAlternateFunctionMangledName(
-      const Mangled mangled, const SymbolContext &sym_ctx) const override;
+  std::vector<ConstString>
+  CollectAlternateFunctionNames(const std::vector<ConstString> &mangled_names,
+                                const SymbolContext &sc) const override;
 
   // PluginInterface protocol
   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
Index: lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
===================================================================
--- lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
+++ lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp
@@ -510,8 +510,9 @@
   return alternates;
 }
 
-ConstString CPlusPlusLanguage::FindBestAlternateFunctionMangledName(
-    const Mangled mangled, const SymbolContext &sym_ctx) const {
+static ConstString
+FindBestAlternateFunctionMangledName(const Mangled mangled,
+                                     const SymbolContext &sym_ctx) {
   ConstString demangled = mangled.GetDemangledName();
   if (!demangled)
     return ConstString();
@@ -1405,3 +1406,29 @@
   // that we could check for.
   return file_path.contains("/usr/include/c++/");
 }
+
+std::vector<ConstString> CPlusPlusLanguage::CollectAlternateFunctionNames(
+    const std::vector<ConstString> &mangled_names,
+    const SymbolContext &sc) const {
+  std::vector<ConstString> results;
+  for (const ConstString &name : mangled_names) {
+    Mangled mangled(name);
+    if (SymbolNameFitsToLanguage(mangled)) {
+      if (ConstString best_alternate =
+              FindBestAlternateFunctionMangledName(mangled, sc)) {
+        results.push_back(best_alternate);
+      }
+    }
+
+    std::vector<ConstString> alternates =
+        GenerateAlternateFunctionManglings(name);
+    results.insert(results.end(), alternates.begin(), alternates.end());
+
+    // As a last-ditch fallback, try the base name for C++ names.  It's
+    // terrible, but the DWARF doesn't always encode "extern C" correctly.
+    ConstString basename = GetDemangledFunctionNameWithoutArguments(mangled);
+    results.push_back(basename);
+  }
+
+  return results;
+}
Index: lldb/source/Expression/IRExecutionUnit.cpp
===================================================================
--- lldb/source/Expression/IRExecutionUnit.cpp
+++ lldb/source/Expression/IRExecutionUnit.cpp
@@ -671,30 +671,13 @@
   C_names.push_back(name);
 }
 
-void IRExecutionUnit::CollectCandidateCPlusPlusNames(
-    std::vector<ConstString> &CPP_names,
+std::vector<ConstString> IRExecutionUnit::CollectCandidateCPlusPlusNames(
     const std::vector<ConstString> &C_names, const SymbolContext &sc) {
   if (auto *cpp_lang = Language::FindPlugin(lldb::eLanguageTypeC_plus_plus)) {
-    for (const ConstString &name : C_names) {
-      Mangled mangled(name);
-      if (cpp_lang->SymbolNameFitsToLanguage(mangled)) {
-        if (ConstString best_alternate =
-                cpp_lang->FindBestAlternateFunctionMangledName(mangled, sc)) {
-          CPP_names.push_back(best_alternate);
-        }
-      }
-
-      std::vector<ConstString> alternates =
-          cpp_lang->GenerateAlternateFunctionManglings(name);
-      CPP_names.insert(CPP_names.end(), alternates.begin(), alternates.end());
-
-      // As a last-ditch fallback, try the base name for C++ names.  It's
-      // terrible, but the DWARF doesn't always encode "extern C" correctly.
-      ConstString basename =
-          cpp_lang->GetDemangledFunctionNameWithoutArguments(mangled);
-      CPP_names.push_back(basename);
-    }
+    return cpp_lang->CollectAlternateFunctionNames(C_names, sc);
   }
+
+  return {};
 }
 
 class LoadAddressResolver {
@@ -869,7 +852,6 @@
 lldb::addr_t IRExecutionUnit::FindSymbol(lldb_private::ConstString name,
                                          bool &missing_weak) {
   std::vector<ConstString> candidate_C_names;
-  std::vector<ConstString> candidate_CPlusPlus_names;
 
   CollectCandidateCNames(candidate_C_names, name);
 
@@ -888,9 +870,9 @@
   if (ret != LLDB_INVALID_ADDRESS)
     return ret;
 
-  CollectCandidateCPlusPlusNames(candidate_CPlusPlus_names, candidate_C_names,
-                                 m_sym_ctx);
-  ret = FindInSymbols(candidate_CPlusPlus_names, m_sym_ctx, missing_weak);
+  ret = FindInSymbols(
+      CollectCandidateCPlusPlusNames(candidate_C_names, m_sym_ctx), m_sym_ctx,
+      missing_weak);
   return ret;
 }
 
Index: lldb/include/lldb/Target/Language.h
===================================================================
--- lldb/include/lldb/Target/Language.h
+++ lldb/include/lldb/Target/Language.h
@@ -310,10 +310,20 @@
     return std::vector<ConstString>();
   }
 
-  virtual ConstString
-  FindBestAlternateFunctionMangledName(const Mangled mangled,
-                                       const SymbolContext &sym_ctx) const {
-    return ConstString();
+  /// Generates a list of mangled function name alternatives
+  ///
+  /// \param[in] mangled_names List of mangled names to generate
+  ///                          alternatives for.
+  ///
+  /// \param[in] sc SymbolContext used to find approximately matching
+  ///               mangled function names.
+  ///
+  /// \returns List of mangled function names that are similar to
+  ///          the names in 'mangled_names'.
+  virtual std::vector<ConstString>
+  CollectAlternateFunctionNames(const std::vector<ConstString> &mangled_names,
+                                const SymbolContext &sc) const {
+    return {};
   }
 
 protected:
Index: lldb/include/lldb/Expression/IRExecutionUnit.h
===================================================================
--- lldb/include/lldb/Expression/IRExecutionUnit.h
+++ lldb/include/lldb/Expression/IRExecutionUnit.h
@@ -217,9 +217,20 @@
   void CollectCandidateCNames(std::vector<ConstString> &C_names,
                               ConstString name);
 
-  void CollectCandidateCPlusPlusNames(std::vector<ConstString> &CPP_names,
-                                      const std::vector<ConstString> &C_names,
-                                      const SymbolContext &sc);
+  /// Generates a list of mangled function names from a list of
+  /// of similar mangled function names.
+  ///
+  /// \param[in] C_names List of mangled names to generate
+  ///                    alternatives for.
+  ///
+  /// \param[in] sc SymbolContext used to find approximately matching
+  ///               mangled function names.
+  ///
+  /// \returns List of mangled function names that are similar to
+  ///          the names in 'C_names'.
+  std::vector<ConstString>
+  CollectCandidateCPlusPlusNames(const std::vector<ConstString> &C_names,
+                                 const SymbolContext &sc);
 
   lldb::addr_t FindInSymbols(const std::vector<ConstString> &names,
                              const lldb_private::SymbolContext &sc,
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to