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