Path: blob/main/contrib/llvm-project/clang/lib/Driver/ToolChains/AMDGPU.h
35269 views
//===--- AMDGPU.h - AMDGPU ToolChain Implementations ----------*- 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#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AMDGPU_H9#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AMDGPU_H1011#include "Gnu.h"12#include "ROCm.h"13#include "clang/Basic/TargetID.h"14#include "clang/Driver/Options.h"15#include "clang/Driver/Tool.h"16#include "clang/Driver/ToolChain.h"17#include "llvm/ADT/SmallString.h"18#include "llvm/TargetParser/TargetParser.h"1920#include <map>2122namespace clang {23namespace driver {2425namespace tools {26namespace amdgpu {2728class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {29public:30Linker(const ToolChain &TC) : Tool("amdgpu::Linker", "ld.lld", TC) {}31bool isLinkJob() const override { return true; }32bool hasIntegratedCPP() const override { return false; }33void ConstructJob(Compilation &C, const JobAction &JA,34const InputInfo &Output, const InputInfoList &Inputs,35const llvm::opt::ArgList &TCArgs,36const char *LinkingOutput) const override;37};3839void getAMDGPUTargetFeatures(const Driver &D, const llvm::Triple &Triple,40const llvm::opt::ArgList &Args,41std::vector<StringRef> &Features);4243} // end namespace amdgpu44} // end namespace tools4546namespace toolchains {4748class LLVM_LIBRARY_VISIBILITY AMDGPUToolChain : public Generic_ELF {49protected:50const std::map<options::ID, const StringRef> OptionsDefault;5152Tool *buildLinker() const override;53StringRef getOptionDefault(options::ID OptID) const {54auto opt = OptionsDefault.find(OptID);55assert(opt != OptionsDefault.end() && "No Default for Option");56return opt->second;57}5859public:60AMDGPUToolChain(const Driver &D, const llvm::Triple &Triple,61const llvm::opt::ArgList &Args);62unsigned GetDefaultDwarfVersion() const override { return 5; }6364bool IsMathErrnoDefault() const override { return false; }65bool isCrossCompiling() const override { return true; }66bool isPICDefault() const override { return true; }67bool isPIEDefault(const llvm::opt::ArgList &Args) const override {68return false;69}70bool isPICDefaultForced() const override { return true; }71bool SupportsProfiling() const override { return false; }7273llvm::opt::DerivedArgList *74TranslateArgs(const llvm::opt::DerivedArgList &Args, StringRef BoundArch,75Action::OffloadKind DeviceOffloadKind) const override;7677void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,78llvm::opt::ArgStringList &CC1Args,79Action::OffloadKind DeviceOffloadKind) const override;8081/// Return whether denormals should be flushed, and treated as 0 by default82/// for the subtarget.83static bool getDefaultDenormsAreZeroForTarget(llvm::AMDGPU::GPUKind GPUKind);8485llvm::DenormalMode getDefaultDenormalModeForType(86const llvm::opt::ArgList &DriverArgs, const JobAction &JA,87const llvm::fltSemantics *FPType = nullptr) const override;8889static bool isWave64(const llvm::opt::ArgList &DriverArgs,90llvm::AMDGPU::GPUKind Kind);91/// Needed for using lto.92bool HasNativeLLVMSupport() const override {93return true;94}9596/// Needed for translating LTO options.97const char *getDefaultLinker() const override { return "ld.lld"; }9899/// Uses amdgpu-arch tool to get arch of the system GPU. Will return error100/// if unable to find one.101virtual Expected<SmallVector<std::string>>102getSystemGPUArchs(const llvm::opt::ArgList &Args) const override;103104protected:105/// Check and diagnose invalid target ID specified by -mcpu.106virtual void checkTargetID(const llvm::opt::ArgList &DriverArgs) const;107108/// The struct type returned by getParsedTargetID.109struct ParsedTargetIDType {110std::optional<std::string> OptionalTargetID;111std::optional<std::string> OptionalGPUArch;112std::optional<llvm::StringMap<bool>> OptionalFeatures;113};114115/// Get target ID, GPU arch, and target ID features if the target ID is116/// specified and valid.117ParsedTargetIDType118getParsedTargetID(const llvm::opt::ArgList &DriverArgs) const;119120/// Get GPU arch from -mcpu without checking.121StringRef getGPUArch(const llvm::opt::ArgList &DriverArgs) const;122123/// Common warning options shared by AMDGPU HIP, OpenCL and OpenMP toolchains.124/// Language specific warning options should go to derived classes.125void addClangWarningOptions(llvm::opt::ArgStringList &CC1Args) const override;126};127128class LLVM_LIBRARY_VISIBILITY ROCMToolChain : public AMDGPUToolChain {129public:130ROCMToolChain(const Driver &D, const llvm::Triple &Triple,131const llvm::opt::ArgList &Args);132void133addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,134llvm::opt::ArgStringList &CC1Args,135Action::OffloadKind DeviceOffloadKind) const override;136137// Returns a list of device library names shared by different languages138llvm::SmallVector<std::string, 12>139getCommonDeviceLibNames(const llvm::opt::ArgList &DriverArgs,140const std::string &GPUArch,141bool isOpenMP = false) const;142SanitizerMask getSupportedSanitizers() const override {143return SanitizerKind::Address;144}145};146147} // end namespace toolchains148} // end namespace driver149} // end namespace clang150151#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AMDGPU_H152153154