1 //===--- BareMetal.h - Bare Metal Tool and ToolChain -------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
11 #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
13 #include "clang/Driver/Tool.h"
14 #include "clang/Driver/ToolChain.h"
21 namespace toolchains {
23 class LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
25 BareMetal(const Driver &D, const llvm::Triple &Triple,
26 const llvm::opt::ArgList &Args);
27 ~BareMetal() override;
29 static bool handlesTarget(const llvm::Triple &Triple);
31 Tool *buildLinker() const override;
34 bool useIntegratedAs() const override { return true; }
35 bool isCrossCompiling() const override { return true; }
36 bool isPICDefault() const override { return false; }
37 bool isPIEDefault() const override { return false; }
38 bool isPICDefaultForced() const override { return false; }
39 bool SupportsProfiling() const override { return false; }
41 RuntimeLibType GetDefaultRuntimeLibType() const override {
42 return ToolChain::RLT_CompilerRT;
44 CXXStdlibType GetDefaultCXXStdlibType() const override {
45 return ToolChain::CST_Libcxx;
48 const char *getDefaultLinker() const override { return "ld.lld"; }
50 std::string getRuntimesDir() const;
51 void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
52 llvm::opt::ArgStringList &CC1Args) const override;
53 void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
54 llvm::opt::ArgStringList &CC1Args,
55 Action::OffloadKind DeviceOffloadKind) const override;
56 std::string findLibCxxIncludePath(ToolChain::CXXStdlibType LibType) const;
57 void AddClangCXXStdlibIncludeArgs(
58 const llvm::opt::ArgList &DriverArgs,
59 llvm::opt::ArgStringList &CC1Args) const override;
60 void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
61 llvm::opt::ArgStringList &CmdArgs) const override;
62 void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
66 } // namespace toolchains
71 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
73 Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {}
74 bool isLinkJob() const override { return true; }
75 bool hasIntegratedCPP() const override { return false; }
76 void ConstructJob(Compilation &C, const JobAction &JA,
77 const InputInfo &Output, const InputInfoList &Inputs,
78 const llvm::opt::ArgList &TCArgs,
79 const char *LinkingOutput) const override;
82 } // namespace baremetal