clang 22.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"
14#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 // Diagnose unsupported sanitizer options only once.
33}
34
36 const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,
37 Action::OffloadKind DeviceOffloadingKind) const {
38 HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);
39
40 assert(DeviceOffloadingKind == Action::OFK_OpenMP &&
41 "Only OpenMP offloading kinds are supported.");
42
43 if (!DriverArgs.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib,
44 true))
45 return;
46
47 for (auto BCFile : getDeviceLibs(DriverArgs, DeviceOffloadingKind)) {
48 CC1Args.push_back(BCFile.ShouldInternalize ? "-mlink-builtin-bitcode"
49 : "-mlink-bitcode-file");
50 CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path));
51 }
52
53 // Link the bitcode library late if we're using device LTO.
54 if (getDriver().isUsingOffloadLTO())
55 return;
56}
57
58llvm::opt::DerivedArgList *AMDGPUOpenMPToolChain::TranslateArgs(
59 const llvm::opt::DerivedArgList &Args, StringRef BoundArch,
60 Action::OffloadKind DeviceOffloadKind) const {
61 DerivedArgList *DAL =
62 HostTC.TranslateArgs(Args, BoundArch, DeviceOffloadKind);
63
64 if (!DAL)
65 DAL = new DerivedArgList(Args.getBaseArgs());
66
67 const OptTable &Opts = getDriver().getOpts();
68
69 // Skip sanitize options passed from the HostTC. Claim them early.
70 // The decision to sanitize device code is computed only by
71 // 'shouldSkipSanitizeOption'.
72 if (DAL->hasArg(options::OPT_fsanitize_EQ))
73 DAL->claimAllArgs(options::OPT_fsanitize_EQ);
74
75 for (Arg *A : Args)
76 if (!shouldSkipSanitizeOption(*this, Args, BoundArch, A) &&
77 !llvm::is_contained(*DAL, A))
78 DAL->append(A);
79
80 if (!BoundArch.empty()) {
81 DAL->eraseArg(options::OPT_march_EQ);
82 DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ),
83 BoundArch);
84 }
85
86 return DAL;
87}
88
90 ArgStringList &CC1Args) const {
93}
94
96AMDGPUOpenMPToolChain::GetCXXStdlibType(const ArgList &Args) const {
97 return HostTC.GetCXXStdlibType(Args);
98}
99
101 const llvm::opt::ArgList &Args, llvm::opt::ArgStringList &CC1Args) const {
103}
104
106 const ArgList &DriverArgs, ArgStringList &CC1Args) const {
107 HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);
108}
109
111 ArgStringList &CC1Args) const {
112 HostTC.AddIAMCUIncludeArgs(Args, CC1Args);
113}
114
116 // The AMDGPUOpenMPToolChain only supports sanitizers in the sense that it
117 // allows sanitizer arguments on the command line if they are supported by the
118 // host toolchain. The AMDGPUOpenMPToolChain will actually ignore any command
119 // line arguments for any of these "supported" sanitizers. That means that no
120 // sanitization of device code is actually supported at this time.
121 //
122 // This behavior is necessary because the host and device toolchains
123 // invocations often share the command line, so the device toolchain must
124 // tolerate flags meant only for the host toolchain.
126}
127
128VersionTuple
130 const ArgList &Args) const {
131 return HostTC.computeMSVCVersion(D, Args);
132}
133
136 const llvm::opt::ArgList &Args,
137 const Action::OffloadKind DeviceOffloadingKind) const {
138 if (!Args.hasFlag(options::OPT_offloadlib, options::OPT_no_offloadlib, true))
139 return {};
140
141 StringRef GpuArch = getProcessorFromTargetID(
142 getTriple(), Args.getLastArgValue(options::OPT_march_EQ));
143
145 for (auto BCLib :
146 getCommonDeviceLibNames(Args, GpuArch.str(), DeviceOffloadingKind))
147 BCLibs.emplace_back(BCLib);
148
149 return BCLibs;
150}
const Decl * D
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:428
ToolChain - Access to tools for a single platform.
Definition: ToolChain.h:92
virtual void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const
Add warning options that need to be passed to cc1 for this target.
Definition: ToolChain.cpp:1308
const Driver & getDriver() const
Definition: ToolChain.h:253
path_list & getProgramPaths()
Definition: ToolChain.h:298
virtual llvm::opt::DerivedArgList * TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch, Action::OffloadKind DeviceOffloadKind) const
TranslateArgs - Create a new derived argument list for any argument translations this ToolChain may w...
Definition: ToolChain.h:359
const llvm::Triple & getTriple() const
Definition: ToolChain.h:255
virtual void AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
AddClangCXXStdlibIncludeArgs - Add the clang -cc1 level arguments to set the include paths to use for...
Definition: ToolChain.cpp:1493
virtual VersionTuple computeMSVCVersion(const Driver *D, const llvm::opt::ArgList &Args) const
On Windows, returns the MSVC compatibility version.
Definition: ToolChain.cpp:1672
virtual void AddIAMCUIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
Add arguments to use MCU GCC toolchain includes.
Definition: ToolChain.cpp:1655
virtual CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const
Definition: ToolChain.cpp:1380
virtual void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args, Action::OffloadKind DeviceOffloadKind) const
Add options that need to be passed to cc1 for this target.
Definition: ToolChain.cpp:1301
virtual void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args) const
Add the clang cc1 arguments for system include paths.
Definition: ToolChain.cpp:1296
virtual SanitizerMask getSupportedSanitizers() const
Return sanitizers which are available in this toolchain.
Definition: ToolChain.cpp:1614
llvm::SmallVector< BitCodeLibraryInfo, 12 > getDeviceLibs(const llvm::opt::ArgList &Args, const Action::OffloadKind DeviceOffloadKind) const override
Get paths for device libraries.
SanitizerMask getSupportedSanitizers() const override
Return sanitizers which are available in this toolchain.
void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override
Common warning options shared by AMDGPU HIP, OpenCL and OpenMP toolchains.
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.
bool shouldSkipSanitizeOption(const ToolChain &TC, const llvm::opt::ArgList &DriverArgs, StringRef TargetID, const llvm::opt::Arg *A) const
Should skip sanitize options.
Definition: AMDGPU.cpp:1052
void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override
Common warning options shared by AMDGPU HIP, OpenCL and OpenMP toolchains.
Definition: AMDGPU.cpp:865
llvm::SmallVector< BitCodeLibraryInfo, 12 > getCommonDeviceLibNames(const llvm::opt::ArgList &DriverArgs, const std::string &GPUArch, Action::OffloadKind DeviceOffloadingKind) const
Definition: AMDGPU.cpp:1034
void diagnoseUnsupportedSanitizers(const llvm::opt::ArgList &Args) const
Definition: AMDGPU.h:155
The JSON file list parser is used to communicate input to InstallAPI.
llvm::StringRef getProcessorFromTargetID(const llvm::Triple &T, llvm::StringRef OffloadArch)
Get processor name from target ID.
Definition: TargetID.cpp:54