diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2015-07-31 00:58:32 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2015-07-31 00:58:32 +0000 |
| commit | c56419ed008706801749b151672ed88bfab855f2 (patch) | |
| tree | c4a2083d284ca681444560ee64c514e2c91eddd8 | |
| parent | 532a13691c97c60387e6b0d0e1e88a6d92dbc555 (diff) | |
| download | bcm5719-llvm-c56419ed008706801749b151672ed88bfab855f2.tar.gz bcm5719-llvm-c56419ed008706801749b151672ed88bfab855f2.zip | |
[modules] Fix issue where building a module from a relative path when -working-directory option is set, results in error.
The error was "module '<name>' was built in directory '<path>' but now resides in directory '<path>'
rdar://21330027
llvm-svn: 243718
6 files changed, 39 insertions, 12 deletions
diff --git a/clang/include/clang/Basic/FileManager.h b/clang/include/clang/Basic/FileManager.h index a08d3c894f1..219422b9c73 100644 --- a/clang/include/clang/Basic/FileManager.h +++ b/clang/include/clang/Basic/FileManager.h @@ -254,7 +254,13 @@ public: /// \brief If path is not absolute and FileSystemOptions set the working /// directory, the path is modified to be relative to the given /// working directory. - void FixupRelativePath(SmallVectorImpl<char> &path) const; + /// \returns true if \c path changed. + bool FixupRelativePath(SmallVectorImpl<char> &path) const; + + /// Makes \c Path absolute taking into account FileSystemOptions and the + /// working directory option. + /// \returns true if \c Path changed to absolute. + bool makeAbsolutePath(SmallVectorImpl<char> &Path) const; /// \brief Produce an array mapping from the unique IDs assigned to each /// file to the corresponding FileEntry pointer. diff --git a/clang/lib/Basic/FileManager.cpp b/clang/lib/Basic/FileManager.cpp index 4c84f1b6ad2..034ebc5c88b 100644 --- a/clang/lib/Basic/FileManager.cpp +++ b/clang/lib/Basic/FileManager.cpp @@ -389,16 +389,28 @@ FileManager::getVirtualFile(StringRef Filename, off_t Size, return UFE; } -void FileManager::FixupRelativePath(SmallVectorImpl<char> &path) const { +bool FileManager::FixupRelativePath(SmallVectorImpl<char> &path) const { StringRef pathRef(path.data(), path.size()); if (FileSystemOpts.WorkingDir.empty() || llvm::sys::path::is_absolute(pathRef)) - return; + return false; SmallString<128> NewPath(FileSystemOpts.WorkingDir); llvm::sys::path::append(NewPath, pathRef); path = NewPath; + return true; +} + +bool FileManager::makeAbsolutePath(SmallVectorImpl<char> &Path) const { + bool Changed = FixupRelativePath(Path); + + if (!llvm::sys::path::is_absolute(StringRef(Path.data(), Path.size()))) { + llvm::sys::fs::make_absolute(Path); + Changed = true; + } + + return Changed; } llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index f1c907394bf..f21b173c1dd 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -1074,14 +1074,7 @@ void ASTWriter::WriteBlockInfoBlock() { /// \return \c true if the path was changed. static bool cleanPathForOutput(FileManager &FileMgr, SmallVectorImpl<char> &Path) { - bool Changed = false; - - if (!llvm::sys::path::is_absolute(StringRef(Path.data(), Path.size()))) { - llvm::sys::fs::make_absolute(Path); - Changed = true; - } - - return Changed | FileMgr.removeDotPaths(Path); + return FileMgr.makeAbsolutePath(Path) | FileMgr.removeDotPaths(Path); } /// \brief Adjusts the given filename to only write out the portion of the @@ -1429,7 +1422,7 @@ void ASTWriter::WriteControlBlock(Preprocessor &PP, ASTContext &Context, SmallString<128> OutputPath(OutputFile); - llvm::sys::fs::make_absolute(OutputPath); + SM.getFileManager().makeAbsolutePath(OutputPath); StringRef origDir = llvm::sys::path::parent_path(OutputPath); RecordData Record; diff --git a/clang/test/Modules/Inputs/working-dir-test/Test.framework/Headers/Test.h b/clang/test/Modules/Inputs/working-dir-test/Test.framework/Headers/Test.h new file mode 100644 index 00000000000..ecc54bfc725 --- /dev/null +++ b/clang/test/Modules/Inputs/working-dir-test/Test.framework/Headers/Test.h @@ -0,0 +1 @@ +void test_me_call(void); diff --git a/clang/test/Modules/Inputs/working-dir-test/Test.framework/Modules/module.modulemap b/clang/test/Modules/Inputs/working-dir-test/Test.framework/Modules/module.modulemap new file mode 100644 index 00000000000..3040ac722f9 --- /dev/null +++ b/clang/test/Modules/Inputs/working-dir-test/Test.framework/Modules/module.modulemap @@ -0,0 +1,6 @@ +framework module Test { + umbrella header "Test.h" + + export * + module * { export * } +} diff --git a/clang/test/Modules/working-dir-flag.m b/clang/test/Modules/working-dir-flag.m new file mode 100644 index 00000000000..0e258c0d2fe --- /dev/null +++ b/clang/test/Modules/working-dir-flag.m @@ -0,0 +1,9 @@ +// RUN: rm -rf %t.mcp +// RUN: %clang_cc1 -fmodules-cache-path=%t.mcp -fmodules -fimplicit-module-maps -F . -working-directory=%S/Inputs/working-dir-test %s -verify +// expected-no-diagnostics + +@import Test; + +void foo() { + test_me_call(); +} |

