Author: spyffe Date: Fri Sep 18 16:39:31 2015 New Revision: 248048 URL: http://llvm.org/viewvc/llvm-project?rev=248048&view=rev Log: Added support for resolving symbolic links to FileSpec.
We use the symbolic link to resolver to find the target of the LLDB shlib symlink if there is a symlink. This allows us to find shlib-relative resources even when running under the testsuite, where _lldb.so is a symlink in the Python resource directory. Also changed a comment to be slightly more clear about what resolve_path in the constructor for FileSpec means, since if we were actually using realpath() this code wouldn't have been necessary. http://reviews.llvm.org/D12984 Modified: lldb/trunk/include/lldb/Host/FileSpec.h lldb/trunk/source/Host/common/FileSpec.cpp lldb/trunk/source/Host/common/HostInfoBase.cpp Modified: lldb/trunk/include/lldb/Host/FileSpec.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Host/FileSpec.h?rev=248048&r1=248047&r2=248048&view=diff ============================================================================== --- lldb/trunk/include/lldb/Host/FileSpec.h (original) +++ lldb/trunk/include/lldb/Host/FileSpec.h Fri Sep 18 16:39:31 2015 @@ -73,7 +73,7 @@ public: /// The full or partial path to a file. /// /// @param[in] resolve_path - /// If \b true, then we resolve the path with realpath, + /// If \b true, then we resolve the path, removing stray ../.. and so forth, /// if \b false we trust the path is in canonical form already. /// /// @see FileSpec::SetFile (const char *path, bool resolve) @@ -511,6 +511,9 @@ public: bool IsSymbolicLink () const; + + FileSpec + ResolveSymbolicLink () const; //------------------------------------------------------------------ /// Get the memory cost of this object. Modified: lldb/trunk/source/Host/common/FileSpec.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/FileSpec.cpp?rev=248048&r1=248047&r2=248048&view=diff ============================================================================== --- lldb/trunk/source/Host/common/FileSpec.cpp (original) +++ lldb/trunk/source/Host/common/FileSpec.cpp Fri Sep 18 16:39:31 2015 @@ -811,6 +811,32 @@ FileSpec::IsSymbolicLink () const #endif } +FileSpec +FileSpec::ResolveSymbolicLink () const { + if (!IsSymbolicLink()) + { + return *this; + } + + char resolved_path[PATH_MAX]; + if (!GetPath (resolved_path, sizeof (resolved_path))) + { + return *this; + } + +#ifdef _WIN32 + return *this; // TODO make this work on win32 +#else + char real_path[PATH_MAX + 1]; + if (realpath(resolved_path, real_path) == nullptr) + { + return *this; + } + + return FileSpec(real_path, false); +#endif +} + uint32_t FileSpec::GetPermissions () const { Modified: lldb/trunk/source/Host/common/HostInfoBase.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/HostInfoBase.cpp?rev=248048&r1=248047&r2=248048&view=diff ============================================================================== --- lldb/trunk/source/Host/common/HostInfoBase.cpp (original) +++ lldb/trunk/source/Host/common/HostInfoBase.cpp Fri Sep 18 16:39:31 2015 @@ -306,7 +306,10 @@ HostInfoBase::ComputeSharedLibraryDirect FileSpec lldb_file_spec( Host::GetModuleFileSpecForHostAddress(reinterpret_cast<void *>(reinterpret_cast<intptr_t>(HostInfoBase::GetLLDBPath)))); - + + // This is necessary because when running the testsuite the shlib might be a symbolic link inside the Python resource dir. + lldb_file_spec = lldb_file_spec.ResolveSymbolicLink(); + // Remove the filename so that this FileSpec only represents the directory. file_spec.GetDirectory() = lldb_file_spec.GetDirectory(); _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits