1319142Sdim//===--- BareMetal.h - Bare Metal Tool and ToolChain -------------*- C++ -*-===//
2319142Sdim//
3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4353358Sdim// See https://llvm.org/LICENSE.txt for license information.
5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6319142Sdim//
7319142Sdim//===----------------------------------------------------------------------===//
8319142Sdim
9319142Sdim#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
10319142Sdim#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_BAREMETAL_H
11319142Sdim
12319142Sdim#include "clang/Driver/Tool.h"
13319142Sdim#include "clang/Driver/ToolChain.h"
14319142Sdim
15319142Sdim#include <string>
16319142Sdim
17319142Sdimnamespace clang {
18319142Sdimnamespace driver {
19319142Sdim
20319142Sdimnamespace toolchains {
21319142Sdim
22319142Sdimclass LLVM_LIBRARY_VISIBILITY BareMetal : public ToolChain {
23319142Sdimpublic:
24319142Sdim  BareMetal(const Driver &D, const llvm::Triple &Triple,
25319142Sdim            const llvm::opt::ArgList &Args);
26319142Sdim  ~BareMetal() override;
27319142Sdim
28319142Sdim  static bool handlesTarget(const llvm::Triple &Triple);
29319142Sdimprotected:
30319142Sdim  Tool *buildLinker() const override;
31319142Sdim
32319142Sdimpublic:
33319142Sdim  bool useIntegratedAs() const override { return true; }
34319142Sdim  bool isCrossCompiling() const override { return true; }
35319142Sdim  bool isPICDefault() const override { return false; }
36319142Sdim  bool isPIEDefault() const override { return false; }
37319142Sdim  bool isPICDefaultForced() const override { return false; }
38319142Sdim  bool SupportsProfiling() const override { return false; }
39319142Sdim
40319142Sdim  RuntimeLibType GetDefaultRuntimeLibType() const override {
41319142Sdim    return ToolChain::RLT_CompilerRT;
42319142Sdim  }
43319142Sdim  CXXStdlibType GetDefaultCXXStdlibType() const override {
44319142Sdim    return ToolChain::CST_Libcxx;
45319142Sdim  }
46319142Sdim
47319142Sdim  const char *getDefaultLinker() const override { return "ld.lld"; }
48319142Sdim
49319142Sdim  std::string getRuntimesDir() const;
50319142Sdim  void AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs,
51319142Sdim                                 llvm::opt::ArgStringList &CC1Args) const override;
52319142Sdim  void addClangTargetOptions(const llvm::opt::ArgList &DriverArgs,
53320970Sdim                             llvm::opt::ArgStringList &CC1Args,
54320970Sdim                             Action::OffloadKind DeviceOffloadKind) const override;
55319142Sdim  void AddClangCXXStdlibIncludeArgs(
56319142Sdim      const llvm::opt::ArgList &DriverArgs,
57319142Sdim      llvm::opt::ArgStringList &CC1Args) const override;
58319142Sdim  void AddCXXStdlibLibArgs(const llvm::opt::ArgList &Args,
59319142Sdim                           llvm::opt::ArgStringList &CmdArgs) const override;
60319142Sdim  void AddLinkRuntimeLib(const llvm::opt::ArgList &Args,
61319142Sdim                         llvm::opt::ArgStringList &CmdArgs) const;
62319142Sdim};
63319142Sdim
64319142Sdim} // namespace toolchains
65319142Sdim
66319142Sdimnamespace tools {
67319142Sdimnamespace baremetal {
68319142Sdim
69319142Sdimclass LLVM_LIBRARY_VISIBILITY Linker : public Tool {
70319142Sdimpublic:
71319142Sdim  Linker(const ToolChain &TC) : Tool("baremetal::Linker", "ld.lld", TC) {}
72319142Sdim  bool isLinkJob() const override { return true; }
73319142Sdim  bool hasIntegratedCPP() const override { return false; }
74319142Sdim  void ConstructJob(Compilation &C, const JobAction &JA,
75319142Sdim                    const InputInfo &Output, const InputInfoList &Inputs,
76319142Sdim                    const llvm::opt::ArgList &TCArgs,
77319142Sdim                    const char *LinkingOutput) const override;
78319142Sdim};
79319142Sdim
80319142Sdim} // namespace baremetal
81319142Sdim} // namespace tools
82319142Sdim
83319142Sdim} // namespace driver
84319142Sdim} // namespace clang
85319142Sdim
86319142Sdim#endif
87