1*12c85518Srobert //===--- BareMetal.h - Bare Metal Tool and ToolChain ------------*- 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_BAREMETAL_H 10e5dd7070Spatrick #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H 11e5dd7070Spatrick 12e5dd7070Spatrick #include "clang/Driver/Tool.h" 13e5dd7070Spatrick #include "clang/Driver/ToolChain.h" 14e5dd7070Spatrick 15e5dd7070Spatrick #include <string> 16e5dd7070Spatrick 17e5dd7070Spatrick namespace clang { 18e5dd7070Spatrick namespace driver { 19e5dd7070Spatrick 20e5dd7070Spatrick namespace toolchains { 21e5dd7070Spatrick 22e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain { 23e5dd7070Spatrick public: 24e5dd7070Spatrick BareMetal(const Driver &D, const llvm::Triple &Triple, 25e5dd7070Spatrick const llvm::opt::ArgList &Args); 26a9ac8606Spatrick ~BareMetal() override = default; 27e5dd7070Spatrick 28e5dd7070Spatrick static bool handlesTarget(const llvm::Triple &Triple); 29a9ac8606Spatrick 30a9ac8606Spatrick void findMultilibs(const Driver &D, const llvm::Triple &Triple, 31a9ac8606Spatrick const llvm::opt::ArgList &Args); 32a9ac8606Spatrick 33e5dd7070Spatrick protected: 34e5dd7070Spatrick Tool *buildLinker() const override; 35e5dd7070Spatrick 36e5dd7070Spatrick public: useIntegratedAs()37e5dd7070Spatrick bool useIntegratedAs() const override { return true; } isBareMetal()38*12c85518Srobert bool isBareMetal() const override { return true; } isCrossCompiling()39e5dd7070Spatrick bool isCrossCompiling() const override { return true; } isPICDefault()40e5dd7070Spatrick bool isPICDefault() const override { return false; } isPIEDefault(const llvm::opt::ArgList & Args)41*12c85518Srobert bool isPIEDefault(const llvm::opt::ArgList &Args) const override { 42*12c85518Srobert return false; 43*12c85518Srobert } isPICDefaultForced()44e5dd7070Spatrick bool isPICDefaultForced() const override { return false; } SupportsProfiling()45e5dd7070Spatrick bool SupportsProfiling() const override { return false; } 46e5dd7070Spatrick getOSLibName()47a9ac8606Spatrick StringRef getOSLibName() const override { return "baremetal"; } 48a9ac8606Spatrick GetDefaultRuntimeLibType()49e5dd7070Spatrick RuntimeLibType GetDefaultRuntimeLibType() const override { 50e5dd7070Spatrick return ToolChain::RLT_CompilerRT; 51e5dd7070Spatrick } GetDefaultCXXStdlibType()52e5dd7070Spatrick CXXStdlibType GetDefaultCXXStdlibType() const override { 53e5dd7070Spatrick return ToolChain::CST_Libcxx; 54e5dd7070Spatrick } 55e5dd7070Spatrick getDefaultLinker()56e5dd7070Spatrick const char *getDefaultLinker() const override { return "ld.lld"; } 57e5dd7070Spatrick 58*12c85518Srobert void 59*12c85518Srobert AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, 60e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override; 61*12c85518Srobert void 62*12c85518Srobert addClangTargetOptions(const llvm::opt::ArgList &DriverArgs, 63e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args, 64e5dd7070Spatrick Action::OffloadKind DeviceOffloadKind) const override; 65e5dd7070Spatrick void AddClangCXXStdlibIncludeArgs( 66e5dd7070Spatrick const llvm::opt::ArgList &DriverArgs, 67e5dd7070Spatrick llvm::opt::ArgStringList &CC1Args) const override; 68e5dd7070Spatrick void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args, 69e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs) const override; 70e5dd7070Spatrick void AddLinkRuntimeLib(const llvm::opt::ArgList &Args, 71e5dd7070Spatrick llvm::opt::ArgStringList &CmdArgs) const; 72a9ac8606Spatrick std::string computeSysRoot() const override; 73e5dd7070Spatrick }; 74e5dd7070Spatrick 75e5dd7070Spatrick } // namespace toolchains 76e5dd7070Spatrick 77e5dd7070Spatrick namespace tools { 78e5dd7070Spatrick namespace baremetal { 79e5dd7070Spatrick 80e5dd7070Spatrick class LLVM_LIBRARY_VISIBILITY Linker : public Tool { 81e5dd7070Spatrick public: Linker(const ToolChain & TC)82e5dd7070Spatrick Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {} isLinkJob()83e5dd7070Spatrick bool isLinkJob() const override { return true; } hasIntegratedCPP()84e5dd7070Spatrick bool hasIntegratedCPP() const override { return false; } 85e5dd7070Spatrick void ConstructJob(Compilation &C, const JobAction &JA, 86e5dd7070Spatrick const InputInfo &Output, const InputInfoList &Inputs, 87e5dd7070Spatrick const llvm::opt::ArgList &TCArgs, 88e5dd7070Spatrick const char *LinkingOutput) const override; 89e5dd7070Spatrick }; 90e5dd7070Spatrick 91e5dd7070Spatrick } // namespace baremetal 92e5dd7070Spatrick } // namespace tools 93e5dd7070Spatrick 94e5dd7070Spatrick } // namespace driver 95e5dd7070Spatrick } // namespace clang 96e5dd7070Spatrick 97e5dd7070Spatrick #endif 98