Compilation.h revision 6af966266235cae3287d50f1a10072bc48759ba0
1//===--- Compilation.h - Compilation Task Data Structure --------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef CLANG_DRIVER_COMPILATION_H_
11#define CLANG_DRIVER_COMPILATION_H_
12
13#include "clang/Driver/Job.h"
14#include "clang/Driver/Util.h"
15
16#include "llvm/ADT/DenseMap.h"
17
18namespace llvm {
19  class raw_ostream;
20}
21
22namespace clang {
23namespace driver {
24  class DerivedArgList;
25  class Driver;
26  class InputArgList;
27  class JobList;
28  class ToolChain;
29
30/// Compilation - A set of tasks to perform for a single driver
31/// invocation.
32class Compilation {
33  /// The driver we were created by.
34  const Driver &TheDriver;
35
36  /// The default tool chain.
37  const ToolChain &DefaultToolChain;
38
39  /// The original (untranslated) input argument list.
40  InputArgList *Args;
41
42  /// The driver translated arguments. Note that toolchains may perform their
43  /// own argument translation.
44  DerivedArgList *TranslatedArgs;
45
46  /// The list of actions.
47  ActionList Actions;
48
49  /// The root list of jobs.
50  JobList Jobs;
51
52  /// Cache of translated arguments for a particular tool chain and bound
53  /// architecture.
54  llvm::DenseMap<std::pair<const ToolChain*, const char*>,
55                 DerivedArgList*> TCArgs;
56
57  /// Temporary files which should be removed on exit.
58  ArgStringList TempFiles;
59
60  /// Result files which should be removed on failure.
61  ArgStringList ResultFiles;
62
63public:
64  Compilation(const Driver &D, const ToolChain &DefaultToolChain,
65              InputArgList *Args, DerivedArgList *TranslatedArgs);
66  ~Compilation();
67
68  const Driver &getDriver() const { return TheDriver; }
69
70  const ToolChain &getDefaultToolChain() const { return DefaultToolChain; }
71
72  const InputArgList &getInputArgs() const { return *Args; }
73
74  const DerivedArgList &getArgs() const { return *TranslatedArgs; }
75
76  ActionList &getActions() { return Actions; }
77  const ActionList &getActions() const { return Actions; }
78
79  JobList &getJobs() { return Jobs; }
80  const JobList &getJobs() const { return Jobs; }
81
82  void addCommand(Command *C) { Jobs.addJob(C); }
83
84  const ArgStringList &getTempFiles() const { return TempFiles; }
85
86  const ArgStringList &getResultFiles() const { return ResultFiles; }
87
88  /// getArgsForToolChain - Return the derived argument list for the
89  /// tool chain \arg TC (or the default tool chain, if TC is not
90  /// specified).
91  ///
92  /// \param BoundArch - The bound architecture name, or 0.
93  const DerivedArgList &getArgsForToolChain(const ToolChain *TC,
94                                            const char *BoundArch);
95
96  /// addTempFile - Add a file to remove on exit, and returns its
97  /// argument.
98  const char *addTempFile(const char *Name) {
99    TempFiles.push_back(Name);
100    return Name;
101  }
102
103  /// addResultFile - Add a file to remove on failure, and returns its
104  /// argument.
105  const char *addResultFile(const char *Name) {
106    ResultFiles.push_back(Name);
107    return Name;
108  }
109
110  /// CleanupFileList - Remove the files in the given list.
111  ///
112  /// \param IssueErrors - Report failures as errors.
113  /// \return Whether all files were removed successfully.
114  bool CleanupFileList(const ArgStringList &Files,
115                       bool IssueErrors=false) const;
116
117  /// PrintJob - Print one job in -### format.
118  ///
119  /// \param OS - The stream to print on.
120  /// \param J - The job to print.
121  /// \param Terminator - A string to print at the end of the line.
122  /// \param Quote - Should separate arguments be quoted.
123  void PrintJob(llvm::raw_ostream &OS, const Job &J,
124                const char *Terminator, bool Quote) const;
125
126  /// ExecuteCommand - Execute an actual command.
127  ///
128  /// \param FailingCommand - For non-zero results, this will be set to the
129  /// Command which failed, if any.
130  /// \return The result code of the subprocess.
131  int ExecuteCommand(const Command &C, const Command *&FailingCommand) const;
132
133  /// ExecuteJob - Execute a single job.
134  ///
135  /// \param FailingCommand - For non-zero results, this will be set to the
136  /// Command which failed.
137  /// \return The accumulated result code of the job.
138  int ExecuteJob(const Job &J, const Command *&FailingCommand) const;
139};
140
141} // end namespace driver
142} // end namespace clang
143
144#endif
145