1147072Sbrooks//===--- OHOS.h - OHOS ToolChain Implementations ----------*- C++ -*-===//
2147072Sbrooks//
3147072Sbrooks// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4147072Sbrooks// See https://llvm.org/LICENSE.txt for license information.
5147072Sbrooks// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6147072Sbrooks//
7147072Sbrooks//===----------------------------------------------------------------------===//
8147072Sbrooks
9147072Sbrooks#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OHOS_H
10147072Sbrooks#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OHOS_H
11147072Sbrooks
12147072Sbrooks#include "Linux.h"
13147072Sbrooks#include "clang/Driver/Tool.h"
14147072Sbrooks#include "clang/Driver/ToolChain.h"
15147072Sbrooks
16147072Sbrooksnamespace clang {
17147072Sbrooksnamespace driver {
18147072Sbrooksnamespace toolchains {
19147072Sbrooks
20147072Sbrooksclass LLVM_LIBRARY_VISIBILITY OHOS : public Generic_ELF {
21147072Sbrookspublic:
22147072Sbrooks  OHOS(const Driver &D, const llvm::Triple &Triple,
23147072Sbrooks          const llvm::opt::ArgList &Args);
24147072Sbrooks
25147072Sbrooks  bool HasNativeLLVMSupport() const override { return true; }
26147072Sbrooks
27147072Sbrooks  bool IsMathErrnoDefault() const override { return false; }
28147072Sbrooks
29147072Sbrooks  RuntimeLibType GetDefaultRuntimeLibType() const override {
30147072Sbrooks    return ToolChain::RLT_CompilerRT;
31147072Sbrooks  }
32147072Sbrooks  CXXStdlibType GetDefaultCXXStdlibType() const override {
33147072Sbrooks    return ToolChain::CST_Libcxx;
34147072Sbrooks  }
35147072Sbrooks  // Not add -funwind-tables by default
36147072Sbrooks  bool isPICDefault() const override { return false; }
37147072Sbrooks  bool isPIEDefault(const llvm::opt::ArgList &Args) const override { return true; }
38147072Sbrooks  bool isPICDefaultForced() const override { return false; }
39147072Sbrooks  UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const override;
40147072Sbrooks  UnwindLibType GetDefaultUnwindLibType() const override { return UNW_CompilerRT; }
41147072Sbrooks
42149399Sbrooks  RuntimeLibType
43149399Sbrooks  GetRuntimeLibType(const llvm::opt::ArgList &Args) const override;
44149399Sbrooks  CXXStdlibType
45147072Sbrooks  GetCXXStdlibType(const llvm::opt::ArgList &Args) const override;
46147072Sbrooks
47147072Sbrooks  void
48147072Sbrooks  AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
49147072Sbrooks                            llvm::opt::ArgStringList &CC1Args) const override;
50147072Sbrooks  void
51147072Sbrooks  AddClangCXXStdlibIncludeArgs(const llvm::opt::ArgList &DriverArgs,
52147072Sbrooks                               llvm::opt::ArgStringList &CC1Args) const override;
53147072Sbrooks  void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
54147072Sbrooks                           llvm::opt::ArgStringList &CmdArgs) const override;
55147072Sbrooks
56147072Sbrooks  std::string computeSysRoot() const override;
57147072Sbrooks  std::string getDynamicLinker(const llvm::opt::ArgList &Args) const override;
58147072Sbrooks
59147072Sbrooks  std::string
60147072Sbrooks  getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
61147072Sbrooks                FileType Type = ToolChain::FT_Static) const override;
62147072Sbrooks
63147072Sbrooks  const char *getDefaultLinker() const override {
64147072Sbrooks    return "ld.lld";
65147072Sbrooks  }
66147072Sbrooks
67147072Sbrooks  Tool *buildLinker() const override {
68147072Sbrooks    return new tools::gnutools::Linker(*this);
69147072Sbrooks  }
70147072Sbrooks  Tool *buildAssembler() const override {
71147072Sbrooks    return new tools::gnutools::Assembler(*this);
72147072Sbrooks  }
73147072Sbrooks
74147072Sbrooks  path_list getRuntimePaths() const;
75147072Sbrooks
76147072Sbrooksprotected:
77147072Sbrooks  std::string getMultiarchTriple(const llvm::Triple &T) const;
78147072Sbrooks  std::string getMultiarchTriple(const Driver &D,
79147072Sbrooks                                 const llvm::Triple &TargetTriple,
80147072Sbrooks                                 StringRef SysRoot) const override;
81147072Sbrooks  void addExtraOpts(llvm::opt::ArgStringList &CmdArgs) const override;
82147072Sbrooks  SanitizerMask getSupportedSanitizers() const override;
83147072Sbrooks  void addProfileRTLibs(const llvm::opt::ArgList &Args,
84147072Sbrooks                             llvm::opt::ArgStringList &CmdArgs) const override;
85147072Sbrooks  path_list getArchSpecificLibPaths() const override;
86147072Sbrooks
87147072Sbrooksprivate:
88147072Sbrooks  Multilib SelectedMultilib;
89147072Sbrooks};
90147072Sbrooks
91147072Sbrooks} // end namespace toolchains
92147072Sbrooks} // end namespace driver
93147072Sbrooks} // end namespace clang
94147072Sbrooks
95147072Sbrooks#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OHOS_H
96147072Sbrooks