[Lldb-commits] [lldb] r335432 - [FileSpec] Always normalize
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 25 03:16:49 PDT 2018
Thanks. Reverted in r335448.
On Mon, Jun 25, 2018 at 9:59 AM Pavel Labath <labath at google.com> wrote:
> I believe the raison d'ĂȘtre of the needsNormalization function was the
> normalization process is not exactly cheap (it constructs a vector of
> StringRefs and whatnot), and measurements showed that this actually is
> important for performance of lldb
> <https://reviews.llvm.org/D45977#1078510>.
> On Sun, 24 Jun 2018 at 14:36, Jonas Devlieghere via lldb-commits
> <lldb-commits at lists.llvm.org> wrote:
> >
> > Author: jdevlieghere
> > Date: Sun Jun 24 06:31:44 2018
> > New Revision: 335432
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=335432&view=rev
> > Log:
> > [FileSpec] Always normalize
> >
> > Removing redundant components from the path seems pretty harmless.
> > Rather than checking whether this is necessary and then actually doing
> > so, always invoke remove_dots to start with a normalized path.
> >
> > Modified:
> > lldb/trunk/source/Utility/FileSpec.cpp
> >
> > Modified: lldb/trunk/source/Utility/FileSpec.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/FileSpec.cpp?rev=335432&r1=335431&r2=335432&view=diff
> >
> ==============================================================================
> > --- lldb/trunk/source/Utility/FileSpec.cpp (original)
> > +++ lldb/trunk/source/Utility/FileSpec.cpp Sun Jun 24 06:31:44 2018
> > @@ -119,100 +119,6 @@ FileSpec::FileSpec(const FileSpec *rhs)
> > //------------------------------------------------------------------
> > FileSpec::~FileSpec() {}
> >
> > -namespace {
> > -//------------------------------------------------------------------
> > -/// Safely get a character at the specified index.
> > -///
> > -/// @param[in] path
> > -/// A full, partial, or relative path to a file.
> > -///
> > -/// @param[in] i
> > -/// An index into path which may or may not be valid.
> > -///
> > -/// @return
> > -/// The character at index \a i if the index is valid, or 0 if
> > -/// the index is not valid.
> > -//------------------------------------------------------------------
> > -inline char safeCharAtIndex(const llvm::StringRef &path, size_t i) {
> > - if (i < path.size())
> > - return path[i];
> > - return 0;
> > -}
> > -
> > -//------------------------------------------------------------------
> > -/// Check if a path needs to be normalized.
> > -///
> > -/// Check if a path needs to be normalized. We currently consider a
> > -/// path to need normalization if any of the following are true
> > -/// - path contains "/./"
> > -/// - path contains "/../"
> > -/// - path contains "//"
> > -/// - path ends with "/"
> > -/// Paths that start with "./" or with "../" are not considered to
> > -/// need normalization since we aren't trying to resolve the path,
> > -/// we are just trying to remove redundant things from the path.
> > -///
> > -/// @param[in] path
> > -/// A full, partial, or relative path to a file.
> > -///
> > -/// @return
> > -/// Returns \b true if the path needs to be normalized.
> > -//------------------------------------------------------------------
> > -bool needsNormalization(const llvm::StringRef &path) {
> > - if (path.empty())
> > - return false;
> > - // We strip off leading "." values so these paths need to be
> normalized
> > - if (path[0] == '.')
> > - return true;
> > - for (auto i = path.find_first_of("\\/"); i != llvm::StringRef::npos;
> > - i = path.find_first_of("\\/", i + 1)) {
> > - const auto next = safeCharAtIndex(path, i+1);
> > - switch (next) {
> > - case 0:
> > - // path separator char at the end of the string which should be
> > - // stripped unless it is the one and only character
> > - return i > 0;
> > - case '/':
> > - case '\\':
> > - // two path separator chars in the middle of a path needs to be
> > - // normalized
> > - if (i > 0)
> > - return true;
> > - ++i;
> > - break;
> > -
> > - case '.': {
> > - const auto next_next = safeCharAtIndex(path, i+2);
> > - switch (next_next) {
> > - default: break;
> > - case 0: return true; // ends with "/."
> > - case '/':
> > - case '\\':
> > - return true; // contains "/./"
> > - case '.': {
> > - const auto next_next_next = safeCharAtIndex(path, i+3);
> > - switch (next_next_next) {
> > - default: break;
> > - case 0: return true; // ends with "/.."
> > - case '/':
> > - case '\\':
> > - return true; // contains "/../"
> > - }
> > - break;
> > - }
> > - }
> > - }
> > - break;
> > -
> > - default:
> > - break;
> > - }
> > - }
> > - return false;
> > -}
> > -
> > -
> > -}
> > //------------------------------------------------------------------
> > // Assignment operator.
> > //------------------------------------------------------------------
> > @@ -252,8 +158,7 @@ void FileSpec::SetFile(llvm::StringRef p
> > }
> >
> > // Normalize the path by removing ".", ".." and other redundant
> components.
> > - if (needsNormalization(resolved))
> > - llvm::sys::path::remove_dots(resolved, true, m_style);
> > + llvm::sys::path::remove_dots(resolved, true, m_style);
> >
> > // Normalize back slashes to forward slashes
> > if (m_style == Style::windows)
> > @@ -270,10 +175,10 @@ void FileSpec::SetFile(llvm::StringRef p
> > // Split path into filename and directory. We rely on the underlying
> char
> > // pointer to be nullptr when the components are empty.
> > llvm::StringRef filename = llvm::sys::path::filename(resolved,
> m_style);
> > - if(!filename.empty())
> > + if (!filename.empty())
> > m_filename.SetString(filename);
> > llvm::StringRef directory = llvm::sys::path::parent_path(resolved,
> m_style);
> > - if(!directory.empty())
> > + if (!directory.empty())
> > m_directory.SetString(directory);
> > }
> >
> > @@ -424,9 +329,8 @@ bool FileSpec::Equal(const FileSpec &a,
> > // case sensitivity of equality test
> > const bool case_sensitive = a.IsCaseSensitive() ||
> b.IsCaseSensitive();
> >
> > - const bool filenames_equal = ConstString::Equals(a.m_filename,
> > - b.m_filename,
> > - case_sensitive);
> > + const bool filenames_equal =
> > + ConstString::Equals(a.m_filename, b.m_filename, case_sensitive);
> >
> > if (!filenames_equal)
> > return false;
> > @@ -712,9 +616,7 @@ bool FileSpec::IsSourceImplementationFil
> > return g_source_file_regex.Execute(extension.GetStringRef());
> > }
> >
> > -bool FileSpec::IsRelative() const {
> > - return !IsAbsolute();
> > -}
> > +bool FileSpec::IsRelative() const { return !IsAbsolute(); }
> >
> > bool FileSpec::IsAbsolute() const {
> > llvm::SmallString<64> current_path;
> >
> >
> > _______________________________________________
> > lldb-commits mailing list
> > lldb-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20180625/15c18588/attachment-0001.html>
More information about the lldb-commits
mailing list