xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/BareMetal.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
1bdd1243dSDimitry Andric //===--- BareMetal.h - Bare Metal Tool and ToolChain ------------*- 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_BAREMETAL_H
100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "clang/Driver/Tool.h"
130b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h"
140b57cec5SDimitry Andric 
150b57cec5SDimitry Andric #include <string>
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric namespace clang {
180b57cec5SDimitry Andric namespace driver {
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric namespace toolchains {
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
230b57cec5SDimitry Andric public:
240b57cec5SDimitry Andric   BareMetal(const Driver &D, const llvm::Triple &Triple,
250b57cec5SDimitry Andric             const llvm::opt::ArgList &Args);
26e8d8bef9SDimitry Andric   ~BareMetal() override = default;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric   static bool handlesTarget(const llvm::Triple &Triple);
29e8d8bef9SDimitry Andric 
30e8d8bef9SDimitry Andric   void findMultilibs(const Driver &D, const llvm::Triple &Triple,
31e8d8bef9SDimitry Andric                      const llvm::opt::ArgList &Args);
32e8d8bef9SDimitry Andric 
330b57cec5SDimitry Andric protected:
340b57cec5SDimitry Andric   Tool *buildLinker() const override;
3506c3fb27SDimitry Andric   Tool *buildStaticLibTool() const override;
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric public:
380b57cec5SDimitry Andric   bool useIntegratedAs() const override { return true; }
39bdd1243dSDimitry Andric   bool isBareMetal() const override { return true; }
400b57cec5SDimitry Andric   bool isCrossCompiling() const override { return true; }
4106c3fb27SDimitry Andric   bool HasNativeLLVMSupport() const override { return true; }
420b57cec5SDimitry Andric   bool isPICDefault() const override { return false; }
43349cc55cSDimitry Andric   bool isPIEDefault(const llvm::opt::ArgList &Args) const override {
44349cc55cSDimitry Andric     return false;
45349cc55cSDimitry Andric   }
460b57cec5SDimitry Andric   bool isPICDefaultForced() const override { return false; }
470b57cec5SDimitry Andric   bool SupportsProfiling() const override { return false; }
480b57cec5SDimitry Andric 
49e8d8bef9SDimitry Andric   StringRef getOSLibName() const override { return "baremetal"; }
50e8d8bef9SDimitry Andric 
510b57cec5SDimitry Andric   RuntimeLibType GetDefaultRuntimeLibType() const override {
520b57cec5SDimitry Andric     return ToolChain::RLT_CompilerRT;
530b57cec5SDimitry Andric   }
540b57cec5SDimitry Andric   CXXStdlibType GetDefaultCXXStdlibType() const override {
550b57cec5SDimitry Andric     return ToolChain::CST_Libcxx;
560b57cec5SDimitry Andric   }
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric   const char *getDefaultLinker() const override { return "ld.lld"; }
590b57cec5SDimitry Andric 
60bdd1243dSDimitry Andric   void
61bdd1243dSDimitry Andric   AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
620b57cec5SDimitry Andric                             llvm::opt::ArgStringList &CC1Args) const override;
63bdd1243dSDimitry Andric   void
64bdd1243dSDimitry Andric   addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
650b57cec5SDimitry Andric                         llvm::opt::ArgStringList &CC1Args,
660b57cec5SDimitry Andric                         Action::OffloadKind DeviceOffloadKind) const override;
670b57cec5SDimitry Andric   void AddClangCXXStdlibIncludeArgs(
680b57cec5SDimitry Andric       const llvm::opt::ArgList &DriverArgs,
690b57cec5SDimitry Andric       llvm::opt::ArgStringList &CC1Args) const override;
700b57cec5SDimitry Andric   void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
710b57cec5SDimitry Andric                            llvm::opt::ArgStringList &CmdArgs) const override;
720b57cec5SDimitry Andric   void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
730b57cec5SDimitry Andric                          llvm::opt::ArgStringList &CmdArgs) const;
74e8d8bef9SDimitry Andric   std::string computeSysRoot() const override;
75*5f757f3fSDimitry Andric   SanitizerMask getSupportedSanitizers() const override;
7606c3fb27SDimitry Andric 
7706c3fb27SDimitry Andric private:
7806c3fb27SDimitry Andric   using OrderedMultilibs =
7906c3fb27SDimitry Andric       llvm::iterator_range<llvm::SmallVector<Multilib>::const_reverse_iterator>;
8006c3fb27SDimitry Andric   OrderedMultilibs getOrderedMultilibs() const;
810b57cec5SDimitry Andric };
820b57cec5SDimitry Andric 
830b57cec5SDimitry Andric } // namespace toolchains
840b57cec5SDimitry Andric 
850b57cec5SDimitry Andric namespace tools {
860b57cec5SDimitry Andric namespace baremetal {
870b57cec5SDimitry Andric 
8806c3fb27SDimitry Andric class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool {
8906c3fb27SDimitry Andric public:
9006c3fb27SDimitry Andric   StaticLibTool(const ToolChain &TC)
9106c3fb27SDimitry Andric       : Tool("baremetal::StaticLibTool", "llvm-ar", TC) {}
9206c3fb27SDimitry Andric 
9306c3fb27SDimitry Andric   bool hasIntegratedCPP() const override { return false; }
9406c3fb27SDimitry Andric   bool isLinkJob() const override { return true; }
9506c3fb27SDimitry Andric 
9606c3fb27SDimitry Andric   void ConstructJob(Compilation &C, const JobAction &JA,
9706c3fb27SDimitry Andric                     const InputInfo &Output, const InputInfoList &Inputs,
9806c3fb27SDimitry Andric                     const llvm::opt::ArgList &TCArgs,
9906c3fb27SDimitry Andric                     const char *LinkingOutput) const override;
10006c3fb27SDimitry Andric };
10106c3fb27SDimitry Andric 
102*5f757f3fSDimitry Andric class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {
1030b57cec5SDimitry Andric public:
1040b57cec5SDimitry Andric   Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {}
1050b57cec5SDimitry Andric   bool isLinkJob() const override { return true; }
1060b57cec5SDimitry Andric   bool hasIntegratedCPP() const override { return false; }
1070b57cec5SDimitry Andric   void ConstructJob(Compilation &C, const JobAction &JA,
1080b57cec5SDimitry Andric                     const InputInfo &Output, const InputInfoList &Inputs,
1090b57cec5SDimitry Andric                     const llvm::opt::ArgList &TCArgs,
1100b57cec5SDimitry Andric                     const char *LinkingOutput) const override;
1110b57cec5SDimitry Andric };
1120b57cec5SDimitry Andric 
1130b57cec5SDimitry Andric } // namespace baremetal
1140b57cec5SDimitry Andric } // namespace tools
1150b57cec5SDimitry Andric 
1160b57cec5SDimitry Andric } // namespace driver
1170b57cec5SDimitry Andric } // namespace clang
1180b57cec5SDimitry Andric 
1190b57cec5SDimitry Andric #endif
120