jasonmolenda created this revision.
jasonmolenda added a reviewer: JDevlieghere.
jasonmolenda added a project: LLDB.
Herald added a project: All.
jasonmolenda requested review of this revision.
Herald added a subscriber: lldb-commits.

We have tilde's in our dSYMs internally, and expanding these can involve a 
network access that is slow for some people.  I'm not worried about tilde 
expanding to a different filepath during the lifetime of a single lldb session, 
and I believe people will see very few different tildes ever expanded -- I'd be 
surprised if anyone exceed five different tilde's -- so this would be something 
easy to cache in lldb given how TildeExpressionResolver::ResolveFullPath() is 
structured.

This patch creates a simple vector of <ConstString, std::string>'s with the 
tilde names (ConstString to make comparisons cheap) and the expanded filepath.  
The method accepts a filepath as a StringRef and returns an expanded path in a 
SmallVectorImpl<char>, but I don't think the specific container used is 
important one way or the other.  I'm not wedded to this impl though.

This bit of code has been untouched in years, but adding Jonas who did touch it 
a couple years ago.

rdar://77091379


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D125505

Files:
  lldb/source/Utility/TildeExpressionResolver.cpp


Index: lldb/source/Utility/TildeExpressionResolver.cpp
===================================================================
--- lldb/source/Utility/TildeExpressionResolver.cpp
+++ lldb/source/Utility/TildeExpressionResolver.cpp
@@ -11,6 +11,7 @@
 #include <cassert>
 #include <system_error>
 
+#include "lldb/Utility/ConstString.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/FileSystem.h"
@@ -75,6 +76,7 @@
 
 bool TildeExpressionResolver::ResolveFullPath(
     StringRef Expr, llvm::SmallVectorImpl<char> &Output) {
+  static std::vector<std::tuple<ConstString, std::string>> g_tildes_expanded;
   if (!Expr.startswith("~")) {
     Output.assign(Expr.begin(), Expr.end());
     return false;
@@ -84,11 +86,27 @@
   StringRef Left =
       Expr.take_until([](char c) { return path::is_separator(c); });
 
-  if (!ResolveExact(Left, Output)) {
-    Output.assign(Expr.begin(), Expr.end());
-    return false;
+  ConstString tilde_name(Left);
+  std::string expanded_path;
+  for (const auto &it : g_tildes_expanded) {
+    if (std::get<0>(it) == tilde_name) {
+      expanded_path = std::get<1>(it);
+      break;
+    }
   }
 
-  Output.append(Expr.begin() + Left.size(), Expr.end());
+  if (expanded_path.empty()) {
+    if (!ResolveExact(Left, Output)) {
+      Output.assign(Expr.begin(), Expr.end());
+      return false;
+    }
+    expanded_path = std::string(Output.data(), Output.size());
+    g_tildes_expanded.push_back(
+        std::tuple<ConstString, std::string>(tilde_name, expanded_path));
+  } else {
+    StringRef expanded_strref(expanded_path);
+    Output.assign(expanded_path.begin(), expanded_path.end());
+  }
+  Output.append(Expr.begin() + tilde_name.GetLength(), Expr.end());
   return true;
 }


Index: lldb/source/Utility/TildeExpressionResolver.cpp
===================================================================
--- lldb/source/Utility/TildeExpressionResolver.cpp
+++ lldb/source/Utility/TildeExpressionResolver.cpp
@@ -11,6 +11,7 @@
 #include <cassert>
 #include <system_error>
 
+#include "lldb/Utility/ConstString.h"
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/FileSystem.h"
@@ -75,6 +76,7 @@
 
 bool TildeExpressionResolver::ResolveFullPath(
     StringRef Expr, llvm::SmallVectorImpl<char> &Output) {
+  static std::vector<std::tuple<ConstString, std::string>> g_tildes_expanded;
   if (!Expr.startswith("~")) {
     Output.assign(Expr.begin(), Expr.end());
     return false;
@@ -84,11 +86,27 @@
   StringRef Left =
       Expr.take_until([](char c) { return path::is_separator(c); });
 
-  if (!ResolveExact(Left, Output)) {
-    Output.assign(Expr.begin(), Expr.end());
-    return false;
+  ConstString tilde_name(Left);
+  std::string expanded_path;
+  for (const auto &it : g_tildes_expanded) {
+    if (std::get<0>(it) == tilde_name) {
+      expanded_path = std::get<1>(it);
+      break;
+    }
   }
 
-  Output.append(Expr.begin() + Left.size(), Expr.end());
+  if (expanded_path.empty()) {
+    if (!ResolveExact(Left, Output)) {
+      Output.assign(Expr.begin(), Expr.end());
+      return false;
+    }
+    expanded_path = std::string(Output.data(), Output.size());
+    g_tildes_expanded.push_back(
+        std::tuple<ConstString, std::string>(tilde_name, expanded_path));
+  } else {
+    StringRef expanded_strref(expanded_path);
+    Output.assign(expanded_path.begin(), expanded_path.end());
+  }
+  Output.append(Expr.begin() + tilde_name.GetLength(), Expr.end());
   return true;
 }
_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to