summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2015-07-31 00:58:32 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2015-07-31 00:58:32 +0000
commitc56419ed008706801749b151672ed88bfab855f2 (patch)
treec4a2083d284ca681444560ee64c514e2c91eddd8
parent532a13691c97c60387e6b0d0e1e88a6d92dbc555 (diff)
downloadbcm5719-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
-rw-r--r--clang/include/clang/Basic/FileManager.h8
-rw-r--r--clang/lib/Basic/FileManager.cpp16
-rw-r--r--clang/lib/Serialization/ASTWriter.cpp11
-rw-r--r--clang/test/Modules/Inputs/working-dir-test/Test.framework/Headers/Test.h1
-rw-r--r--clang/test/Modules/Inputs/working-dir-test/Test.framework/Modules/module.modulemap6
-rw-r--r--clang/test/Modules/working-dir-flag.m9
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();
+}
OpenPOWER on IntegriCloud