/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/Driver/Compilation.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===- Compilation.h - Compilation Task Data Structure ----------*- C++ -*-===// |
2 | | // |
3 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | | // See https://llvm.org/LICENSE.txt for license information. |
5 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | | // |
7 | | //===----------------------------------------------------------------------===// |
8 | | |
9 | | #ifndef LLVM_CLANG_DRIVER_COMPILATION_H |
10 | | #define LLVM_CLANG_DRIVER_COMPILATION_H |
11 | | |
12 | | #include "clang/Basic/LLVM.h" |
13 | | #include "clang/Driver/Action.h" |
14 | | #include "clang/Driver/Job.h" |
15 | | #include "clang/Driver/Util.h" |
16 | | #include "llvm/ADT/ArrayRef.h" |
17 | | #include "llvm/ADT/DenseMap.h" |
18 | | #include "llvm/ADT/Optional.h" |
19 | | #include "llvm/ADT/StringRef.h" |
20 | | #include "llvm/Option/Option.h" |
21 | | #include <cassert> |
22 | | #include <iterator> |
23 | | #include <map> |
24 | | #include <memory> |
25 | | #include <utility> |
26 | | #include <vector> |
27 | | |
28 | | namespace llvm { |
29 | | namespace opt { |
30 | | |
31 | | class DerivedArgList; |
32 | | class InputArgList; |
33 | | |
34 | | } // namespace opt |
35 | | } // namespace llvm |
36 | | |
37 | | namespace clang { |
38 | | namespace driver { |
39 | | |
40 | | class Driver; |
41 | | class ToolChain; |
42 | | |
43 | | /// Compilation - A set of tasks to perform for a single driver |
44 | | /// invocation. |
45 | | class Compilation { |
46 | | /// The driver we were created by. |
47 | | const Driver &TheDriver; |
48 | | |
49 | | /// The default tool chain. |
50 | | const ToolChain &DefaultToolChain; |
51 | | |
52 | | /// A mask of all the programming models the host has to support in the |
53 | | /// current compilation. |
54 | | unsigned ActiveOffloadMask = 0; |
55 | | |
56 | | /// Array with the toolchains of offloading host and devices in the order they |
57 | | /// were requested by the user. We are preserving that order in case the code |
58 | | /// generation needs to derive a programming-model-specific semantic out of |
59 | | /// it. |
60 | | std::multimap<Action::OffloadKind, const ToolChain *> |
61 | | OrderedOffloadingToolchains; |
62 | | |
63 | | /// The original (untranslated) input argument list. |
64 | | llvm::opt::InputArgList *Args; |
65 | | |
66 | | /// The driver translated arguments. Note that toolchains may perform their |
67 | | /// own argument translation. |
68 | | llvm::opt::DerivedArgList *TranslatedArgs; |
69 | | |
70 | | /// The list of actions we've created via MakeAction. This is not accessible |
71 | | /// to consumers; it's here just to manage ownership. |
72 | | std::vector<std::unique_ptr<Action>> AllActions; |
73 | | |
74 | | /// The list of actions. This is maintained and modified by consumers, via |
75 | | /// getActions(). |
76 | | ActionList Actions; |
77 | | |
78 | | /// The root list of jobs. |
79 | | JobList Jobs; |
80 | | |
81 | | /// Cache of translated arguments for a particular tool chain, bound |
82 | | /// architecture, and device offload kind. |
83 | | struct TCArgsKey final { |
84 | | const ToolChain *TC = nullptr; |
85 | | StringRef BoundArch; |
86 | | Action::OffloadKind DeviceOffloadKind = Action::OFK_None; |
87 | | |
88 | | TCArgsKey(const ToolChain *TC, StringRef BoundArch, |
89 | | Action::OffloadKind DeviceOffloadKind) |
90 | 105k | : TC(TC), BoundArch(BoundArch), DeviceOffloadKind(DeviceOffloadKind) {} |
91 | | |
92 | 116k | bool operator<(const TCArgsKey &K) const { |
93 | 116k | if (TC < K.TC) |
94 | 423 | return true; |
95 | 115k | else if (TC == K.TC && BoundArch < K.BoundArch115k ) |
96 | 533 | return true; |
97 | 115k | else if (TC == K.TC && BoundArch == K.BoundArch115k && |
98 | 115k | DeviceOffloadKind < K.DeviceOffloadKind114k ) |
99 | 122 | return true; |
100 | 115k | return false; |
101 | 116k | } |
102 | | }; |
103 | | std::map<TCArgsKey, llvm::opt::DerivedArgList *> TCArgs; |
104 | | |
105 | | /// Temporary files which should be removed on exit. |
106 | | llvm::opt::ArgStringList TempFiles; |
107 | | |
108 | | /// Result files which should be removed on failure. |
109 | | ArgStringMap ResultFiles; |
110 | | |
111 | | /// Result files which are generated correctly on failure, and which should |
112 | | /// only be removed if we crash. |
113 | | ArgStringMap FailureResultFiles; |
114 | | |
115 | | /// Optional redirection for stdin, stdout, stderr. |
116 | | std::vector<Optional<StringRef>> Redirects; |
117 | | |
118 | | /// Callback called after compilation job has been finished. |
119 | | /// Arguments of the callback are the compilation job as an instance of |
120 | | /// class Command and the exit status of the corresponding child process. |
121 | | std::function<void(const Command &, int)> PostCallback; |
122 | | |
123 | | /// Whether we're compiling for diagnostic purposes. |
124 | | bool ForDiagnostics = false; |
125 | | |
126 | | /// Whether an error during the parsing of the input args. |
127 | | bool ContainsError; |
128 | | |
129 | | /// Whether to keep temporary files regardless of -save-temps. |
130 | | bool ForceKeepTempFiles = false; |
131 | | |
132 | | public: |
133 | | Compilation(const Driver &D, const ToolChain &DefaultToolChain, |
134 | | llvm::opt::InputArgList *Args, |
135 | | llvm::opt::DerivedArgList *TranslatedArgs, bool ContainsError); |
136 | | ~Compilation(); |
137 | | |
138 | 349k | const Driver &getDriver() const { return TheDriver; } |
139 | | |
140 | 274k | const ToolChain &getDefaultToolChain() const { return DefaultToolChain; } |
141 | | |
142 | 47.4k | unsigned isOffloadingHostKind(Action::OffloadKind Kind) const { |
143 | 47.4k | return ActiveOffloadMask & Kind; |
144 | 47.4k | } |
145 | | |
146 | 44.2k | unsigned getActiveOffloadKinds() const { return ActiveOffloadMask; } |
147 | | |
148 | | /// Iterator that visits device toolchains of a given kind. |
149 | | using const_offload_toolchains_iterator = |
150 | | const std::multimap<Action::OffloadKind, |
151 | | const ToolChain *>::const_iterator; |
152 | | using const_offload_toolchains_range = |
153 | | std::pair<const_offload_toolchains_iterator, |
154 | | const_offload_toolchains_iterator>; |
155 | | |
156 | | template <Action::OffloadKind Kind> |
157 | 48.3k | const_offload_toolchains_range getOffloadToolChains() const { |
158 | 48.3k | return OrderedOffloadingToolchains.equal_range(Kind); |
159 | 48.3k | } std::__1::pair<std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const> clang::driver::Compilation::getOffloadToolChains<(clang::driver::Action::OffloadKind)1>() const Line | Count | Source | 157 | 513 | const_offload_toolchains_range getOffloadToolChains() const { | 158 | 513 | return OrderedOffloadingToolchains.equal_range(Kind); | 159 | 513 | } |
std::__1::pair<std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const> clang::driver::Compilation::getOffloadToolChains<(clang::driver::Action::OffloadKind)2>() const Line | Count | Source | 157 | 278 | const_offload_toolchains_range getOffloadToolChains() const { | 158 | 278 | return OrderedOffloadingToolchains.equal_range(Kind); | 159 | 278 | } |
std::__1::pair<std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const> clang::driver::Compilation::getOffloadToolChains<(clang::driver::Action::OffloadKind)8>() const Line | Count | Source | 157 | 109 | const_offload_toolchains_range getOffloadToolChains() const { | 158 | 109 | return OrderedOffloadingToolchains.equal_range(Kind); | 159 | 109 | } |
std::__1::pair<std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const, std::__1::__map_const_iterator<std::__1::__tree_const_iterator<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, std::__1::__tree_node<std::__1::__value_type<clang::driver::Action::OffloadKind, clang::driver::ToolChain const*>, void*>*, long> > const> clang::driver::Compilation::getOffloadToolChains<(clang::driver::Action::OffloadKind)4>() const Line | Count | Source | 157 | 47.4k | const_offload_toolchains_range getOffloadToolChains() const { | 158 | 47.4k | return OrderedOffloadingToolchains.equal_range(Kind); | 159 | 47.4k | } |
|
160 | | |
161 | | const_offload_toolchains_range |
162 | 0 | getOffloadToolChains(Action::OffloadKind Kind) const { |
163 | 0 | return OrderedOffloadingToolchains.equal_range(Kind); |
164 | 0 | } |
165 | | |
166 | | /// Return true if an offloading tool chain of a given kind exists. |
167 | 94.9k | template <Action::OffloadKind Kind> bool hasOffloadToolChain() const { |
168 | 94.9k | return OrderedOffloadingToolchains.find(Kind) != |
169 | 94.9k | OrderedOffloadingToolchains.end(); |
170 | 94.9k | } bool clang::driver::Compilation::hasOffloadToolChain<(clang::driver::Action::OffloadKind)2>() const Line | Count | Source | 167 | 47.4k | template <Action::OffloadKind Kind> bool hasOffloadToolChain() const { | 168 | 47.4k | return OrderedOffloadingToolchains.find(Kind) != | 169 | 47.4k | OrderedOffloadingToolchains.end(); | 170 | 47.4k | } |
bool clang::driver::Compilation::hasOffloadToolChain<(clang::driver::Action::OffloadKind)8>() const Line | Count | Source | 167 | 47.4k | template <Action::OffloadKind Kind> bool hasOffloadToolChain() const { | 168 | 47.4k | return OrderedOffloadingToolchains.find(Kind) != | 169 | 47.4k | OrderedOffloadingToolchains.end(); | 170 | 47.4k | } |
|
171 | | |
172 | | /// Return an offload toolchain of the provided kind. Only one is expected to |
173 | | /// exist. |
174 | | template <Action::OffloadKind Kind> |
175 | 900 | const ToolChain *getSingleOffloadToolChain() const { |
176 | 900 | auto TCs = getOffloadToolChains<Kind>(); |
177 | | |
178 | 900 | assert(TCs.first != TCs.second && |
179 | 900 | "No tool chains of the selected kind exist!"); |
180 | 0 | assert(std::next(TCs.first) == TCs.second && |
181 | 900 | "More than one tool chain of the this kind exist."); |
182 | 0 | return TCs.first->second; |
183 | 900 | } clang::driver::ToolChain const* clang::driver::Compilation::getSingleOffloadToolChain<(clang::driver::Action::OffloadKind)1>() const Line | Count | Source | 175 | 513 | const ToolChain *getSingleOffloadToolChain() const { | 176 | 513 | auto TCs = getOffloadToolChains<Kind>(); | 177 | | | 178 | 513 | assert(TCs.first != TCs.second && | 179 | 513 | "No tool chains of the selected kind exist!"); | 180 | 0 | assert(std::next(TCs.first) == TCs.second && | 181 | 513 | "More than one tool chain of the this kind exist."); | 182 | 0 | return TCs.first->second; | 183 | 513 | } |
clang::driver::ToolChain const* clang::driver::Compilation::getSingleOffloadToolChain<(clang::driver::Action::OffloadKind)2>() const Line | Count | Source | 175 | 278 | const ToolChain *getSingleOffloadToolChain() const { | 176 | 278 | auto TCs = getOffloadToolChains<Kind>(); | 177 | | | 178 | 278 | assert(TCs.first != TCs.second && | 179 | 278 | "No tool chains of the selected kind exist!"); | 180 | 0 | assert(std::next(TCs.first) == TCs.second && | 181 | 278 | "More than one tool chain of the this kind exist."); | 182 | 0 | return TCs.first->second; | 183 | 278 | } |
clang::driver::ToolChain const* clang::driver::Compilation::getSingleOffloadToolChain<(clang::driver::Action::OffloadKind)8>() const Line | Count | Source | 175 | 109 | const ToolChain *getSingleOffloadToolChain() const { | 176 | 109 | auto TCs = getOffloadToolChains<Kind>(); | 177 | | | 178 | 109 | assert(TCs.first != TCs.second && | 179 | 109 | "No tool chains of the selected kind exist!"); | 180 | 0 | assert(std::next(TCs.first) == TCs.second && | 181 | 109 | "More than one tool chain of the this kind exist."); | 182 | 0 | return TCs.first->second; | 183 | 109 | } |
|
184 | | |
185 | | void addOffloadDeviceToolChain(const ToolChain *DeviceToolChain, |
186 | 97 | Action::OffloadKind OffloadKind) { |
187 | 97 | assert(OffloadKind != Action::OFK_Host && OffloadKind != Action::OFK_None && |
188 | 97 | "This is not a device tool chain!"); |
189 | | |
190 | | // Update the host offload kind to also contain this kind. |
191 | 0 | ActiveOffloadMask |= OffloadKind; |
192 | 97 | OrderedOffloadingToolchains.insert( |
193 | 97 | std::make_pair(OffloadKind, DeviceToolChain)); |
194 | 97 | } |
195 | | |
196 | 152k | const llvm::opt::InputArgList &getInputArgs() const { return *Args; } |
197 | | |
198 | 1.47M | const llvm::opt::DerivedArgList &getArgs() const { return *TranslatedArgs; } |
199 | | |
200 | 479k | llvm::opt::DerivedArgList &getArgs() { return *TranslatedArgs; } |
201 | | |
202 | 114k | ActionList &getActions() { return Actions; } |
203 | 24 | const ActionList &getActions() const { return Actions; } |
204 | | |
205 | | /// Creates a new Action owned by this Compilation. |
206 | | /// |
207 | | /// The new Action is *not* added to the list returned by getActions(). |
208 | 187k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { |
209 | 187k | T *RawPtr = new T(std::forward<Args>(Arg)...); |
210 | 187k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); |
211 | 187k | return RawPtr; |
212 | 187k | } clang::driver::InputAction* clang::driver::Compilation::MakeAction<clang::driver::InputAction, llvm::opt::Arg const&, clang::driver::types::ID&, llvm::StringRef>(llvm::opt::Arg const&, clang::driver::types::ID&, llvm::StringRef&&) Line | Count | Source | 208 | 82 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 82 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 82 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 82 | return RawPtr; | 212 | 82 | } |
Unexecuted instantiation: clang::driver::OffloadBundlingJobAction* clang::driver::Compilation::MakeAction<clang::driver::OffloadBundlingJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&>(llvm::SmallVector<clang::driver::Action*, 3u>&) clang::driver::LinkJobAction* clang::driver::Compilation::MakeAction<clang::driver::LinkJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&) Line | Count | Source | 208 | 3 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 3 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 3 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 3 | return RawPtr; | 212 | 3 | } |
Unexecuted instantiation: clang::driver::InputAction* clang::driver::Compilation::MakeAction<clang::driver::InputAction, llvm::opt::Arg const&, clang::driver::types::ID>(llvm::opt::Arg const&, clang::driver::types::ID&&) Unexecuted instantiation: clang::driver::OffloadWrapperJobAction* clang::driver::Compilation::MakeAction<clang::driver::OffloadWrapperJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) Unexecuted instantiation: clang::driver::BackendJobAction* clang::driver::Compilation::MakeAction<clang::driver::BackendJobAction, clang::driver::OffloadWrapperJobAction*&, clang::driver::types::ID>(clang::driver::OffloadWrapperJobAction*&, clang::driver::types::ID&&) Unexecuted instantiation: clang::driver::AssembleJobAction* clang::driver::Compilation::MakeAction<clang::driver::AssembleJobAction, clang::driver::BackendJobAction*&, clang::driver::types::ID>(clang::driver::BackendJobAction*&, clang::driver::types::ID&&) clang::driver::OffloadUnbundlingJobAction* clang::driver::Compilation::MakeAction<clang::driver::OffloadUnbundlingJobAction, clang::driver::Action*&>(clang::driver::Action*&) Line | Count | Source | 208 | 7 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 7 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 7 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 7 | return RawPtr; | 212 | 7 | } |
clang::driver::BindArchAction* clang::driver::Compilation::MakeAction<clang::driver::BindArchAction, clang::driver::Action*&, char const*&>(clang::driver::Action*&, char const*&) Line | Count | Source | 208 | 20.3k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 20.3k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 20.3k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 20.3k | return RawPtr; | 212 | 20.3k | } |
clang::driver::LipoJobAction* clang::driver::Compilation::MakeAction<clang::driver::LipoJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) Line | Count | Source | 208 | 26 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 26 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 26 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 26 | return RawPtr; | 212 | 26 | } |
clang::driver::DsymutilJobAction* clang::driver::Compilation::MakeAction<clang::driver::DsymutilJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) Line | Count | Source | 208 | 68 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 68 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 68 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 68 | return RawPtr; | 212 | 68 | } |
clang::driver::VerifyDebugInfoJobAction* clang::driver::Compilation::MakeAction<clang::driver::VerifyDebugInfoJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 3 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 3 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 3 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 3 | return RawPtr; | 212 | 3 | } |
clang::driver::OffloadAction* clang::driver::Compilation::MakeAction<clang::driver::OffloadAction, clang::driver::OffloadAction::DeviceDependences&, clang::driver::types::ID>(clang::driver::OffloadAction::DeviceDependences&, clang::driver::types::ID&&) Line | Count | Source | 208 | 121 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 121 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 121 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 121 | return RawPtr; | 212 | 121 | } |
clang::driver::LinkJobAction* clang::driver::Compilation::MakeAction<clang::driver::LinkJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) Line | Count | Source | 208 | 7.00k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 7.00k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 7.00k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 7.00k | return RawPtr; | 212 | 7.00k | } |
clang::driver::BackendJobAction* clang::driver::Compilation::MakeAction<clang::driver::BackendJobAction, clang::driver::Action*&, clang::driver::types::ID&>(clang::driver::Action*&, clang::driver::types::ID&) Line | Count | Source | 208 | 820 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 820 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 820 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 820 | return RawPtr; | 212 | 820 | } |
clang::driver::OffloadAction* clang::driver::Compilation::MakeAction<clang::driver::OffloadAction, clang::driver::OffloadAction::HostDependence&, clang::driver::OffloadAction::DeviceDependences&>(clang::driver::OffloadAction::HostDependence&, clang::driver::OffloadAction::DeviceDependences&) Line | Count | Source | 208 | 59 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 59 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 59 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 59 | return RawPtr; | 212 | 59 | } |
clang::driver::InputAction* clang::driver::Compilation::MakeAction<clang::driver::InputAction, llvm::opt::Arg const&, clang::driver::types::ID const&>(llvm::opt::Arg const&, clang::driver::types::ID const&) Line | Count | Source | 208 | 18 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 18 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 18 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 18 | return RawPtr; | 212 | 18 | } |
clang::driver::InputAction* clang::driver::Compilation::MakeAction<clang::driver::InputAction, llvm::opt::Arg const&, clang::driver::types::ID&>(llvm::opt::Arg const&, clang::driver::types::ID&) Line | Count | Source | 208 | 49.1k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 49.1k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 49.1k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 49.1k | return RawPtr; | 212 | 49.1k | } |
clang::driver::StaticLibJobAction* clang::driver::Compilation::MakeAction<clang::driver::StaticLibJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) Line | Count | Source | 208 | 4 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 4 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 4 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 4 | return RawPtr; | 212 | 4 | } |
Unexecuted instantiation: clang::driver::LinkerWrapperJobAction* clang::driver::Compilation::MakeAction<clang::driver::LinkerWrapperJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) clang::driver::IfsMergeJobAction* clang::driver::Compilation::MakeAction<clang::driver::IfsMergeJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) Line | Count | Source | 208 | 23 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 23 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 23 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 23 | return RawPtr; | 212 | 23 | } |
clang::driver::CompileJobAction* clang::driver::Compilation::MakeAction<clang::driver::CompileJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 42.7k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 42.7k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 42.7k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 42.7k | return RawPtr; | 212 | 42.7k | } |
clang::driver::InputAction* clang::driver::Compilation::MakeAction<clang::driver::InputAction, llvm::opt::Arg&, clang::driver::types::ID>(llvm::opt::Arg&, clang::driver::types::ID&&) Line | Count | Source | 208 | 4 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 4 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 4 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 4 | return RawPtr; | 212 | 4 | } |
clang::driver::PrecompileJobAction* clang::driver::Compilation::MakeAction<clang::driver::PrecompileJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 4 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 4 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 4 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 4 | return RawPtr; | 212 | 4 | } |
Unexecuted instantiation: clang::driver::OffloadPackagerJobAction* clang::driver::Compilation::MakeAction<clang::driver::OffloadPackagerJobAction, llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID>(llvm::SmallVector<clang::driver::Action*, 3u>&, clang::driver::types::ID&&) clang::driver::PreprocessJobAction* clang::driver::Compilation::MakeAction<clang::driver::PreprocessJobAction, clang::driver::Action*&, clang::driver::types::ID&>(clang::driver::Action*&, clang::driver::types::ID&) Line | Count | Source | 208 | 44.1k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 44.1k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 44.1k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 44.1k | return RawPtr; | 212 | 44.1k | } |
clang::driver::ExtractAPIJobAction* clang::driver::Compilation::MakeAction<clang::driver::ExtractAPIJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 17 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 17 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 17 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 17 | return RawPtr; | 212 | 17 | } |
clang::driver::HeaderModulePrecompileJobAction* clang::driver::Compilation::MakeAction<clang::driver::HeaderModulePrecompileJobAction, clang::driver::Action*&, clang::driver::types::ID&, char const*&>(clang::driver::Action*&, clang::driver::types::ID&, char const*&) Line | Count | Source | 208 | 3 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 3 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 3 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 3 | return RawPtr; | 212 | 3 | } |
clang::driver::PrecompileJobAction* clang::driver::Compilation::MakeAction<clang::driver::PrecompileJobAction, clang::driver::Action*&, clang::driver::types::ID&>(clang::driver::Action*&, clang::driver::types::ID&) Line | Count | Source | 208 | 91 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 91 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 91 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 91 | return RawPtr; | 212 | 91 | } |
clang::driver::AnalyzeJobAction* clang::driver::Compilation::MakeAction<clang::driver::AnalyzeJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 56 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 56 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 56 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 56 | return RawPtr; | 212 | 56 | } |
Unexecuted instantiation: clang::driver::MigrateJobAction* clang::driver::Compilation::MakeAction<clang::driver::MigrateJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) clang::driver::VerifyPCHJobAction* clang::driver::Compilation::MakeAction<clang::driver::VerifyPCHJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 2 | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 2 | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 2 | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 2 | return RawPtr; | 212 | 2 | } |
clang::driver::BackendJobAction* clang::driver::Compilation::MakeAction<clang::driver::BackendJobAction, clang::driver::Action*&, clang::driver::types::ID>(clang::driver::Action*&, clang::driver::types::ID&&) Line | Count | Source | 208 | 11.6k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 11.6k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 11.6k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 11.6k | return RawPtr; | 212 | 11.6k | } |
clang::driver::AssembleJobAction* clang::driver::Compilation::MakeAction<clang::driver::AssembleJobAction, clang::driver::Action*, clang::driver::types::ID>(clang::driver::Action*&&, clang::driver::types::ID&&) Line | Count | Source | 208 | 11.2k | template <typename T, typename... Args> T *MakeAction(Args &&... Arg) { | 209 | 11.2k | T *RawPtr = new T(std::forward<Args>(Arg)...); | 210 | 11.2k | AllActions.push_back(std::unique_ptr<Action>(RawPtr)); | 211 | 11.2k | return RawPtr; | 212 | 11.2k | } |
|
213 | | |
214 | 114k | JobList &getJobs() { return Jobs; } |
215 | 3 | const JobList &getJobs() const { return Jobs; } |
216 | | |
217 | 52.4k | void addCommand(std::unique_ptr<Command> C) { Jobs.addJob(std::move(C)); } |
218 | | |
219 | 28 | const llvm::opt::ArgStringList &getTempFiles() const { return TempFiles; } |
220 | | |
221 | 239 | const ArgStringMap &getResultFiles() const { return ResultFiles; } |
222 | | |
223 | 0 | const ArgStringMap &getFailureResultFiles() const { |
224 | 0 | return FailureResultFiles; |
225 | 0 | } |
226 | | |
227 | | /// Installs a handler that is executed when a compilation job is finished. |
228 | | /// The arguments of the callback specify the compilation job as an instance |
229 | | /// of class Command and the exit status of the child process executed that |
230 | | /// job. |
231 | 5 | void setPostCallback(const std::function<void(const Command &, int)> &CB) { |
232 | 5 | PostCallback = CB; |
233 | 5 | } |
234 | | |
235 | | /// Returns the sysroot path. |
236 | | StringRef getSysRoot() const; |
237 | | |
238 | | /// getArgsForToolChain - Return the derived argument list for the |
239 | | /// tool chain \p TC (or the default tool chain, if TC is not specified). |
240 | | /// If a device offloading kind is specified, a translation specific for that |
241 | | /// kind is performed, if any. |
242 | | /// |
243 | | /// \param BoundArch - The bound architecture name, or 0. |
244 | | /// \param DeviceOffloadKind - The offload device kind that should be used in |
245 | | /// the translation, if any. |
246 | | const llvm::opt::DerivedArgList & |
247 | | getArgsForToolChain(const ToolChain *TC, StringRef BoundArch, |
248 | | Action::OffloadKind DeviceOffloadKind); |
249 | | |
250 | | /// addTempFile - Add a file to remove on exit, and returns its |
251 | | /// argument. |
252 | 4.71k | const char *addTempFile(const char *Name) { |
253 | 4.71k | TempFiles.push_back(Name); |
254 | 4.71k | return Name; |
255 | 4.71k | } |
256 | | |
257 | | /// addResultFile - Add a file to remove on failure, and returns its |
258 | | /// argument. |
259 | 17.2k | const char *addResultFile(const char *Name, const JobAction *JA) { |
260 | 17.2k | ResultFiles[JA] = Name; |
261 | 17.2k | return Name; |
262 | 17.2k | } |
263 | | |
264 | | /// addFailureResultFile - Add a file to remove if we crash, and returns its |
265 | | /// argument. |
266 | 3.34k | const char *addFailureResultFile(const char *Name, const JobAction *JA) { |
267 | 3.34k | FailureResultFiles[JA] = Name; |
268 | 3.34k | return Name; |
269 | 3.34k | } |
270 | | |
271 | | /// CleanupFile - Delete a given file. |
272 | | /// |
273 | | /// \param IssueErrors - Report failures as errors. |
274 | | /// \return Whether the file was removed successfully. |
275 | | bool CleanupFile(const char *File, bool IssueErrors = false) const; |
276 | | |
277 | | /// CleanupFileList - Remove the files in the given list. |
278 | | /// |
279 | | /// \param IssueErrors - Report failures as errors. |
280 | | /// \return Whether all files were removed successfully. |
281 | | bool CleanupFileList(const llvm::opt::ArgStringList &Files, |
282 | | bool IssueErrors = false) const; |
283 | | |
284 | | /// CleanupFileMap - Remove the files in the given map. |
285 | | /// |
286 | | /// \param JA - If specified, only delete the files associated with this |
287 | | /// JobAction. Otherwise, delete all files in the map. |
288 | | /// \param IssueErrors - Report failures as errors. |
289 | | /// \return Whether all files were removed successfully. |
290 | | bool CleanupFileMap(const ArgStringMap &Files, |
291 | | const JobAction *JA, |
292 | | bool IssueErrors = false) const; |
293 | | |
294 | | /// ExecuteCommand - Execute an actual command. |
295 | | /// |
296 | | /// \param FailingCommand - For non-zero results, this will be set to the |
297 | | /// Command which failed, if any. |
298 | | /// \return The result code of the subprocess. |
299 | | int ExecuteCommand(const Command &C, const Command *&FailingCommand) const; |
300 | | |
301 | | /// ExecuteJob - Execute a single job. |
302 | | /// |
303 | | /// \param FailingCommands - For non-zero results, this will be a vector of |
304 | | /// failing commands and their associated result code. |
305 | | void ExecuteJobs( |
306 | | const JobList &Jobs, |
307 | | SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands) const; |
308 | | |
309 | | /// initCompilationForDiagnostics - Remove stale state and suppress output |
310 | | /// so compilation can be reexecuted to generate additional diagnostic |
311 | | /// information (e.g., preprocessed source(s)). |
312 | | void initCompilationForDiagnostics(); |
313 | | |
314 | | /// Return true if we're compiling for diagnostics. |
315 | 93.5k | bool isForDiagnostics() const { return ForDiagnostics; } |
316 | | |
317 | | /// Return whether an error during the parsing of the input args. |
318 | 18.8k | bool containsError() const { return ContainsError; } |
319 | | |
320 | | /// Force driver to fail before toolchain is created. This is necessary when |
321 | | /// error happens in action builder. |
322 | 0 | void setContainsError() { ContainsError = true; } |
323 | | |
324 | | /// Redirect - Redirect output of this compilation. Can only be done once. |
325 | | /// |
326 | | /// \param Redirects - array of optional paths. The array should have a size |
327 | | /// of three. The inferior process's stdin(0), stdout(1), and stderr(2) will |
328 | | /// be redirected to the corresponding paths, if provided (not llvm::None). |
329 | | void Redirect(ArrayRef<Optional<StringRef>> Redirects); |
330 | | }; |
331 | | |
332 | | } // namespace driver |
333 | | } // namespace clang |
334 | | |
335 | | #endif // LLVM_CLANG_DRIVER_COMPILATION_H |