From fe87fc73c0091a8d6ba04b7e3b5f144d4a0517a3 Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Fri, 26 Aug 2011 21:28:44 +0000 Subject: [PATCH] [driver] When generating temporary files allow a prefix to be added. In many cases we want the prefix to be the original file name less the suffix. For an input such as test.c to named temporary would be something like test-3O4Clq.o Part of git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@138662 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Driver/Driver.h | 6 +++--- lib/Driver/Driver.cpp | 22 +++++++++++++++++----- lib/Driver/Tools.cpp | 4 ++-- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/include/clang/Driver/Driver.h b/include/clang/Driver/Driver.h index e979146724..2145d724c3 100644 --- a/include/clang/Driver/Driver.h +++ b/include/clang/Driver/Driver.h @@ -373,11 +373,11 @@ public: const char *BaseInput, bool AtTopLevel) const; - /// GetTemporaryPath - Return the pathname of a temporary file to - /// use as part of compilation; the file will have the given suffix. + /// GetTemporaryPath - Return the pathname of a temporary file to use + /// as part of compilation; the file will have the given prefix and suffix. /// /// GCC goes to extra lengths here to be a bit more robust. - std::string GetTemporaryPath(const char *Suffix) const; + std::string GetTemporaryPath(const char *Prefix, const char *Suffix) const; /// GetHostInfo - Construct a new host info object for the given /// host triple. diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 2baed75e0c..acdfdc21a2 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -1335,6 +1335,15 @@ void Driver::BuildJobsForAction(Compilation &C, } } +// Strip the directory and suffix from BaseInput. +static const char *getBaseName (const char *BaseInput) { + std::pair Split = StringRef(BaseInput).rsplit('/'); + if (Split.second != "") + return Split.second.split('.').first.str().c_str(); + else + return Split.first.split('.').first.str().c_str(); +} + const char *Driver::GetNamedOutputPath(Compilation &C, const JobAction &JA, const char *BaseInput, @@ -1355,7 +1364,8 @@ const char *Driver::GetNamedOutputPath(Compilation &C, if ((!AtTopLevel && !C.getArgs().hasArg(options::OPT_save_temps)) || CCGenDiagnostics) { std::string TmpName = - GetTemporaryPath(types::getTypeTempSuffix(JA.getType())); + GetTemporaryPath(getBaseName(BaseInput), + types::getTypeTempSuffix(JA.getType())); return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str())); } @@ -1388,9 +1398,10 @@ const char *Driver::GetNamedOutputPath(Compilation &C, // If we're saving temps and the temp filename conflicts with the input // filename, then avoid overwriting input file. if (!AtTopLevel && C.getArgs().hasArg(options::OPT_save_temps) && - NamedOutput == BaseName) { + NamedOutput == BaseName) { std::string TmpName = - GetTemporaryPath(types::getTypeTempSuffix(JA.getType())); + GetTemporaryPath(getBaseName(BaseInput), + types::getTypeTempSuffix(JA.getType())); return C.addTempFile(C.getArgs().MakeArgString(TmpName.c_str())); } @@ -1475,7 +1486,8 @@ std::string Driver::GetProgramPath(const char *Name, const ToolChain &TC, return Name; } -std::string Driver::GetTemporaryPath(const char *Suffix) const { +std::string Driver::GetTemporaryPath(const char *Prefix, const char *Suffix) + const { // FIXME: This is lame; sys::Path should provide this function (in particular, // it should know how to find the temporary files dir). std::string Error; @@ -1487,7 +1499,7 @@ std::string Driver::GetTemporaryPath(const char *Suffix) const { if (!TmpDir) TmpDir = "/tmp"; llvm::sys::Path P(TmpDir); - P.appendComponent("cc"); + P.appendComponent(Prefix); if (P.makeUnique(false, &Error)) { Diag(clang::diag::err_drv_unable_to_make_temp) << Error; return ""; diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index d91285b0a8..22747e4c8f 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -2983,7 +2983,7 @@ void darwin::Compile::ConstructJob(Compilation &C, const JobAction &JA, // NOTE: gcc uses a temp .s file for this, but there doesn't seem // to be a good reason. const char *TmpPath = C.getArgs().MakeArgString( - D.GetTemporaryPath("s")); + D.GetTemporaryPath("cc", "s")); C.addTempFile(TmpPath); CmdArgs.push_back(TmpPath); @@ -3125,7 +3125,7 @@ void darwin::Link::AddLinkArgs(Compilation &C, // dsymutil step. if (Version[0] >= 116 && D.IsUsingLTO(Args)) { const char *TmpPath = C.getArgs().MakeArgString( - D.GetTemporaryPath(types::getTypeTempSuffix(types::TY_Object))); + D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object))); C.addTempFile(TmpPath); CmdArgs.push_back("-object_path_lto"); CmdArgs.push_back(TmpPath); -- 2.50.1