[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 <rdar://problem/8314451>

llvm-svn: 138662
This commit is contained in:
Chad Rosier 2011-08-26 21:28:44 +00:00
parent f337ae9477
commit 39ab743e59
3 changed files with 22 additions and 10 deletions

View File

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

View File

@ -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<StringRef, StringRef> 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()));
}
@ -1390,7 +1400,8 @@ const char *Driver::GetNamedOutputPath(Compilation &C,
if (!AtTopLevel && C.getArgs().hasArg(options::OPT_save_temps) &&
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 "";

View File

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