clang 23.0.0git
AMDGPUOpenMP.cpp
Go to the documentation of this file.
1//===- AMDGPUOpenMP.cpp - AMDGPUOpenMP ToolChain Implementation -*- 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#include "AMDGPUOpenMP.h"
10#include "AMDGPU.h"
12#include "clang/Driver/Driver.h"
13#include "clang/Driver/Tool.h"
15#include "llvm/ADT/STLExtras.h"
16
17using namespace clang::driver;
18using namespace clang::driver::toolchains;
19using namespace clang::driver::tools;
20using namespace clang;
21using namespace llvm::opt;
22
24 const llvm::Triple &Triple,
25 const ToolChain &HostTC,
26 const ArgList &Args)
27 : ROCMToolChain(D, Triple, Args), HostTC(HostTC) {
28 // Lookup binaries into the driver directory, this is used to
29 // discover the 'amdgpu-arch' executable.
30 getProgramPaths().push_back(getDriver().Dir);
31}
32
34 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
35 Action::OffloadKind DeviceOffloadingKind) const {
36 HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);
37
38 assert(DeviceOffloadingKind == Action::OFK_OpenMP &&
39 "Only OpenMP offloading kinds are supported.");
40
41 if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
42 true))
43 return;
44
45 for (auto BCFile : getDeviceLibs(DriverArgs, DeviceOffloadingKind)) {
46 CC1Args.push_back(BCFile.ShouldInternalize ? "-mlink-builtin-bitcode"
47 : "-mlink-bitcode-file");
48 CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path));
49 }
50
51 // Link the bitcode library late if we're using device LTO.
52 if (getDriver().isUsingOffloadLTO())
53 return;
54}
55
56llvm::opt::DerivedArgList *AMDGPUOpenMPToolChain::TranslateArgs(
57 const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
58 Action::OffloadKind DeviceOffloadKind) const {
59 DerivedArgList *DAL =
60 HostTC.TranslateArgs(Args, BoundArch, DeviceOffloadKind);
61
62 if (!DAL)
63 DAL = new DerivedArgList(Args.getBaseArgs());
64
65 const OptTable &Opts = getDriver().getOpts();
66
67 for (Arg *A : Args) {
68 // Sanitizer coverage is currently not supported for AMDGPU.
69 if (A->getOption().matches(options::OPT_fsan_cov_Group)) {
70 diagnoseUnsupportedOption(A, *DAL, Args);
71 continue;
72 }
73
74 if (A->getOption().matches(options::OPT_fsanitize_EQ) &&
75 !Args.hasFlag(options::OPT_fgpu_sanitize, options::OPT_fno_gpu_sanitize,
76 true))
77 continue;
78
79 DAL->append(A);
80 }
81
82 if (!BoundArch.empty()) {
83 DAL->eraseArg(options::OPT_mcpu_EQ);
84 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_mcpu_EQ), BoundArch);
85 }
86
87 return DAL;
88}
89
91 ArgStringList &CC1Args) const {
93 HostTC.addClangWarningOptions(CC1Args);
94}
95
97AMDGPUOpenMPToolChain::GetCXXStdlibType(const ArgList &Args) const {
98 return HostTC.GetCXXStdlibType(Args);
99}
100
102 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1Args) const {
103 HostTC.AddClangCXXStdlibIncludeArgs(Args, CC1Args);
104}
105
107 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
108 HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);
109}
110
112 ArgStringList &CC1Args) const {
113 HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
114}
115
116VersionTuple
118 const ArgList &Args) const {
119 return HostTC.computeMSVCVersion(D, Args);
120}
121
124 const llvm::opt::ArgList &Args,
125 const Action::OffloadKind DeviceOffloadingKind) const {
126 if (!Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true))
127 return {};
128
130 if (!TargetID.OptionalTargetID)
131 return {};
132
134 for (auto BCLib :
136 *TargetID.OptionalGPUArch, DeviceOffloadingKind))
137 BCLibs.emplace_back(BCLib);
138
139 return BCLibs;
140}
Driver - Encapsulate logic for constructing compilation processes from a set of gcc-driver-like comma...
Definition Driver.h:99
const llvm::opt::OptTable & getOpts() const
Definition Driver.h:417
ToolChain - Access to tools for a single platform.
Definition ToolChain.h:93
const Driver & getDriver() const
Definition ToolChain.h:283
path_list & getProgramPaths()
Definition ToolChain.h:326
llvm::SmallVector< BitCodeLibraryInfo, 12 > getDeviceLibs(const llvm::opt::ArgList &Args, const Action::OffloadKind DeviceOffloadKind) const override
Get paths for device libraries.
void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override
Add warning options that need to be passed to cc1 for this target.
void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add arguments to use MCU GCC toolchain includes.
void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1Args) const override
AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set the include paths to use for...
llvm::opt::DerivedArgList * TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const override
TranslateArgs - Create a new derived argument list for any argument translations this ToolChain may w...
CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override
VersionTuple computeMSVCVersion(const Driver *D, const llvm::opt::ArgList &Args) const override
On Windows, returns the MSVC compatibility version.
void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const override
Add the clang cc1 arguments for system include paths.
AMDGPUOpenMPToolChain(const Driver &D, const llvm::Triple &Triple, const ToolChain &HostTC, const llvm::opt::ArgList &Args)
void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind DeviceOffloadKind) const override
Add options that need to be passed to cc1 for this target.
void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override
Common warning options shared by AMDGPU HIP, OpenCL and OpenMP toolchains.
Definition AMDGPU.cpp:872
ParsedTargetIDType getParsedTargetID(const llvm::opt::ArgList &DriverArgs) const
Get target ID, GPU arch, and target ID features if the target ID is specified and valid.
Definition AMDGPU.cpp:907
llvm::SmallVector< BitCodeLibraryInfo, 12 > getCommonDeviceLibNames(const llvm::opt::ArgList &DriverArgs, llvm::StringRef TargetID, llvm::StringRef GPUArch, Action::OffloadKind DeviceOffloadingKind) const
Definition AMDGPU.cpp:1075
ROCMToolChain(const Driver &D, const llvm::Triple &Triple, const llvm::opt::ArgList &Args)
ROCM Toolchain.
Definition AMDGPU.cpp:833
bool diagnoseUnsupportedOption(const llvm::opt::Arg *A, const llvm::opt::DerivedArgList &DAL, const llvm::opt::ArgList &DriverArgs, const char *Value=nullptr) const
Definition AMDGPU.h:155
The JSON file list parser is used to communicate input to InstallAPI.
The struct type returned by getParsedTargetID.
Definition AMDGPU.h:117