diff options
| author | Haojian Wu <hokein@google.com> | 2016-10-12 15:50:30 +0000 |
|---|---|---|
| committer | Haojian Wu <hokein@google.com> | 2016-10-12 15:50:30 +0000 |
| commit | db72657774adfca2dc42354f2416a6fdb684e98d (patch) | |
| tree | 3c612ad3d34f092e5592c8f4ff4c1e4523f0d8b4 /clang-tools-extra/clang-move/ClangMove.cpp | |
| parent | 84ebbdaf403fa5fb2ab13e9c247c0653617ecfe4 (diff) | |
| download | bcm5719-llvm-db72657774adfca2dc42354f2416a6fdb684e98d.tar.gz bcm5719-llvm-db72657774adfca2dc42354f2416a6fdb684e98d.zip | |
[clang-move] Compare with real paths of symlinks
Summary: MakeAbsolutePath does wrong things with symlinks previously. When comparing with a symlink, we need to compare with the real path of it. This fixes issues when the build directory is a symlink.
Reviewers: ioeric
Subscribers: beanz, mgorny, cfe-commits, bkramer
Differential Revision: https://reviews.llvm.org/D25508
llvm-svn: 284020
Diffstat (limited to 'clang-tools-extra/clang-move/ClangMove.cpp')
| -rw-r--r-- | clang-tools-extra/clang-move/ClangMove.cpp | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/clang-tools-extra/clang-move/ClangMove.cpp b/clang-tools-extra/clang-move/ClangMove.cpp index c60b5e583ca..fe19fa0065f 100644 --- a/clang-tools-extra/clang-move/ClangMove.cpp +++ b/clang-tools-extra/clang-move/ClangMove.cpp @@ -51,8 +51,18 @@ std::string MakeAbsolutePath(const SourceManager& SM, StringRef Path) { SM.getFileManager().getVirtualFileSystem()->makeAbsolute(AbsolutePath)) llvm::errs() << "Warning: could not make absolute file: '" << EC.message() << '\n'; - llvm::sys::path::remove_dots(AbsolutePath, /*remove_dot_dot=*/true); - llvm::sys::path::native(AbsolutePath); + // Handle symbolic link path cases. + // We are trying to get the real file path of the symlink. + const DirectoryEntry *Dir = SM.getFileManager().getDirectory( + llvm::sys::path::parent_path(AbsolutePath.str())); + if (Dir) { + StringRef DirName = SM.getFileManager().getCanonicalName(Dir); + SmallVector<char, 128> AbsoluteFilename; + llvm::sys::path::append(AbsoluteFilename, DirName, + llvm::sys::path::filename(AbsolutePath.str())); + return llvm::StringRef(AbsoluteFilename.data(), AbsoluteFilename.size()) + .str(); + } return AbsolutePath.str(); } @@ -382,24 +392,27 @@ void ClangMoveTool::addIncludes(llvm::StringRef IncludeHeader, llvm::StringRef SearchPath, llvm::StringRef FileName, const SourceManager& SM) { - auto AbsoluteSearchPath = MakeAbsolutePath(SM, SearchPath); + SmallVector<char, 128> HeaderWithSearchPath; + llvm::sys::path::append(HeaderWithSearchPath, SearchPath, IncludeHeader); + std::string AbsoluteOldHeader = + MakeAbsolutePath(OriginalRunningDirectory, Spec.OldHeader); // FIXME: Add old.h to the new.cc/h when the new target has dependencies on // old.h/c. For instance, when moved class uses another class defined in // old.h, the old.h should be added in new.h. - if (MakeAbsolutePath(OriginalRunningDirectory, Spec.OldHeader) == - MakeAbsolutePath(AbsoluteSearchPath, IncludeHeader)) + if (AbsoluteOldHeader == + MakeAbsolutePath(SM, llvm::StringRef(HeaderWithSearchPath.data(), + HeaderWithSearchPath.size()))) return; std::string IncludeLine = IsAngled ? ("#include <" + IncludeHeader + ">\n").str() : ("#include \"" + IncludeHeader + "\"\n").str(); - std::string AbsolutePath = MakeAbsolutePath(SM, FileName); - if (MakeAbsolutePath(OriginalRunningDirectory, Spec.OldHeader) == - AbsolutePath) { + std::string AbsoluteCurrentFile = MakeAbsolutePath(SM, FileName); + if (AbsoluteOldHeader == AbsoluteCurrentFile) { HeaderIncludes.push_back(IncludeLine); } else if (MakeAbsolutePath(OriginalRunningDirectory, Spec.OldCC) == - AbsolutePath) { + AbsoluteCurrentFile) { CCIncludes.push_back(IncludeLine); } } |

