[Lldb-commits] [lldb] r335432 - [FileSpec] Always normalize
Pavel Labath via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 25 01:59:31 PDT 2018
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
More information about the lldb-commits
mailing list