mirror of https://github.com/microsoft/clang.git
[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:
parent
d50fd8aa0d
commit
b1716d63b0
|
@ -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.
|
||||
|
|
|
@ -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>>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
void test_me_call(void);
|
|
@ -0,0 +1,6 @@
|
|||
framework module Test {
|
||||
umbrella header "Test.h"
|
||||
|
||||
export *
|
||||
module * { export * }
|
||||
}
|
|
@ -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();
|
||||
}
|
Loading…
Reference in New Issue