10 #ifndef LLVM_CLANG_DRIVER_COMPILATION_H 11 #define LLVM_CLANG_DRIVER_COMPILATION_H 17 #include "llvm/ADT/ArrayRef.h" 18 #include "llvm/ADT/DenseMap.h" 19 #include "llvm/ADT/Optional.h" 20 #include "llvm/ADT/StringRef.h" 21 #include "llvm/Option/Option.h" 55 unsigned ActiveOffloadMask = 0;
61 std::multimap<Action::OffloadKind, const ToolChain *>
62 OrderedOffloadingToolchains;
65 llvm::opt::InputArgList *Args;
69 llvm::opt::DerivedArgList *TranslatedArgs;
73 std::vector<std::unique_ptr<Action>> AllActions;
84 struct TCArgsKey final {
89 TCArgsKey(
const ToolChain *TC, StringRef BoundArch,
91 : TC(TC), BoundArch(BoundArch), DeviceOffloadKind(DeviceOffloadKind) {}
93 bool operator<(
const TCArgsKey &K)
const {
96 else if (TC == K.TC && BoundArch < K.BoundArch)
98 else if (TC == K.TC && BoundArch == K.BoundArch &&
99 DeviceOffloadKind < K.DeviceOffloadKind)
104 std::map<TCArgsKey, llvm::opt::DerivedArgList *> TCArgs;
107 llvm::opt::ArgStringList TempFiles;
117 std::vector<Optional<StringRef>> Redirects;
120 bool ForDiagnostics =
false;
126 bool ForceKeepTempFiles =
false;
130 llvm::opt::InputArgList *Args,
131 llvm::opt::DerivedArgList *TranslatedArgs,
bool ContainsError);
139 return ActiveOffloadMask &
Kind;
148 const_offload_toolchains_iterator>;
150 template <Action::OffloadKind Kind>
152 return OrderedOffloadingToolchains.equal_range(
Kind);
157 return OrderedOffloadingToolchains.find(
Kind) !=
158 OrderedOffloadingToolchains.end();
163 template <Action::OffloadKind Kind>
165 auto TCs = getOffloadToolChains<Kind>();
167 assert(TCs.first != TCs.second &&
168 "No tool chains of the selected kind exist!");
169 assert(std::next(TCs.first) == TCs.second &&
170 "More than one tool chain of the this kind exist.");
171 return TCs.first->second;
175 Action::OffloadKind OffloadKind) {
176 assert(OffloadKind != Action::OFK_Host && OffloadKind != Action::OFK_None &&
177 "This is not a device tool chain!");
180 ActiveOffloadMask |= OffloadKind;
181 OrderedOffloadingToolchains.insert(
182 std::make_pair(OffloadKind, DeviceToolChain));
187 const llvm::opt::DerivedArgList &
getArgs()
const {
return *TranslatedArgs; }
189 llvm::opt::DerivedArgList &
getArgs() {
return *TranslatedArgs; }
197 template <
typename T,
typename... Args> T *
MakeAction(Args &&... Arg) {
198 T *RawPtr =
new T(std::forward<Args>(Arg)...);
199 AllActions.push_back(std::unique_ptr<Action>(RawPtr));
208 const llvm::opt::ArgStringList &
getTempFiles()
const {
return TempFiles; }
213 return FailureResultFiles;
217 StringRef getSysRoot()
const;
227 const llvm::opt::DerivedArgList &
228 getArgsForToolChain(
const ToolChain *TC, StringRef BoundArch,
229 Action::OffloadKind DeviceOffloadKind);
234 TempFiles.push_back(Name);
241 ResultFiles[JA] = Name;
248 FailureResultFiles[JA] = Name;
256 bool CleanupFile(
const char *File,
bool IssueErrors =
false)
const;
262 bool CleanupFileList(
const llvm::opt::ArgStringList &Files,
263 bool IssueErrors =
false)
const;
273 bool IssueErrors =
false)
const;
280 int ExecuteCommand(
const Command &C,
const Command *&FailingCommand)
const;
288 SmallVectorImpl<std::pair<int, const Command *>> &FailingCommands)
const;
293 void initCompilationForDiagnostics();
312 #endif // LLVM_CLANG_DRIVER_COMPILATION_H const JobList & getJobs() const
const llvm::opt::ArgStringList & getTempFiles() const
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
T * MakeAction(Args &&... Arg)
Creates a new Action owned by this Compilation.
const std::multimap< Action::OffloadKind, const ToolChain * >::const_iterator const_offload_toolchains_iterator
Iterator that visits device toolchains of a given kind.
std::pair< const_offload_toolchains_iterator, const_offload_toolchains_iterator > const_offload_toolchains_range
const ArgStringMap & getFailureResultFiles() const
bool containsError() const
Return whether an error during the parsing of the input args.
void addOffloadDeviceToolChain(const ToolChain *DeviceToolChain, Action::OffloadKind OffloadKind)
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
const ActionList & getActions() const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
const llvm::opt::InputArgList & getInputArgs() const
bool hasOffloadToolChain() const
Return true if an offloading tool chain of a given kind exists.
const ToolChain & getDefaultToolChain() const
llvm::opt::DerivedArgList & getArgs()
const ArgStringMap & getResultFiles() const
bool isForDiagnostics() const
Return true if we're compiling for diagnostics.
unsigned isOffloadingHostKind(Action::OffloadKind Kind) const
void addCommand(std::unique_ptr< Command > C)
JobList - A sequence of jobs to perform.
void addJob(std::unique_ptr< Command > J)
Add a job to the list (taking ownership).
llvm::DenseMap< const JobAction *, const char * > ArgStringMap
ArgStringMap - Type used to map a JobAction to its result file.
const_offload_toolchains_range getOffloadToolChains() const
const llvm::opt::DerivedArgList & getArgs() const
Command - An executable path/name and argument vector to execute.
const char * addResultFile(const char *Name, const JobAction *JA)
addResultFile - Add a file to remove on failure, and returns its argument.
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
Dataflow Directional Tag Classes.
ActionList & getActions()
Compilation - A set of tasks to perform for a single driver invocation.
const Driver & getDriver() const
const char * addFailureResultFile(const char *Name, const JobAction *JA)
addFailureResultFile - Add a file to remove if we crash, and returns its argument.
const char * addTempFile(const char *Name)
addTempFile - Add a file to remove on exit, and returns its argument.
const ToolChain * getSingleOffloadToolChain() const
Return an offload toolchain of the provided kind.