Make -save-temps behave like in GCC 4.5.

The -save-temps option now behaves like described in GCC 4.5 release notes
(you can specify output directory for temporary files with -save-temps=obj
-o $DIRNAME). I do not have GCC 4.5 installed, so if there are any
inconsistencies between llvmc and GCC in the implementation of this
feature, please let me know.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74190 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Mikhail Glushenkov 2009-06-25 18:20:10 +00:00
parent 3ea93ded0f
commit 7defa2d3d5
5 changed files with 77 additions and 22 deletions

View File

@ -0,0 +1,33 @@
//===--- BuiltinOptions.h - The LLVM Compiler Driver ------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open
// Source License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Declarations of all global command-line option variables.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_INCLUDE_COMPILER_DRIVER_BUILTIN_OPTIONS_H
#define LLVM_INCLUDE_COMPILER_DRIVER_BUILTIN_OPTIONS_H
#include "llvm/Support/CommandLine.h"
#include <string>
namespace SaveTempsEnum { enum Values { Cwd, Obj, Unset }; }
extern llvm::cl::list<std::string> InputFilenames;
extern llvm::cl::opt<std::string> OutputFilename;
extern llvm::cl::list<std::string> Languages;
extern llvm::cl::opt<bool> DryRun;
extern llvm::cl::opt<bool> VerboseMode;
extern llvm::cl::opt<bool> CheckGraph;
extern llvm::cl::opt<bool> WriteGraph;
extern llvm::cl::opt<bool> ViewGraph;
extern llvm::cl::opt<SaveTempsEnum::Values> SaveTemps;
#endif // LLVM_INCLUDE_COMPILER_DRIVER_BUILTIN_OPTIONS_H

View File

@ -17,6 +17,7 @@
#ifndef LLVM_INCLUDE_COMPILER_DRIVER_MAIN_INC
#define LLVM_INCLUDE_COMPILER_DRIVER_MAIN_INC
#include "llvm/CompilerDriver/BuiltinOptions.h"
#include "llvm/CompilerDriver/CompilationGraph.h"
#include "llvm/CompilerDriver/Error.h"
#include "llvm/CompilerDriver/ForceLinkage.h"
@ -58,27 +59,56 @@ cl::opt<bool> WriteGraph("write-graph",
cl::opt<bool> ViewGraph("view-graph",
cl::desc("Show compilation graph in GhostView"),
cl::Hidden);
cl::opt<bool> SaveTemps("save-temps",
cl::desc("Keep temporary files"),
cl::Hidden);
cl::opt<SaveTempsEnum::Values> SaveTemps
("save-temps", cl::desc("Keep temporary files"),
cl::init(SaveTempsEnum::Unset),
cl::values(clEnumValN(SaveTempsEnum::Obj, "obj",
"Save files in the directory specified with -o"),
clEnumValN(SaveTempsEnum::Cwd, "cwd",
"Use current working directory"),
clEnumValN(SaveTempsEnum::Obj, "", "Same as 'cwd'"),
clEnumValEnd),
cl::ValueOptional);
namespace {
sys::Path getTempDir() {
sys::Path tempDir;
// GCC 4.5-style -save-temps handling.
if (SaveTemps == SaveTempsEnum::Unset) {
tempDir = sys::Path::GetTemporaryDirectory();
}
else if (SaveTemps == SaveTempsEnum::Obj && !OutputFilename.empty()) {
tempDir = OutputFilename;
if (!tempDir.exists()) {
std::string ErrMsg;
if (tempDir.createDirectoryOnDisk(true, &ErrMsg))
throw std::runtime_error(ErrMsg);
}
}
// else if (SaveTemps == Cwd) -> use current dir (leave tempDir empty)
return tempDir;
}
/// BuildTargets - A small wrapper for CompilationGraph::Build.
int BuildTargets(CompilationGraph& graph, const LanguageMap& langMap) {
int ret;
const sys::Path& tempDir = SaveTemps
? sys::Path("")
: sys::Path(sys::Path::GetTemporaryDirectory());
const sys::Path& tempDir = getTempDir();
try {
ret = graph.Build(tempDir, langMap);
}
catch(...) {
tempDir.eraseFromDisk(true);
if (SaveTemps == SaveTempsEnum::Unset)
tempDir.eraseFromDisk(true);
throw;
}
if (!SaveTemps)
if (SaveTemps == SaveTempsEnum::Unset)
tempDir.eraseFromDisk(true);
return ret;
}

View File

@ -12,8 +12,8 @@
//===----------------------------------------------------------------------===//
#include "llvm/CompilerDriver/Action.h"
#include "llvm/CompilerDriver/BuiltinOptions.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/System/Program.h"
#include <iostream>
@ -22,9 +22,6 @@
using namespace llvm;
using namespace llvmc;
extern cl::opt<bool> DryRun;
extern cl::opt<bool> VerboseMode;
namespace {
int ExecuteProgram(const std::string& name,
const StrVector& args) {

View File

@ -11,11 +11,11 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/CompilerDriver/BuiltinOptions.h"
#include "llvm/CompilerDriver/CompilationGraph.h"
#include "llvm/CompilerDriver/Error.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/DOTGraphTraits.h"
#include "llvm/Support/GraphWriter.h"
@ -30,9 +30,6 @@
using namespace llvm;
using namespace llvmc;
extern cl::list<std::string> InputFilenames;
extern cl::list<std::string> Languages;
namespace llvmc {
const std::string& LanguageMap::GetLanguage(const sys::Path& File) const {
@ -477,7 +474,7 @@ namespace llvm {
{
template<typename GraphType>
static std::string getNodeLabel(const Node* N, const GraphType&,
static std::string getNodeLabel(const Node* N, const GraphType&,
bool ShortNames)
{
if (N->ToolPtr)

View File

@ -11,16 +11,14 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/CompilerDriver/BuiltinOptions.h"
#include "llvm/CompilerDriver/Tool.h"
#include "llvm/System/Path.h"
#include "llvm/Support/CommandLine.h"
using namespace llvm;
using namespace llvmc;
extern cl::opt<std::string> OutputFilename;
namespace {
sys::Path MakeTempFile(const sys::Path& TempDir, const std::string& BaseName,
const std::string& Suffix) {
@ -39,7 +37,7 @@ namespace {
// NOTE: makeUnique always *creates* a unique temporary file,
// which is good, since there will be no races. However, some
// tools do not like it when the output file already exists, so
// they have to be placated with -f or something like that.
// they need to be placated with -f or something like that.
Out.makeUnique(true, NULL);
return Out;
}
@ -52,7 +50,7 @@ sys::Path Tool::OutFilename(const sys::Path& In,
sys::Path Out;
if (StopCompilation) {
if (!OutputFilename.empty()) {
if (!OutputFilename.empty() && SaveTemps != SaveTempsEnum::Obj ) {
Out.set(OutputFilename);
}
else if (IsJoin()) {