blob: 5a32fd33c3eec86aac42e1afbb7e73eb8587302f [file] [log] [blame]
Mikhail Glushenkovf9152532008-12-07 16:41:11 +00001//===--- Tool.cpp - The LLVM Compiler Driver --------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open
6// Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Tool base class - implementation details.
11//
12//===----------------------------------------------------------------------===//
13
Mikhail Glushenkov7defa2d2009-06-25 18:20:10 +000014#include "llvm/CompilerDriver/BuiltinOptions.h"
Mikhail Glushenkovf9152532008-12-07 16:41:11 +000015#include "llvm/CompilerDriver/Tool.h"
16
Mikhail Glushenkov95c1f5b2009-06-29 03:09:15 +000017#include "llvm/ADT/StringExtras.h"
Mikhail Glushenkovf9152532008-12-07 16:41:11 +000018#include "llvm/System/Path.h"
Mikhail Glushenkovf9152532008-12-07 16:41:11 +000019
20using namespace llvm;
21using namespace llvmc;
22
Mikhail Glushenkov95c1f5b2009-06-29 03:09:15 +000023// SplitString is used by derived Tool classes.
24typedef void (*SplitStringFunPtr)(const std::string&,
25 std::vector<std::string>&, const char*);
26SplitStringFunPtr ForceLinkageSplitString = &llvm::SplitString;
27
Mikhail Glushenkovf9152532008-12-07 16:41:11 +000028namespace {
29 sys::Path MakeTempFile(const sys::Path& TempDir, const std::string& BaseName,
30 const std::string& Suffix) {
31 sys::Path Out;
32
33 // Make sure we don't end up with path names like '/file.o' if the
34 // TempDir is empty.
35 if (TempDir.empty()) {
36 Out.set(BaseName);
37 }
38 else {
39 Out = TempDir;
40 Out.appendComponent(BaseName);
41 }
42 Out.appendSuffix(Suffix);
43 // NOTE: makeUnique always *creates* a unique temporary file,
44 // which is good, since there will be no races. However, some
45 // tools do not like it when the output file already exists, so
Mikhail Glushenkov7defa2d2009-06-25 18:20:10 +000046 // they need to be placated with -f or something like that.
Mikhail Glushenkovf9152532008-12-07 16:41:11 +000047 Out.makeUnique(true, NULL);
48 return Out;
49 }
50}
51
52sys::Path Tool::OutFilename(const sys::Path& In,
53 const sys::Path& TempDir,
54 bool StopCompilation,
55 const char* OutputSuffix) const {
56 sys::Path Out;
57
58 if (StopCompilation) {
Mikhail Glushenkoveebf60c2009-07-04 14:23:32 +000059 if (!OutputFilename.empty()) {
Mikhail Glushenkovf9152532008-12-07 16:41:11 +000060 Out.set(OutputFilename);
61 }
62 else if (IsJoin()) {
63 Out.set("a");
64 Out.appendSuffix(OutputSuffix);
65 }
66 else {
67 Out.set(In.getBasename());
68 Out.appendSuffix(OutputSuffix);
69 }
70 }
71 else {
72 if (IsJoin())
73 Out = MakeTempFile(TempDir, "tmp", OutputSuffix);
74 else
75 Out = MakeTempFile(TempDir, In.getBasename(), OutputSuffix);
76 }
77 return Out;
78}