зеркало из https://github.com/microsoft/clang-1.git
In r135308, -save-temps was modified to prevent a temporary file from
overwriting the input file. For example, clang -c foo.s -o foo.o -save-temps Unfortunately, the original patch didn't compare the paths of the input and output files. Thus, something like the following would fail to create foo.s. cd /tmp/obj clang -c ../src/foo.s -o foo.o -save-temps rdar://11252615 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155224 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
704c8f76bb
Коммит
61ada0a7a8
|
@ -1468,15 +1468,24 @@ const char *Driver::GetNamedOutputPath(Compilation &C,
|
|||
NamedOutput = C.getArgs().MakeArgString(Suffixed.c_str());
|
||||
}
|
||||
|
||||
// If we're saving temps and the temp filename conflicts with the input
|
||||
// filename, then avoid overwriting input file.
|
||||
// If we're saving temps and the temp file conflicts with the input file,
|
||||
// then avoid overwriting input file.
|
||||
if (!AtTopLevel && C.getArgs().hasArg(options::OPT_save_temps) &&
|
||||
NamedOutput == BaseName) {
|
||||
StringRef Name = llvm::sys::path::filename(BaseInput);
|
||||
std::pair<StringRef, StringRef> Split = Name.split('.');
|
||||
std::string TmpName =
|
||||
GetTemporaryPath(Split.first, types::getTypeTempSuffix(JA.getType()));
|
||||
return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
|
||||
|
||||
bool SameFile = false;
|
||||
SmallString<256> Result;
|
||||
llvm::sys::fs::current_path(Result);
|
||||
llvm::sys::path::append(Result, BaseName);
|
||||
llvm::sys::fs::equivalent(BaseInput, Result.c_str(), SameFile);
|
||||
// Must share the same path to conflict.
|
||||
if (SameFile) {
|
||||
StringRef Name = llvm::sys::path::filename(BaseInput);
|
||||
std::pair<StringRef, StringRef> Split = Name.split('.');
|
||||
std::string TmpName =
|
||||
GetTemporaryPath(Split.first, types::getTypeTempSuffix(JA.getType()));
|
||||
return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
// As an annoying special case, PCH generation doesn't strip the pathname.
|
||||
|
|
Загрузка…
Ссылка в новой задаче