1e5dd7070Spatrick //===--- Hexagon.h - Hexagon ToolChain Implementations ----------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick 9e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HEXAGON_H 10e5dd7070Spatrick #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HEXAGON_H 11e5dd7070Spatrick 12e5dd7070Spatrick #include "Linux.h" 13e5dd7070Spatrick #include "clang/Driver/Tool.h" 14e5dd7070Spatrick #include "clang/Driver/ToolChain.h" 15e5dd7070Spatrick 16e5dd7070Spatrick namespace clang { 17e5dd7070Spatrick namespace driver { 18e5dd7070Spatrick namespace tools { 19e5dd7070Spatrick namespace hexagon { 20e5dd7070Spatrick // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile 21e5dd7070Spatrick // and Compile. 22e5dd7070Spatrick // We simply use "clang -cc1" for those actions. 23ec727ea7Spatrick class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 24e5dd7070Spatrick public: Assembler(const ToolChain & TC)25e5dd7070Spatrick Assembler(const ToolChain &TC) 26ec727ea7Spatrick : Tool("hexagon::Assembler", "hexagon-as", TC) {} 27e5dd7070Spatrick hasIntegratedCPP()28e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } 29e5dd7070Spatrick 30e5dd7070Spatrick void RenderExtraToolArgs(const JobAction &JA, 31e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs) const; 32e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 33e5dd7070Spatrick const InputInfo &Output, const InputInfoList &Inputs, 34e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 35e5dd7070Spatrick const char *LinkingOutput) const override; 36e5dd7070Spatrick }; 37e5dd7070Spatrick 38ec727ea7Spatrick class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 39e5dd7070Spatrick public: Linker(const ToolChain & TC)40ec727ea7Spatrick Linker(const ToolChain &TC) : Tool("hexagon::Linker", "hexagon-ld", TC) {} 41e5dd7070Spatrick hasIntegratedCPP()42e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } isLinkJob()43e5dd7070Spatrick bool isLinkJob() const override { return true; } 44e5dd7070Spatrick 45e5dd7070Spatrick virtual void RenderExtraToolArgs(const JobAction &JA, 46e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs) const; 47e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 48e5dd7070Spatrick const InputInfo &Output, const InputInfoList &Inputs, 49e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 50e5dd7070Spatrick const char *LinkingOutput) const override; 51e5dd7070Spatrick }; 52e5dd7070Spatrick 53e5dd7070Spatrick void getHexagonTargetFeatures(const Driver &D, const llvm::opt::ArgList &Args, 54e5dd7070Spatrick std::vector<StringRef> &Features); 55e5dd7070Spatrick 56e5dd7070Spatrick } // end namespace hexagon. 57e5dd7070Spatrick } // end namespace tools 58e5dd7070Spatrick 59e5dd7070Spatrick namespace toolchains { 60e5dd7070Spatrick 61e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux { 62e5dd7070Spatrick protected: 63e5dd7070Spatrick GCCVersion GCCLibAndIncVersion; 64e5dd7070Spatrick Tool *buildAssembler() const override; 65e5dd7070Spatrick Tool *buildLinker() const override; 66e5dd7070Spatrick 67e5dd7070Spatrick unsigned getOptimizationLevel(const llvm::opt::ArgList &DriverArgs) const; 68e5dd7070Spatrick 69e5dd7070Spatrick public: 70e5dd7070Spatrick HexagonToolChain(const Driver &D, const llvm::Triple &Triple, 71e5dd7070Spatrick const llvm::opt::ArgList &Args); 72e5dd7070Spatrick ~HexagonToolChain() override; 73e5dd7070Spatrick 74e5dd7070Spatrick void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 75e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args, 76e5dd7070Spatrick Action::OffloadKind DeviceOffloadKind) const override; 77e5dd7070Spatrick void 78e5dd7070Spatrick AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 79e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override; 80e5dd7070Spatrick void addLibStdCxxIncludePaths( 81e5dd7070Spatrick const llvm::opt::ArgList &DriverArgs, 82e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override; 83e5dd7070Spatrick 84ec727ea7Spatrick void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 85ec727ea7Spatrick llvm::opt::ArgStringList &CC1Args) const override; 86ec727ea7Spatrick getDefaultLinker()87ec727ea7Spatrick const char *getDefaultLinker() const override { 88ec727ea7Spatrick return getTriple().isMusl() ? "ld.lld" : "hexagon-link"; 89ec727ea7Spatrick } 90e5dd7070Spatrick 91e5dd7070Spatrick CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 92e5dd7070Spatrick 93ec727ea7Spatrick void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 94ec727ea7Spatrick llvm::opt::ArgStringList &CmdArgs) const override; 95ec727ea7Spatrick GetGCCLibAndIncVersion()96e5dd7070Spatrick StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } 97e5dd7070Spatrick 98e5dd7070Spatrick std::string getHexagonTargetDir( 99e5dd7070Spatrick const std::string &InstalledDir, 100e5dd7070Spatrick const SmallVectorImpl<std::string> &PrefixDirs) const; 101e5dd7070Spatrick void getHexagonLibraryPaths(const llvm::opt::ArgList &Args, 102e5dd7070Spatrick ToolChain::path_list &LibPaths) const; 103e5dd7070Spatrick 104*12c85518Srobert std::string getCompilerRTPath() const override; 105e5dd7070Spatrick 106*12c85518Srobert static bool isAutoHVXEnabled(const llvm::opt::ArgList &Args); 107*12c85518Srobert static StringRef GetDefaultCPU(); 108*12c85518Srobert static StringRef GetTargetCPUVersion(const llvm::opt::ArgList &Args); 109*12c85518Srobert 110*12c85518Srobert static std::optional<unsigned> 111*12c85518Srobert getSmallDataThreshold(const llvm::opt::ArgList &Args); 112e5dd7070Spatrick }; 113e5dd7070Spatrick 114e5dd7070Spatrick } // end namespace toolchains 115e5dd7070Spatrick } // end namespace driver 116e5dd7070Spatrick } // end namespace clang 117e5dd7070Spatrick 118e5dd7070Spatrick #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HEXAGON_H 119