20#include "llvm/ADT/STLExtras.h"
21#include "llvm/Support/FileSystem.h"
22#include "llvm/Support/FormatAdapters.h"
23#include "llvm/Support/FormatVariadic.h"
24#include "llvm/Support/Path.h"
33 const llvm::Triple &Triple,
43 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
47 StringRef GPUArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
48 assert(!GPUArch.empty() &&
"Must have an explicit GPU arch.");
51 "Only OpenMP offloading kinds are supported.");
53 CC1Args.push_back(
"-target-cpu");
54 CC1Args.push_back(DriverArgs.MakeArgStringRef(GPUArch));
55 CC1Args.push_back(
"-fcuda-is-device");
57 if (DriverArgs.hasArg(options::OPT_nogpulib))
61 CC1Args.push_back(BCFile.ShouldInternalize ?
"-mlink-builtin-bitcode"
62 :
"-mlink-bitcode-file");
63 CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path));
72 const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
77 DAL =
new DerivedArgList(Args.getBaseArgs());
83 if (!llvm::is_contained(*DAL, A))
86 if (!DAL->hasArg(options::OPT_march_EQ)) {
87 StringRef Arch = BoundArch;
92 llvm::formatv(
"{0}", llvm::fmt_consume(ArchsOrErr.takeError()));
94 << llvm::Triple::getArchTypeName(
getArch()) << ErrMsg <<
"-march";
97 Arch = Args.MakeArgString(ArchsOrErr->front());
100 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ), Arch);
106 for (Arg *A : Args) {
110 if (!BoundArch.empty()) {
111 DAL->eraseArg(options::OPT_march_EQ);
112 DAL->AddJoinedArg(
nullptr, Opts.getOption(options::OPT_march_EQ),
120 ArgStringList &CC1Args)
const {
130 const ArgList &DriverArgs, ArgStringList &CC1Args)
const {
135 ArgStringList &CC1Args)
const {
154 const ArgList &Args)
const {
160 if (Args.hasArg(options::OPT_nogpulib))
169 getTriple(), Args.getLastArgValue(options::OPT_march_EQ));
174 BCLibs.emplace_back(BCLib);
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
DiagnosticBuilder Diag(unsigned DiagID) const
const llvm::opt::OptTable & getOpts() const
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
const char * CudaArchToString(CudaArch A)