9#ifndef LLVM_CLANG_DRIVER_COMPILATION_H
10#define LLVM_CLANG_DRIVER_COMPILATION_H
17#include "llvm/ADT/ArrayRef.h"
18#include "llvm/ADT/DenseMap.h"
19#include "llvm/ADT/StringRef.h"
20#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 {
91 : TC(TC), BoundArchitecture(BA), DeviceOffloadKind(DeviceOffloadKind) {}
93 bool operator<(
const TCArgsKey &K)
const {
94 return std::tie(TC, BoundArchitecture, DeviceOffloadKind) <
95 std::tie(K.TC, K.BoundArchitecture, K.DeviceOffloadKind);
98 std::map<TCArgsKey, llvm::opt::DerivedArgList *> TCArgs;
101 llvm::opt::ArgStringList TempFiles;
114 std::vector<std::optional<StringRef>> Redirects;
122 bool ForDiagnostics =
false;
128 bool ForceKeepTempFiles =
false;
136 llvm::opt::InputArgList *Args,
137 llvm::opt::DerivedArgList *TranslatedArgs,
bool ContainsError);
145 return ActiveOffloadMask & Kind;
158 template <Action::OffloadKind Kind>
160 return OrderedOffloadingToolchains.equal_range(Kind);
165 return OrderedOffloadingToolchains.equal_range(Kind);
170 return OrderedOffloadingToolchains.find(Kind) !=
171 OrderedOffloadingToolchains.end();
176 template <Action::OffloadKind Kind>
180 assert(TCs.first != TCs.second &&
181 "No tool chains of the selected kind exist!");
182 assert(std::next(TCs.first) == TCs.second &&
183 "More than one tool chain of the this kind exist.");
184 return TCs.first->second;
190 "This is not a device tool chain!");
193 ActiveOffloadMask |= OffloadKind;
194 OrderedOffloadingToolchains.insert(
195 std::make_pair(OffloadKind, DeviceToolChain));
200 const llvm::opt::DerivedArgList &
getArgs()
const {
return *TranslatedArgs; }
202 llvm::opt::DerivedArgList &
getArgs() {
return *TranslatedArgs; }
210 template <
typename T,
typename... Args> T *
MakeAction(Args &&... Arg) {
211 T *RawPtr =
new T(std::forward<Args>(Arg)...);
212 AllActions.push_back(std::unique_ptr<Action>(RawPtr));
220 Cmd->setBoundArch(CurrentBoundArch);
221 Jobs.addJob(std::move(Cmd));
228 const llvm::opt::ArgStringList &
getTempFiles()
const {
return TempFiles; }
233 return FailureResultFiles;
255 const llvm::opt::DerivedArgList &
262 TempFiles.push_back(Name);
269 ResultFiles[JA] = Name;
276 FailureResultFiles[JA] = Name;
281 return TimeTraceFiles.lookup(JA);
284 assert(!TimeTraceFiles.contains(JA));
285 TimeTraceFiles[JA] = Name;
299 bool IssueErrors =
false)
const;
309 bool IssueErrors =
false)
const;
319 bool LogOnly =
false)
const;
330 bool LogOnly =
false)
const;
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Command - An executable path/name and argument vector to execute.
void addCommand(std::unique_ptr< Command > Cmd)
bool hasOffloadToolChain() const
Return true if an offloading tool chain of a given kind exists.
const JobList & getJobs() const
int ExecuteCommand(const Command &C, const Command *&FailingCommand, bool LogOnly=false) const
ExecuteCommand - Execute an actual command.
llvm::opt::ArgStringList & getTempFiles()
bool CleanupFileMap(const ArgStringMap &Files, const JobAction *JA, bool IssueErrors=false) const
CleanupFileMap - Remove the files in the given map.
std::pair< const_offload_toolchains_iterator, const_offload_toolchains_iterator > const_offload_toolchains_range
const ActionList & getActions() const
void setPostCallback(const std::function< void(const Command &, int)> &CB)
Installs a handler that is executed when a compilation job is finished.
ActionList & getActions()
const_offload_toolchains_range getOffloadToolChains(Action::OffloadKind Kind) const
bool CleanupFile(const char *File, bool IssueErrors=false) const
CleanupFile - Delete a given file.
const ArgStringMap & getFailureResultFiles() const
llvm::opt::DerivedArgList & getArgs()
const char * getTimeTraceFile(const JobAction *JA) const
unsigned isOffloadingHostKind(Action::OffloadKind Kind) const
Compilation(const Driver &D, const ToolChain &DefaultToolChain, llvm::opt::InputArgList *Args, llvm::opt::DerivedArgList *TranslatedArgs, bool ContainsError)
T * MakeAction(Args &&... Arg)
Creates a new Action owned by this Compilation.
bool CleanupFileList(const llvm::opt::ArgStringList &Files, bool IssueErrors=false) const
CleanupFileList - Remove the files in the given list.
const ArgStringMap & getResultFiles() const
const llvm::opt::DerivedArgList & getArgsForToolChain(const ToolChain *TC, BoundArch BA, Action::OffloadKind DeviceOffloadKind)
getArgsForToolChain - Return the derived argument list for the tool chain TC (or the default tool cha...
StringRef getSysRoot() const
Returns the sysroot path.
void setCurrentBoundArch(BoundArch BA)
void setContainsError()
Force driver to fail before toolchain is created.
const_offload_toolchains_range getOffloadToolChains() const
const std::multimap< Action::OffloadKind, const ToolChain * >::const_iterator const_offload_toolchains_iterator
Iterator that visits device toolchains of a given kind.
unsigned getActiveOffloadKinds() const
const char * addFailureResultFile(const char *Name, const JobAction *JA)
addFailureResultFile - Add a file to remove if we crash, and returns its argument.
void Redirect(ArrayRef< std::optional< StringRef > > Redirects)
Redirect - Redirect output of this compilation.
const ToolChain & getDefaultToolChain() const
const char * addResultFile(const char *Name, const JobAction *JA)
addResultFile - Add a file to remove on failure, and returns its argument.
void addOffloadDeviceToolChain(const ToolChain *DeviceToolChain, Action::OffloadKind OffloadKind)
void initCompilationForDiagnostics()
initCompilationForDiagnostics - Remove stale state and suppress output so compilation can be reexecut...
const char * addTempFile(const char *Name)
addTempFile - Add a file to remove on exit, and returns its argument.
const llvm::opt::InputArgList & getInputArgs() const
const llvm::opt::ArgStringList & getTempFiles() const
void addTimeTraceFile(const char *Name, const JobAction *JA)
const llvm::opt::DerivedArgList & getArgs() const
void ExecuteJobs(const JobList &Jobs, SmallVectorImpl< std::pair< int, const Command * > > &FailingCommands, bool LogOnly=false) const
ExecuteJob - Execute a single job.
bool containsError() const
Return whether an error during the parsing of the input args.
bool isForDiagnostics() const
Return true if we're compiling for diagnostics.
const ToolChain * getSingleOffloadToolChain() const
Return an offload toolchain of the provided kind.
BoundArch getCurrentBoundArch() const
const Driver & getDriver() const
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
JobList - A sequence of jobs to perform.
SmallVector< Action *, 3 > ActionList
ActionList - Type used for lists of actions.
llvm::DenseMap< const JobAction *, const char * > ArgStringMap
ArgStringMap - Type used to map a JobAction to its result file.
The JSON file list parser is used to communicate input to InstallAPI.
bool operator<(DeclarationName LHS, DeclarationName RHS)
Ordering on two declaration names.
Diagnostic wrappers for TextAPI types for error reporting.
int const char * function
Represents a bound architecture for offload / multiple architecture compilation.