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