[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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@243718 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Argyrios Kyrtzidis 2015-07-31 00:58:32 +00:00
parent d50fd8aa0d
commit b1716d63b0
6 changed files with 39 additions and 12 deletions

View File

@ -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.

View File

@ -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>>

View File

@ -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;

View File

@ -0,0 +1 @@
void test_me_call(void);

View File

@ -0,0 +1,6 @@
framework module Test {
umbrella header "Test.h"
export *
module * { export * }
}

View File

@ -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();
}