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 : public GnuTool { 24 public: 25 Assembler(const ToolChain &TC) 26 : GnuTool("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 : public GnuTool { 39 public: 40 Linker(const ToolChain &TC) : GnuTool("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::opt::ArgList &Args, 54 std::vector<StringRef> &Features); 55 56 } // end namespace hexagon. 57 } // end namespace tools 58 59 namespace toolchains { 60 61 class LLVM_LIBRARY_VISIBILITY HexagonToolChain : public Linux { 62 protected: 63 GCCVersion GCCLibAndIncVersion; 64 Tool *buildAssembler() const override; 65 Tool *buildLinker() const override; 66 67 unsigned getOptimizationLevel(const llvm::opt::ArgList &DriverArgs) const; 68 69 public: 70 HexagonToolChain(const Driver &D, const llvm::Triple &Triple, 71 const llvm::opt::ArgList &Args); 72 ~HexagonToolChain() override; 73 74 void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 75 llvm::opt::ArgStringList &CC1Args, 76 Action::OffloadKind DeviceOffloadKind) const override; 77 void 78 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 79 llvm::opt::ArgStringList &CC1Args) const override; 80 void addLibStdCxxIncludePaths( 81 const llvm::opt::ArgList &DriverArgs, 82 llvm::opt::ArgStringList &CC1Args) const override; 83 84 const char *getDefaultLinker() const override { return "hexagon-link"; } 85 86 CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 87 88 StringRef GetGCCLibAndIncVersion() const { return GCCLibAndIncVersion.Text; } 89 bool IsIntegratedAssemblerDefault() const override { 90 return true; 91 } 92 93 std::string getHexagonTargetDir( 94 const std::string &InstalledDir, 95 const SmallVectorImpl<std::string> &PrefixDirs) const; 96 void getHexagonLibraryPaths(const llvm::opt::ArgList &Args, 97 ToolChain::path_list &LibPaths) const; 98 99 static bool isAutoHVXEnabled(const llvm::opt::ArgList &Args); 100 static const StringRef GetDefaultCPU(); 101 static const StringRef GetTargetCPUVersion(const llvm::opt::ArgList &Args); 102 103 static Optional<unsigned> getSmallDataThreshold( 104 const llvm::opt::ArgList &Args); 105 }; 106 107 } // end namespace toolchains 108 } // end namespace driver 109 } // end namespace clang 110 111 #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_HEXAGON_H 112