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