From: Chad Rosier Date: Fri, 20 Apr 2012 20:05:08 +0000 (+0000) Subject: In r135308, -save-temps was modified to prevent a temporary file from X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=61ada0a7a8e743a50f5f8305e2e49d4447212a69;p=clang 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 --- diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index c293b7fab6..0465827ed2 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -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 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 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.