BareMetal.h revision 353358
1137015Sdes//===--- BareMetal.h - Bare Metal Tool and ToolChain -------------*- C++ -*-===//
298937Sdes//
398937Sdes// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
498937Sdes// See https://llvm.org/LICENSE.txt for license information.
598937Sdes// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
698937Sdes//
798937Sdes//===----------------------------------------------------------------------===//
898937Sdes
998937Sdes#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
1098937Sdes#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
1198937Sdes
1298937Sdes#include "clang/Driver/Tool.h"
1398937Sdes#include "clang/Driver/ToolChain.h"
1498937Sdes
1598937Sdes#include <string>
1698937Sdes
1798937Sdesnamespace clang {
1898937Sdesnamespace driver {
1998937Sdes
2098937Sdesnamespace toolchains {
2198937Sdes
2298937Sdesclass LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
2398937Sdespublic:
2498937Sdes  BareMetal(const Driver &D, const llvm::Triple &Triple,
2598937Sdes            const llvm::opt::ArgList &Args);
2698937Sdes  ~BareMetal() override;
2798937Sdes
2898937Sdes  static bool handlesTarget(const llvm::Triple &Triple);
2999060Sdesprotected:
30113908Sdes  Tool *buildLinker() const override;
3198937Sdes
3298937Sdespublic:
3398937Sdes  bool useIntegratedAs() const override { return true; }
3498937Sdes  bool isCrossCompiling() const override { return true; }
3598937Sdes  bool isPICDefault() const override { return false; }
3698937Sdes  bool isPIEDefault() const override { return false; }
3798937Sdes  bool isPICDefaultForced() const override { return false; }
3898937Sdes  bool SupportsProfiling() const override { return false; }
3998937Sdes
4098937Sdes  RuntimeLibType GetDefaultRuntimeLibType() const override {
4198937Sdes    return ToolChain::RLT_CompilerRT;
4298937Sdes  }
4398937Sdes  CXXStdlibType GetDefaultCXXStdlibType() const override {
4498937Sdes    return ToolChain::CST_Libcxx;
4598937Sdes  }
4698937Sdes
4798937Sdes  const char *getDefaultLinker() const override { return "ld.lld"; }
4898937Sdes
49124208Sdes  std::string getRuntimesDir() const;
5098937Sdes  void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
5198937Sdes                                 llvm::opt::ArgStringList &CC1Args) const override;
5298937Sdes  void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
53113908Sdes                             llvm::opt::ArgStringList &CC1Args,
5498937Sdes                             Action::OffloadKind DeviceOffloadKind) const override;
5598937Sdes  void AddClangCXXStdlibIncludeArgs(
5698937Sdes      const llvm::opt::ArgList &DriverArgs,
5798937Sdes      llvm::opt::ArgStringList &CC1Args) const override;
5898937Sdes  void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
5998937Sdes                           llvm::opt::ArgStringList &CmdArgs) const override;
6098937Sdes  void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
6198937Sdes                         llvm::opt::ArgStringList &CmdArgs) const;
62113908Sdes};
6398937Sdes
64126274Sdes} // namespace toolchains
65126274Sdes
66126274Sdesnamespace tools {
67126274Sdesnamespace baremetal {
68126274Sdes
69126274Sdesclass LLVM_LIBRARY_VISIBILITY Linker : public Tool {
70137015Sdespublic:
71137015Sdes  Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {}
72137015Sdes  bool isLinkJob() const override { return true; }
73124208Sdes  bool hasIntegratedCPP() const override { return false; }
7498937Sdes  void ConstructJob(Compilation &C, const JobAction &JA,
75113908Sdes                    const InputInfo &Output, const InputInfoList &Inputs,
76113908Sdes                    const llvm::opt::ArgList &TCArgs,
7798937Sdes                    const char *LinkingOutput) const override;
78113908Sdes};
79137015Sdes
80113908Sdes} // namespace baremetal
81113908Sdes} // namespace tools
82113908Sdes
83113908Sdes} // namespace driver
84137015Sdes} // namespace clang
85124208Sdes
86124208Sdes#endif
87126274Sdes