1e5dd7070Spatrick //===--- OpenBSD.h - OpenBSD 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_OPENBSD_H 10e5dd7070Spatrick #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OPENBSD_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 21e5dd7070Spatrick /// openbsd -- Directly call GNU Binutils assembler and linker 22e5dd7070Spatrick namespace openbsd { 23ec727ea7Spatrick class LLVM_LIBRARY_VISIBILITY Assembler : public Tool { 24e5dd7070Spatrick public: Assembler(const ToolChain & TC)25e5dd7070Spatrick Assembler(const ToolChain &TC) 26ec727ea7Spatrick : Tool("openbsd::Assembler", "assembler", TC) {} 27e5dd7070Spatrick hasIntegratedCPP()28e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } 29e5dd7070Spatrick 30e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 31e5dd7070Spatrick const InputInfo &Output, const InputInfoList &Inputs, 32e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 33e5dd7070Spatrick const char *LinkingOutput) const override; 34e5dd7070Spatrick }; 35e5dd7070Spatrick 36ec727ea7Spatrick class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 37e5dd7070Spatrick public: Linker(const ToolChain & TC)38ec727ea7Spatrick Linker(const ToolChain &TC) : Tool("openbsd::Linker", "linker", TC) {} 39e5dd7070Spatrick hasIntegratedCPP()40e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } isLinkJob()41e5dd7070Spatrick bool isLinkJob() const override { return true; } 42e5dd7070Spatrick 43e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 44e5dd7070Spatrick const InputInfo &Output, const InputInfoList &Inputs, 45e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 46e5dd7070Spatrick const char *LinkingOutput) const override; 47e5dd7070Spatrick }; 48e5dd7070Spatrick } // end namespace openbsd 49e5dd7070Spatrick } // end namespace tools 50e5dd7070Spatrick 51e5dd7070Spatrick namespace toolchains { 52e5dd7070Spatrick 53e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF { 54e5dd7070Spatrick public: 55e5dd7070Spatrick OpenBSD(const Driver &D, const llvm::Triple &Triple, 56e5dd7070Spatrick const llvm::opt::ArgList &Args); 57e5dd7070Spatrick 58ec727ea7Spatrick bool HasNativeLLVMSupport() const override; 59ec727ea7Spatrick IsMathErrnoDefault()60e5dd7070Spatrick bool IsMathErrnoDefault() const override { return false; } IsObjCNonFragileABIDefault()61e5dd7070Spatrick bool IsObjCNonFragileABIDefault() const override { return true; } isPIEDefault(const llvm::opt::ArgList & Args)62*7a9b00ceSrobert bool isPIEDefault(const llvm::opt::ArgList &Args) const override { 63*7a9b00ceSrobert return true; 64*7a9b00ceSrobert } 65e5dd7070Spatrick GetDefaultRuntimeLibType()66e5dd7070Spatrick RuntimeLibType GetDefaultRuntimeLibType() const override { 67e5dd7070Spatrick return ToolChain::RLT_CompilerRT; 68e5dd7070Spatrick } GetDefaultCXXStdlibType()69e5dd7070Spatrick CXXStdlibType GetDefaultCXXStdlibType() const override { 70e5dd7070Spatrick return ToolChain::CST_Libcxx; 71e5dd7070Spatrick } 72e5dd7070Spatrick 73ec727ea7Spatrick void 74ec727ea7Spatrick AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 75ec727ea7Spatrick llvm::opt::ArgStringList &CC1Args) const override; 76ec727ea7Spatrick 77ec727ea7Spatrick void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 78ec727ea7Spatrick llvm::opt::ArgStringList &CC1Args) const override; 79e5dd7070Spatrick void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 80e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs) const override; 81e5dd7070Spatrick 82e5dd7070Spatrick std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component, 83e5dd7070Spatrick FileType Type = ToolChain::FT_Static) const override; 84e5dd7070Spatrick 85*7a9b00ceSrobert UnwindTableLevel 86*7a9b00ceSrobert getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override; 87604309efSmortimer 88a9ac8606Spatrick LangOptions::StackProtectorMode GetDefaultStackProtectorLevel(bool KernelOrKext)89a9ac8606Spatrick GetDefaultStackProtectorLevel(bool KernelOrKext) const override { 90a9ac8606Spatrick return LangOptions::SSPStrong; 91e5dd7070Spatrick } GetDefaultDwarfVersion()92e5dd7070Spatrick unsigned GetDefaultDwarfVersion() const override { return 2; } 93e5dd7070Spatrick 94e5dd7070Spatrick SanitizerMask getSupportedSanitizers() const override; 95e5dd7070Spatrick 96e5dd7070Spatrick protected: 97e5dd7070Spatrick Tool *buildAssembler() const override; 98e5dd7070Spatrick Tool *buildLinker() const override; 99e5dd7070Spatrick }; 100e5dd7070Spatrick 101e5dd7070Spatrick } // end namespace toolchains 102e5dd7070Spatrick } // end namespace driver 103e5dd7070Spatrick } // end namespace clang 104e5dd7070Spatrick 105e5dd7070Spatrick #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OPENBSD_H 106