1 //===--- BareMetal.h - Bare Metal Tool and ToolChain ------------*- C++-*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H 10 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H 11 12 #include "ToolChains/Gnu.h" 13 #include "clang/Driver/Tool.h" 14 #include "clang/Driver/ToolChain.h" 15 16 #include <string> 17 18 namespace clang { 19 namespace driver { 20 21 namespace toolchains { 22 23 class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF { 24 public: 25 BareMetal(const Driver &D, const llvm::Triple &Triple, 26 const llvm::opt::ArgList &Args); 27 ~BareMetal() override = default; 28 29 static bool handlesTarget(const llvm::Triple &Triple); 30 31 void findMultilibs(const Driver &D, const llvm::Triple &Triple, 32 const llvm::opt::ArgList &Args); 33 34 protected: 35 Tool *buildLinker() const override; 36 Tool *buildStaticLibTool() const override; 37 38 public: 39 bool initGCCInstallation(const llvm::Triple &Triple, 40 const llvm::opt::ArgList &Args); hasValidGCCInstallation()41 bool hasValidGCCInstallation() const { return IsGCCInstallationValid; } isBareMetal()42 bool isBareMetal() const override { return true; } isCrossCompiling()43 bool isCrossCompiling() const override { return true; } HasNativeLLVMSupport()44 bool HasNativeLLVMSupport() const override { return true; } isPICDefault()45 bool isPICDefault() const override { return false; } isPIEDefault(const llvm::opt::ArgList & Args)46 bool isPIEDefault(const llvm::opt::ArgList &Args) const override { 47 return false; 48 } isPICDefaultForced()49 bool isPICDefaultForced() const override { return false; } SupportsProfiling()50 bool SupportsProfiling() const override { return false; } 51 getOSLibName()52 StringRef getOSLibName() const override { return "baremetal"; } 53 54 UnwindTableLevel getDefaultUnwindTableLevel(const llvm::opt::ArgList & Args)55 getDefaultUnwindTableLevel(const llvm::opt::ArgList &Args) const override { 56 return UnwindTableLevel::None; 57 } 58 59 CXXStdlibType GetDefaultCXXStdlibType() const override; 60 61 RuntimeLibType GetDefaultRuntimeLibType() const override; 62 63 UnwindLibType GetUnwindLibType(const llvm::opt::ArgList &Args) const override; 64 65 void 66 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 67 llvm::opt::ArgStringList &CC1Args) const override; 68 void 69 addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 70 llvm::opt::ArgStringList &CC1Args, 71 Action::OffloadKind DeviceOffloadKind) const override; 72 void AddClangCXXStdlibIncludeArgs( 73 const llvm::opt::ArgList &DriverArgs, 74 llvm::opt::ArgStringList &CC1Args) const override; 75 void 76 addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, 77 llvm::opt::ArgStringList &CC1Args) const override; 78 std::string computeSysRoot() const override; 79 std::string getCompilerRTPath() const override; 80 SanitizerMask getSupportedSanitizers() const override; 81 82 SmallVector<std::string> 83 getMultilibMacroDefinesStr(llvm::opt::ArgList &Args) const override; 84 85 private: 86 using OrderedMultilibs = 87 llvm::iterator_range<llvm::SmallVector<Multilib>::const_reverse_iterator>; 88 OrderedMultilibs getOrderedMultilibs() const; 89 90 std::string SysRoot; 91 92 bool IsGCCInstallationValid; 93 94 SmallVector<std::string> MultilibMacroDefines; 95 }; 96 97 } // namespace toolchains 98 99 namespace tools { 100 namespace baremetal { 101 102 class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool { 103 public: StaticLibTool(const ToolChain & TC)104 StaticLibTool(const ToolChain &TC) 105 : Tool("baremetal::StaticLibTool", "llvm-ar", TC) {} 106 hasIntegratedCPP()107 bool hasIntegratedCPP() const override { return false; } isLinkJob()108 bool isLinkJob() const override { return true; } 109 110 void ConstructJob(Compilation &C, const JobAction &JA, 111 const InputInfo &Output, const InputInfoList &Inputs, 112 const llvm::opt::ArgList &TCArgs, 113 const char *LinkingOutput) const override; 114 }; 115 116 class LLVM_LIBRARY_VISIBILITY Linker final : public Tool { 117 public: Linker(const ToolChain & TC)118 Linker(const ToolChain &TC) : Tool("baremetal::Linker", "linker", TC) {} isLinkJob()119 bool isLinkJob() const override { return true; } hasIntegratedCPP()120 bool hasIntegratedCPP() const override { return false; } 121 void ConstructJob(Compilation &C, const JobAction &JA, 122 const InputInfo &Output, const InputInfoList &Inputs, 123 const llvm::opt::ArgList &TCArgs, 124 const char *LinkingOutput) const override; 125 }; 126 127 } // namespace baremetal 128 } // namespace tools 129 130 } // namespace driver 131 } // namespace clang 132 133 #endif 134