forked from OSchip/llvm-project
[OpenMP] Extend CLANG target options with device offloading kind.
Summary: Pass the type of the device offloading when building the tool chain for a particular target architecture. This is required when supporting multiple tool chains that target a single device type. In our particular use case, the OpenMP and CUDA tool chains will use the same ```addClangTargetOptions ``` method. This enables the reuse of common options and ensures control over options only supported by a particular tool chain. Reviewers: arpith-jacob, caomhin, carlo.bertolli, ABataev, jlebar, hfinkel, tstellar, Hahnfeld Reviewed By: hfinkel Subscribers: jgravelle-google, aheejin, rengolin, jfb, dschuff, sbc100, cfe-commits Differential Revision: https://reviews.llvm.org/D29647 llvm-svn: 307272
This commit is contained in:
parent
6a5df72a82
commit
f0f29608d0
|
@ -411,7 +411,8 @@ public:
|
|||
|
||||
/// \brief Add options that need to be passed to cc1 for this target.
|
||||
virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const;
|
||||
|
||||
/// \brief Add warning options that need to be passed to cc1 for this target.
|
||||
virtual void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const;
|
||||
|
|
|
@ -544,9 +544,9 @@ void ToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
|||
// Each toolchain should provide the appropriate include flags.
|
||||
}
|
||||
|
||||
void ToolChain::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
}
|
||||
void ToolChain::addClangTargetOptions(
|
||||
const ArgList &DriverArgs, ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const {}
|
||||
|
||||
void ToolChain::addClangWarningOptions(ArgStringList &CC1Args) const {}
|
||||
|
||||
|
|
|
@ -98,7 +98,8 @@ void BareMetal::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
|||
}
|
||||
|
||||
void BareMetal::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
ArgStringList &CC1Args,
|
||||
Action::OffloadKind) const {
|
||||
CC1Args.push_back("-nostdsysteminc");
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,8 @@ public:
|
|||
void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
std::string findLibCxxIncludePath(ToolChain::CXXStdlibType LibType) const;
|
||||
void AddClangCXXStdlibIncludeArgs(
|
||||
const llvm::opt::ArgList &DriverArgs,
|
||||
|
|
|
@ -2544,7 +2544,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
AsynchronousUnwindTables))
|
||||
CmdArgs.push_back("-munwind-tables");
|
||||
|
||||
getToolChain().addClangTargetOptions(Args, CmdArgs);
|
||||
getToolChain().addClangTargetOptions(Args, CmdArgs,
|
||||
JA.getOffloadingDeviceKind());
|
||||
|
||||
if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
|
||||
CmdArgs.push_back("-mlimit-float-precision");
|
||||
|
|
|
@ -338,24 +338,31 @@ CudaToolChain::CudaToolChain(const Driver &D, const llvm::Triple &Triple,
|
|||
|
||||
void CudaToolChain::addClangTargetOptions(
|
||||
const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const {
|
||||
HostTC.addClangTargetOptions(DriverArgs, CC1Args);
|
||||
|
||||
CC1Args.push_back("-fcuda-is-device");
|
||||
|
||||
if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
|
||||
options::OPT_fno_cuda_flush_denormals_to_zero, false))
|
||||
CC1Args.push_back("-fcuda-flush-denormals-to-zero");
|
||||
|
||||
if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
|
||||
options::OPT_fno_cuda_approx_transcendentals, false))
|
||||
CC1Args.push_back("-fcuda-approx-transcendentals");
|
||||
|
||||
if (DriverArgs.hasArg(options::OPT_nocudalib))
|
||||
return;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadingKind) const {
|
||||
HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);
|
||||
|
||||
StringRef GpuArch = DriverArgs.getLastArgValue(options::OPT_march_EQ);
|
||||
assert(!GpuArch.empty() && "Must have an explicit GPU arch.");
|
||||
assert((DeviceOffloadingKind == Action::OFK_OpenMP ||
|
||||
DeviceOffloadingKind == Action::OFK_Cuda) &&
|
||||
"Only OpenMP or CUDA offloading kinds are supported for NVIDIA GPUs.");
|
||||
|
||||
if (DeviceOffloadingKind == Action::OFK_Cuda) {
|
||||
CC1Args.push_back("-fcuda-is-device");
|
||||
|
||||
if (DriverArgs.hasFlag(options::OPT_fcuda_flush_denormals_to_zero,
|
||||
options::OPT_fno_cuda_flush_denormals_to_zero, false))
|
||||
CC1Args.push_back("-fcuda-flush-denormals-to-zero");
|
||||
|
||||
if (DriverArgs.hasFlag(options::OPT_fcuda_approx_transcendentals,
|
||||
options::OPT_fno_cuda_approx_transcendentals, false))
|
||||
CC1Args.push_back("-fcuda-approx-transcendentals");
|
||||
|
||||
if (DriverArgs.hasArg(options::OPT_nocudalib))
|
||||
return;
|
||||
}
|
||||
|
||||
std::string LibDeviceFile = CudaInstallation.getLibDeviceFile(GpuArch);
|
||||
|
||||
if (LibDeviceFile.empty()) {
|
||||
|
@ -396,6 +403,24 @@ CudaToolChain::TranslateArgs(const llvm::opt::DerivedArgList &Args,
|
|||
|
||||
const OptTable &Opts = getDriver().getOpts();
|
||||
|
||||
// For OpenMP device offloading, append derived arguments. Make sure
|
||||
// flags are not duplicated.
|
||||
// TODO: Append the compute capability.
|
||||
if (DeviceOffloadKind == Action::OFK_OpenMP) {
|
||||
for (Arg *A : Args){
|
||||
bool IsDuplicate = false;
|
||||
for (Arg *DALArg : *DAL){
|
||||
if (A == DALArg) {
|
||||
IsDuplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!IsDuplicate)
|
||||
DAL->append(A);
|
||||
}
|
||||
return DAL;
|
||||
}
|
||||
|
||||
for (Arg *A : Args) {
|
||||
if (A->getOption().matches(options::OPT_Xarch__)) {
|
||||
// Skip this argument unless the architecture matches BoundArch
|
||||
|
|
|
@ -130,7 +130,8 @@ public:
|
|||
TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
|
||||
// Never try to use the integrated assembler with CUDA; always fork out to
|
||||
// ptxas.
|
||||
|
|
|
@ -1708,7 +1708,8 @@ bool Darwin::isAlignedAllocationUnavailable() const {
|
|||
}
|
||||
|
||||
void Darwin::addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const {
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const {
|
||||
if (isAlignedAllocationUnavailable())
|
||||
CC1Args.push_back("-faligned-alloc-unavailable");
|
||||
}
|
||||
|
|
|
@ -390,7 +390,8 @@ protected:
|
|||
bool isAlignedAllocationUnavailable() const;
|
||||
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
|
||||
StringRef getPlatformFamily() const;
|
||||
static StringRef getSDKName(StringRef isysroot);
|
||||
|
|
|
@ -172,7 +172,8 @@ Fuchsia::GetCXXStdlibType(const ArgList &Args) const {
|
|||
}
|
||||
|
||||
void Fuchsia::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
ArgStringList &CC1Args,
|
||||
Action::OffloadKind) const {
|
||||
if (DriverArgs.hasFlag(options::OPT_fuse_init_array,
|
||||
options::OPT_fno_use_init_array, true))
|
||||
CC1Args.push_back("-fuse-init-array");
|
||||
|
|
|
@ -55,7 +55,8 @@ public:
|
|||
GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
|
||||
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
void
|
||||
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
|
|
|
@ -2461,7 +2461,8 @@ Generic_GCC::TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef,
|
|||
void Generic_ELF::anchor() {}
|
||||
|
||||
void Generic_ELF::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
ArgStringList &CC1Args,
|
||||
Action::OffloadKind) const {
|
||||
const Generic_GCC::GCCVersion &V = GCCInstallation.getVersion();
|
||||
bool UseInitArrayDefault =
|
||||
getTriple().getArch() == llvm::Triple::aarch64 ||
|
||||
|
|
|
@ -341,7 +341,8 @@ public:
|
|||
: Generic_GCC(D, Triple, Args) {}
|
||||
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
};
|
||||
|
||||
} // end namespace toolchains
|
||||
|
|
|
@ -428,7 +428,8 @@ unsigned HexagonToolChain::getOptimizationLevel(
|
|||
}
|
||||
|
||||
void HexagonToolChain::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
ArgStringList &CC1Args,
|
||||
Action::OffloadKind) const {
|
||||
if (DriverArgs.hasArg(options::OPT_ffp_contract))
|
||||
return;
|
||||
unsigned OptLevel = getOptimizationLevel(DriverArgs);
|
||||
|
|
|
@ -69,7 +69,8 @@ public:
|
|||
~HexagonToolChain() override;
|
||||
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
void
|
||||
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
|
|
|
@ -134,7 +134,8 @@ bool WebAssembly::SupportsProfiling() const { return false; }
|
|||
bool WebAssembly::HasNativeLLVMSupport() const { return true; }
|
||||
|
||||
void WebAssembly::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
ArgStringList &CC1Args,
|
||||
Action::OffloadKind) const {
|
||||
if (DriverArgs.hasFlag(clang::driver::options::OPT_fuse_init_array,
|
||||
options::OPT_fno_use_init_array, true))
|
||||
CC1Args.push_back("-fuse-init-array");
|
||||
|
|
|
@ -53,7 +53,8 @@ private:
|
|||
bool SupportsProfiling() const override;
|
||||
bool HasNativeLLVMSupport() const override;
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
RuntimeLibType GetDefaultRuntimeLibType() const override;
|
||||
CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
|
||||
void AddClangSystemIncludeArgs(
|
||||
|
|
|
@ -124,7 +124,8 @@ void XCoreToolChain::AddClangSystemIncludeArgs(const ArgList &DriverArgs,
|
|||
}
|
||||
|
||||
void XCoreToolChain::addClangTargetOptions(const ArgList &DriverArgs,
|
||||
ArgStringList &CC1Args) const {
|
||||
ArgStringList &CC1Args,
|
||||
Action::OffloadKind) const {
|
||||
CC1Args.push_back("-nostdsysteminc");
|
||||
}
|
||||
|
||||
|
|
|
@ -67,7 +67,8 @@ public:
|
|||
AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
llvm::opt::ArgStringList &CC1Args,
|
||||
Action::OffloadKind DeviceOffloadKind) const override;
|
||||
void AddClangCXXStdlibIncludeArgs(
|
||||
const llvm::opt::ArgList &DriverArgs,
|
||||
llvm::opt::ArgStringList &CC1Args) const override;
|
||||
|
|
Loading…
Reference in New Issue