Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/AMDGPUOpenMP.cpp
35269 views
//===- AMDGPUOpenMP.cpp - AMDGPUOpenMP ToolChain Implementation -*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "AMDGPUOpenMP.h"9#include "AMDGPU.h"10#include "CommonArgs.h"11#include "ToolChains/ROCm.h"12#include "clang/Basic/DiagnosticDriver.h"13#include "clang/Driver/Compilation.h"14#include "clang/Driver/Driver.h"15#include "clang/Driver/DriverDiagnostic.h"16#include "clang/Driver/InputInfo.h"17#include "clang/Driver/Options.h"18#include "clang/Driver/Tool.h"19#include "llvm/ADT/STLExtras.h"20#include "llvm/Support/FileSystem.h"21#include "llvm/Support/FormatAdapters.h"22#include "llvm/Support/FormatVariadic.h"23#include "llvm/Support/Path.h"2425using namespace clang::driver;26using namespace clang::driver::toolchains;27using namespace clang::driver::tools;28using namespace clang;29using namespace llvm::opt;3031AMDGPUOpenMPToolChain::AMDGPUOpenMPToolChain(const Driver &D,32const llvm::Triple &Triple,33const ToolChain &HostTC,34const ArgList &Args)35: ROCMToolChain(D, Triple, Args), HostTC(HostTC) {36// Lookup binaries into the driver directory, this is used to37// discover the 'amdgpu-arch' executable.38getProgramPaths().push_back(getDriver().Dir);39}4041void AMDGPUOpenMPToolChain::addClangTargetOptions(42const llvm::opt::ArgList &DriverArgs, llvm::opt::ArgStringList &CC1Args,43Action::OffloadKind DeviceOffloadingKind) const {44HostTC.addClangTargetOptions(DriverArgs, CC1Args, DeviceOffloadingKind);4546assert(DeviceOffloadingKind == Action::OFK_OpenMP &&47"Only OpenMP offloading kinds are supported.");4849if (DriverArgs.hasArg(options::OPT_nogpulib))50return;5152for (auto BCFile : getDeviceLibs(DriverArgs)) {53CC1Args.push_back(BCFile.ShouldInternalize ? "-mlink-builtin-bitcode"54: "-mlink-bitcode-file");55CC1Args.push_back(DriverArgs.MakeArgString(BCFile.Path));56}5758// Link the bitcode library late if we're using device LTO.59if (getDriver().isUsingLTO(/* IsOffload */ true))60return;61}6263llvm::opt::DerivedArgList *AMDGPUOpenMPToolChain::TranslateArgs(64const llvm::opt::DerivedArgList &Args, StringRef BoundArch,65Action::OffloadKind DeviceOffloadKind) const {66DerivedArgList *DAL =67HostTC.TranslateArgs(Args, BoundArch, DeviceOffloadKind);68if (!DAL)69DAL = new DerivedArgList(Args.getBaseArgs());7071const OptTable &Opts = getDriver().getOpts();7273if (DeviceOffloadKind == Action::OFK_OpenMP) {74for (Arg *A : Args)75if (!llvm::is_contained(*DAL, A))76DAL->append(A);7778if (!DAL->hasArg(options::OPT_march_EQ)) {79StringRef Arch = BoundArch;80if (Arch.empty()) {81auto ArchsOrErr = getSystemGPUArchs(Args);82if (!ArchsOrErr) {83std::string ErrMsg =84llvm::formatv("{0}", llvm::fmt_consume(ArchsOrErr.takeError()));85getDriver().Diag(diag::err_drv_undetermined_gpu_arch)86<< llvm::Triple::getArchTypeName(getArch()) << ErrMsg << "-march";87Arch = OffloadArchToString(OffloadArch::HIPDefault);88} else {89Arch = Args.MakeArgString(ArchsOrErr->front());90}91}92DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ), Arch);93}9495return DAL;96}9798for (Arg *A : Args) {99DAL->append(A);100}101102if (!BoundArch.empty()) {103DAL->eraseArg(options::OPT_march_EQ);104DAL->AddJoinedArg(nullptr, Opts.getOption(options::OPT_march_EQ),105BoundArch);106}107108return DAL;109}110111void AMDGPUOpenMPToolChain::addClangWarningOptions(112ArgStringList &CC1Args) const {113AMDGPUToolChain::addClangWarningOptions(CC1Args);114HostTC.addClangWarningOptions(CC1Args);115}116117ToolChain::CXXStdlibType118AMDGPUOpenMPToolChain::GetCXXStdlibType(const ArgList &Args) const {119return HostTC.GetCXXStdlibType(Args);120}121122void AMDGPUOpenMPToolChain::AddClangSystemIncludeArgs(123const ArgList &DriverArgs, ArgStringList &CC1Args) const {124HostTC.AddClangSystemIncludeArgs(DriverArgs, CC1Args);125}126127void AMDGPUOpenMPToolChain::AddIAMCUIncludeArgs(const ArgList &Args,128ArgStringList &CC1Args) const {129HostTC.AddIAMCUIncludeArgs(Args, CC1Args);130}131132SanitizerMask AMDGPUOpenMPToolChain::getSupportedSanitizers() const {133// The AMDGPUOpenMPToolChain only supports sanitizers in the sense that it134// allows sanitizer arguments on the command line if they are supported by the135// host toolchain. The AMDGPUOpenMPToolChain will actually ignore any command136// line arguments for any of these "supported" sanitizers. That means that no137// sanitization of device code is actually supported at this time.138//139// This behavior is necessary because the host and device toolchains140// invocations often share the command line, so the device toolchain must141// tolerate flags meant only for the host toolchain.142return HostTC.getSupportedSanitizers();143}144145VersionTuple146AMDGPUOpenMPToolChain::computeMSVCVersion(const Driver *D,147const ArgList &Args) const {148return HostTC.computeMSVCVersion(D, Args);149}150151llvm::SmallVector<ToolChain::BitCodeLibraryInfo, 12>152AMDGPUOpenMPToolChain::getDeviceLibs(const llvm::opt::ArgList &Args) const {153if (Args.hasArg(options::OPT_nogpulib))154return {};155156if (!RocmInstallation->hasDeviceLibrary()) {157getDriver().Diag(diag::err_drv_no_rocm_device_lib) << 0;158return {};159}160161StringRef GpuArch = getProcessorFromTargetID(162getTriple(), Args.getLastArgValue(options::OPT_march_EQ));163164SmallVector<BitCodeLibraryInfo, 12> BCLibs;165for (auto BCLib : getCommonDeviceLibNames(Args, GpuArch.str(),166/*IsOpenMP=*/true))167BCLibs.emplace_back(BCLib);168169return BCLibs;170}171172173