1e5dd7070Spatrick //===--- Fuchsia.h - Fuchsia ToolChain Implementations ----------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick 9e5dd7070Spatrick #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FUCHSIA_H 10e5dd7070Spatrick #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FUCHSIA_H 11e5dd7070Spatrick 12e5dd7070Spatrick #include "Gnu.h" 13a9ac8606Spatrick #include "clang/Basic/LangOptions.h" 14e5dd7070Spatrick #include "clang/Driver/Tool.h" 15e5dd7070Spatrick #include "clang/Driver/ToolChain.h" 16e5dd7070Spatrick 17e5dd7070Spatrick namespace clang { 18e5dd7070Spatrick namespace driver { 19e5dd7070Spatrick namespace tools { 20e5dd7070Spatrick namespace fuchsia { 21e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 22e5dd7070Spatrick public: Linker(const ToolChain & TC)23e5dd7070Spatrick Linker(const ToolChain &TC) : Tool("fuchsia::Linker", "ld.lld", TC) {} 24e5dd7070Spatrick hasIntegratedCPP()25e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } isLinkJob()26e5dd7070Spatrick bool isLinkJob() const override { return true; } 27e5dd7070Spatrick 28e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 29e5dd7070Spatrick const InputInfo &Output, const InputInfoList &Inputs, 30e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 31e5dd7070Spatrick const char *LinkingOutput) const override; 32e5dd7070Spatrick }; 33e5dd7070Spatrick } // end namespace fuchsia 34e5dd7070Spatrick } // end namespace tools 35e5dd7070Spatrick 36e5dd7070Spatrick namespace toolchains { 37e5dd7070Spatrick 38e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY Fuchsia : public ToolChain { 39e5dd7070Spatrick public: 40e5dd7070Spatrick Fuchsia(const Driver &D, const llvm::Triple &Triple, 41e5dd7070Spatrick const llvm::opt::ArgList &Args); 42e5dd7070Spatrick HasNativeLLVMSupport()43e5dd7070Spatrick bool HasNativeLLVMSupport() const override { return true; } IsIntegratedAssemblerDefault()44e5dd7070Spatrick bool IsIntegratedAssemblerDefault() const override { return true; } IsMathErrnoDefault()45e5dd7070Spatrick bool IsMathErrnoDefault() const override { return false; } useRelaxRelocations()46e5dd7070Spatrick bool useRelaxRelocations() const override { return true; }; GetDefaultRuntimeLibType()47e5dd7070Spatrick RuntimeLibType GetDefaultRuntimeLibType() const override { 48e5dd7070Spatrick return ToolChain::RLT_CompilerRT; 49e5dd7070Spatrick } GetDefaultCXXStdlibType()50e5dd7070Spatrick CXXStdlibType GetDefaultCXXStdlibType() const override { 51e5dd7070Spatrick return ToolChain::CST_Libcxx; 52e5dd7070Spatrick } 53*12c85518Srobert UnwindTableLevel getDefaultUnwindTableLevel(const llvm::opt::ArgList & Args)54*12c85518Srobert getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { 55*12c85518Srobert return UnwindTableLevel::Asynchronous; 56e5dd7070Spatrick } isPICDefault()57e5dd7070Spatrick bool isPICDefault() const override { return false; } isPIEDefault(const llvm::opt::ArgList & Args)58*12c85518Srobert bool isPIEDefault(const llvm::opt::ArgList &Args) const override { 59*12c85518Srobert return true; 60*12c85518Srobert } isPICDefaultForced()61e5dd7070Spatrick bool isPICDefaultForced() const override { return false; } getDefaultDebuggerTuning()62e5dd7070Spatrick llvm::DebuggerKind getDefaultDebuggerTuning() const override { 63e5dd7070Spatrick return llvm::DebuggerKind::GDB; 64e5dd7070Spatrick } 65e5dd7070Spatrick 66a9ac8606Spatrick LangOptions::StackProtectorMode GetDefaultStackProtectorLevel(bool KernelOrKext)67a9ac8606Spatrick GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 68a9ac8606Spatrick return LangOptions::SSPStrong; 69e5dd7070Spatrick } 70e5dd7070Spatrick 71e5dd7070Spatrick std::string ComputeEffectiveClangTriple(const llvm::opt::ArgList &Args, 72e5dd7070Spatrick types::ID InputType) const override; 73e5dd7070Spatrick 74e5dd7070Spatrick SanitizerMask getSupportedSanitizers() const override; 75e5dd7070Spatrick SanitizerMask getDefaultSanitizers() const override; 76e5dd7070Spatrick 77e5dd7070Spatrick RuntimeLibType 78e5dd7070Spatrick GetRuntimeLibType(const llvm::opt::ArgList &Args) const override; 79*12c85518Srobert CXXStdlibType GetCXXStdlibType(const llvm::opt::ArgList &Args) const override; 80e5dd7070Spatrick IsAArch64OutlineAtomicsDefault(const llvm::opt::ArgList & Args)81*12c85518Srobert bool IsAArch64OutlineAtomicsDefault( 82*12c85518Srobert const llvm::opt::ArgList &Args) const override { 83*12c85518Srobert return true; 84*12c85518Srobert } 85*12c85518Srobert 86*12c85518Srobert void 87*12c85518Srobert addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 88e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args, 89e5dd7070Spatrick Action::OffloadKind DeviceOffloadKind) const override; 90e5dd7070Spatrick void 91e5dd7070Spatrick AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 92e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override; 93*12c85518Srobert void AddClangCXXStdlibIncludeArgs( 94*12c85518Srobert const llvm::opt::ArgList &DriverArgs, 95e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override; 96e5dd7070Spatrick void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 97e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs) const override; 98e5dd7070Spatrick getDefaultLinker()99*12c85518Srobert const char *getDefaultLinker() const override { return "ld.lld"; } 100e5dd7070Spatrick 101e5dd7070Spatrick protected: 102e5dd7070Spatrick Tool *buildLinker() const override; 103e5dd7070Spatrick }; 104e5dd7070Spatrick 105e5dd7070Spatrick } // end namespace toolchains 106e5dd7070Spatrick } // end namespace driver 107e5dd7070Spatrick } // end namespace clang 108e5dd7070Spatrick 109e5dd7070Spatrick #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_FUCHSIA_H 110