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