xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/OpenBSD.h (revision 16d6b3b3da62aa5baaf3c66c8d4e6f8c8f70aeb7)
10b57cec5SDimitry Andric //===--- OpenBSD.h - OpenBSD ToolChain Implementations ----------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OPENBSD_H
100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OPENBSD_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "Gnu.h"
130b57cec5SDimitry Andric #include "clang/Driver/Tool.h"
140b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h"
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric namespace clang {
170b57cec5SDimitry Andric namespace driver {
180b57cec5SDimitry Andric namespace tools {
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric /// openbsd -- Directly call GNU Binutils assembler and linker
210b57cec5SDimitry Andric namespace openbsd {
225ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
230b57cec5SDimitry Andric public:
240b57cec5SDimitry Andric   Assembler(const ToolChain &TC)
255ffd83dbSDimitry Andric       : Tool("openbsd::Assembler", "assembler", TC) {}
260b57cec5SDimitry Andric 
270b57cec5SDimitry Andric   bool hasIntegratedCPP() const override { return false; }
280b57cec5SDimitry Andric 
290b57cec5SDimitry Andric   void ConstructJob(Compilation &C, const JobAction &JA,
300b57cec5SDimitry Andric                     const InputInfo &Output, const InputInfoList &Inputs,
310b57cec5SDimitry Andric                     const llvm::opt::ArgList &TCArgs,
320b57cec5SDimitry Andric                     const char *LinkingOutput) const override;
330b57cec5SDimitry Andric };
340b57cec5SDimitry Andric 
355ffd83dbSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
360b57cec5SDimitry Andric public:
375ffd83dbSDimitry Andric   Linker(const ToolChain &TC) : Tool("openbsd::Linker", "linker", TC) {}
380b57cec5SDimitry Andric 
390b57cec5SDimitry Andric   bool hasIntegratedCPP() const override { return false; }
400b57cec5SDimitry Andric   bool isLinkJob() const override { return true; }
410b57cec5SDimitry Andric 
420b57cec5SDimitry Andric   void ConstructJob(Compilation &C, const JobAction &JA,
430b57cec5SDimitry Andric                     const InputInfo &Output, const InputInfoList &Inputs,
440b57cec5SDimitry Andric                     const llvm::opt::ArgList &TCArgs,
450b57cec5SDimitry Andric                     const char *LinkingOutput) const override;
460b57cec5SDimitry Andric };
470b57cec5SDimitry Andric } // end namespace openbsd
480b57cec5SDimitry Andric } // end namespace tools
490b57cec5SDimitry Andric 
500b57cec5SDimitry Andric namespace toolchains {
510b57cec5SDimitry Andric 
520b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY OpenBSD : public Generic_ELF {
530b57cec5SDimitry Andric public:
540b57cec5SDimitry Andric   OpenBSD(const Driver &D, const llvm::Triple &Triple,
550b57cec5SDimitry Andric           const llvm::opt::ArgList &Args);
560b57cec5SDimitry Andric 
57*16d6b3b3SDimitry Andric   bool HasNativeLLVMSupport() const override;
58*16d6b3b3SDimitry Andric 
590b57cec5SDimitry Andric   bool IsMathErrnoDefault() const override { return false; }
600b57cec5SDimitry Andric   bool IsObjCNonFragileABIDefault() const override { return true; }
610b57cec5SDimitry Andric   bool isPIEDefault() const override { return true; }
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   RuntimeLibType GetDefaultRuntimeLibType() const override {
640b57cec5SDimitry Andric     return ToolChain::RLT_CompilerRT;
650b57cec5SDimitry Andric   }
660b57cec5SDimitry Andric   CXXStdlibType GetDefaultCXXStdlibType() const override {
670b57cec5SDimitry Andric     return ToolChain::CST_Libcxx;
680b57cec5SDimitry Andric   }
690b57cec5SDimitry Andric 
70*16d6b3b3SDimitry Andric   void
71*16d6b3b3SDimitry Andric   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
72*16d6b3b3SDimitry Andric                             llvm::opt::ArgStringList &CC1Args) const override;
73*16d6b3b3SDimitry Andric 
74*16d6b3b3SDimitry Andric   void addLibCxxIncludePaths(const llvm::opt::ArgList &DriverArgs,
75*16d6b3b3SDimitry Andric                              llvm::opt::ArgStringList &CC1Args) const override;
760b57cec5SDimitry Andric   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
770b57cec5SDimitry Andric                            llvm::opt::ArgStringList &CmdArgs) const override;
780b57cec5SDimitry Andric 
79*16d6b3b3SDimitry Andric   std::string getCompilerRT(const llvm::opt::ArgList &Args, StringRef Component,
80*16d6b3b3SDimitry Andric                             FileType Type = ToolChain::FT_Static) const override;
81*16d6b3b3SDimitry Andric 
820b57cec5SDimitry Andric   unsigned GetDefaultStackProtectorLevel(bool KernelOrKext) const override {
830b57cec5SDimitry Andric     return 2;
840b57cec5SDimitry Andric   }
850b57cec5SDimitry Andric   unsigned GetDefaultDwarfVersion() const override { return 2; }
860b57cec5SDimitry Andric 
870b57cec5SDimitry Andric   SanitizerMask getSupportedSanitizers() const override;
880b57cec5SDimitry Andric 
890b57cec5SDimitry Andric protected:
900b57cec5SDimitry Andric   Tool *buildAssembler() const override;
910b57cec5SDimitry Andric   Tool *buildLinker() const override;
920b57cec5SDimitry Andric };
930b57cec5SDimitry Andric 
940b57cec5SDimitry Andric } // end namespace toolchains
950b57cec5SDimitry Andric } // end namespace driver
960b57cec5SDimitry Andric } // end namespace clang
970b57cec5SDimitry Andric 
980b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_OPENBSD_H
99