xref: /freebsd-src/contrib/llvm-project/clang/lib/Driver/ToolChains/OHOS.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
1*06c3fb27SDimitry Andric //===--- OHOS.h - OHOS ToolChain Implementations ----------*- C++ -*-===//
2*06c3fb27SDimitry Andric //
3*06c3fb27SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06c3fb27SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*06c3fb27SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06c3fb27SDimitry Andric //
7*06c3fb27SDimitry Andric //===----------------------------------------------------------------------===//
8*06c3fb27SDimitry Andric 
9*06c3fb27SDimitry Andric #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OHOS_H
10*06c3fb27SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OHOS_H
11*06c3fb27SDimitry Andric 
12*06c3fb27SDimitry Andric #include "Linux.h"
13*06c3fb27SDimitry Andric #include "clang/Driver/Tool.h"
14*06c3fb27SDimitry Andric #include "clang/Driver/ToolChain.h"
15*06c3fb27SDimitry Andric 
16*06c3fb27SDimitry Andric namespace clang {
17*06c3fb27SDimitry Andric namespace driver {
18*06c3fb27SDimitry Andric namespace toolchains {
19*06c3fb27SDimitry Andric 
20*06c3fb27SDimitry Andric class LLVM_LIBRARY_VISIBILITY OHOS : public Generic_ELF {
21*06c3fb27SDimitry Andric public:
22*06c3fb27SDimitry Andric   OHOS(const Driver &D, const llvm::Triple &Triple,
23*06c3fb27SDimitry Andric           const llvm::opt::ArgList &Args);
24*06c3fb27SDimitry Andric 
HasNativeLLVMSupport()25*06c3fb27SDimitry Andric   bool HasNativeLLVMSupport() const override { return true; }
26*06c3fb27SDimitry Andric 
IsMathErrnoDefault()27*06c3fb27SDimitry Andric   bool IsMathErrnoDefault() const override { return false; }
28*06c3fb27SDimitry Andric 
GetDefaultRuntimeLibType()29*06c3fb27SDimitry Andric   RuntimeLibType GetDefaultRuntimeLibType() const override {
30*06c3fb27SDimitry Andric     return ToolChain::RLT_CompilerRT;
31*06c3fb27SDimitry Andric   }
GetDefaultCXXStdlibType()32*06c3fb27SDimitry Andric   CXXStdlibType GetDefaultCXXStdlibType() const override {
33*06c3fb27SDimitry Andric     return ToolChain::CST_Libcxx;
34*06c3fb27SDimitry Andric   }
35*06c3fb27SDimitry Andric   // Not add -funwind-tables by default
isPICDefault()36*06c3fb27SDimitry Andric   bool isPICDefault() const override { return false; }
isPIEDefault(const llvm::opt::ArgList & Args)37*06c3fb27SDimitry Andric   bool isPIEDefault(const llvm::opt::ArgList &Args) const override { return true; }
isPICDefaultForced()38*06c3fb27SDimitry Andric   bool isPICDefaultForced() const override { return false; }
39*06c3fb27SDimitry Andric   UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const override;
GetDefaultUnwindLibType()40*06c3fb27SDimitry Andric   UnwindLibType GetDefaultUnwindLibType() const override { return UNW_CompilerRT; }
41*06c3fb27SDimitry Andric 
42*06c3fb27SDimitry Andric   RuntimeLibType
43*06c3fb27SDimitry Andric   GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;
44*06c3fb27SDimitry Andric   CXXStdlibType
45*06c3fb27SDimitry Andric   GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
46*06c3fb27SDimitry Andric 
47*06c3fb27SDimitry Andric   void
48*06c3fb27SDimitry Andric   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
49*06c3fb27SDimitry Andric                             llvm::opt::ArgStringList &CC1Args) const override;
50*06c3fb27SDimitry Andric   void
51*06c3fb27SDimitry Andric   AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
52*06c3fb27SDimitry Andric                                llvm::opt::ArgStringList &CC1Args) const override;
53*06c3fb27SDimitry Andric   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
54*06c3fb27SDimitry Andric                            llvm::opt::ArgStringList &CmdArgs) const override;
55*06c3fb27SDimitry Andric 
56*06c3fb27SDimitry Andric   std::string computeSysRoot() const override;
57*06c3fb27SDimitry Andric   std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override;
58*06c3fb27SDimitry Andric 
59*06c3fb27SDimitry Andric   std::string
60*06c3fb27SDimitry Andric   getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
61*06c3fb27SDimitry Andric                 FileType Type = ToolChain::FT_Static) const override;
62*06c3fb27SDimitry Andric 
getDefaultLinker()63*06c3fb27SDimitry Andric   const char *getDefaultLinker() const override {
64*06c3fb27SDimitry Andric     return "ld.lld";
65*06c3fb27SDimitry Andric   }
66*06c3fb27SDimitry Andric 
buildLinker()67*06c3fb27SDimitry Andric   Tool *buildLinker() const override {
68*06c3fb27SDimitry Andric     return new tools::gnutools::Linker(*this);
69*06c3fb27SDimitry Andric   }
buildAssembler()70*06c3fb27SDimitry Andric   Tool *buildAssembler() const override {
71*06c3fb27SDimitry Andric     return new tools::gnutools::Assembler(*this);
72*06c3fb27SDimitry Andric   }
73*06c3fb27SDimitry Andric 
74*06c3fb27SDimitry Andric   path_list getRuntimePaths() const;
75*06c3fb27SDimitry Andric 
76*06c3fb27SDimitry Andric protected:
77*06c3fb27SDimitry Andric   std::string getMultiarchTriple(const llvm::Triple &T) const;
78*06c3fb27SDimitry Andric   std::string getMultiarchTriple(const Driver &D,
79*06c3fb27SDimitry Andric                                  const llvm::Triple &TargetTriple,
80*06c3fb27SDimitry Andric                                  StringRef SysRoot) const override;
81*06c3fb27SDimitry Andric   void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const override;
82*06c3fb27SDimitry Andric   SanitizerMask getSupportedSanitizers() const override;
83*06c3fb27SDimitry Andric   void addProfileRTLibs(const llvm::opt::ArgList &Args,
84*06c3fb27SDimitry Andric                              llvm::opt::ArgStringList &CmdArgs) const override;
85*06c3fb27SDimitry Andric   path_list getArchSpecificLibPaths() const override;
86*06c3fb27SDimitry Andric 
87*06c3fb27SDimitry Andric private:
88*06c3fb27SDimitry Andric   Multilib SelectedMultilib;
89*06c3fb27SDimitry Andric };
90*06c3fb27SDimitry Andric 
91*06c3fb27SDimitry Andric } // end namespace toolchains
92*06c3fb27SDimitry Andric } // end namespace driver
93*06c3fb27SDimitry Andric } // end namespace clang
94*06c3fb27SDimitry Andric 
95*06c3fb27SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OHOS_H
96