134 lines · c
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-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H10#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H11 12#include "ToolChains/Gnu.h"13#include "clang/Driver/Tool.h"14#include "clang/Driver/ToolChain.h"15 16#include <string>17 18namespace clang {19namespace driver {20 21namespace toolchains {22 23class LLVM_LIBRARY_VISIBILITY BareMetal : public Generic_ELF {24public: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 34protected:35 Tool *buildLinker() const override;36 Tool *buildStaticLibTool() const override;37 38public:39 bool initGCCInstallation(const llvm::Triple &Triple,40 const llvm::opt::ArgList &Args);41 bool hasValidGCCInstallation() const { return IsGCCInstallationValid; }42 bool isBareMetal() const override { return true; }43 bool isCrossCompiling() const override { return true; }44 bool HasNativeLLVMSupport() const override { return true; }45 bool isPICDefault() const override { return false; }46 bool isPIEDefault(const llvm::opt::ArgList &Args) const override {47 return false;48 }49 bool isPICDefaultForced() const override { return false; }50 bool SupportsProfiling() const override { return false; }51 52 StringRef getOSLibName() const override { return "baremetal"; }53 54 UnwindTableLevel55 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 void66 AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,67 llvm::opt::ArgStringList &CC1Args) const override;68 void69 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 void76 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 85private: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 toolchains98 99namespace tools {100namespace baremetal {101 102class LLVM_LIBRARY_VISIBILITY StaticLibTool : public Tool {103public:104 StaticLibTool(const ToolChain &TC)105 : Tool("baremetal::StaticLibTool", "llvm-ar", TC) {}106 107 bool hasIntegratedCPP() const override { return false; }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 116class LLVM_LIBRARY_VISIBILITY Linker final : public Tool {117public:118 Linker(const ToolChain &TC) : Tool("baremetal::Linker", "linker", TC) {}119 bool isLinkJob() const override { return true; }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 baremetal128} // namespace tools129 130} // namespace driver131} // namespace clang132 133#endif134