1317019Sdim//===--- AVR.h - AVR Tool and ToolChain Implementations ---------*- C++ -*-===//
2317019Sdim//
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
6317019Sdim//
7317019Sdim//===----------------------------------------------------------------------===//
8317019Sdim
9317019Sdim#ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AVR_H
10317019Sdim#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AVR_H
11317019Sdim
12317019Sdim#include "Gnu.h"
13317019Sdim#include "InputInfo.h"
14317019Sdim#include "clang/Driver/ToolChain.h"
15317019Sdim#include "clang/Driver/Tool.h"
16317019Sdim
17317019Sdimnamespace clang {
18317019Sdimnamespace driver {
19317019Sdimnamespace toolchains {
20317019Sdim
21317019Sdimclass LLVM_LIBRARY_VISIBILITY AVRToolChain : public Generic_ELF {
22317019Sdimpublic:
23317019Sdim  AVRToolChain(const Driver &D, const llvm::Triple &Triple,
24317019Sdim               const llvm::opt::ArgList &Args);
25353358Sdim
26353358Sdimprotected:
27353358Sdim  Tool *buildLinker() const override;
28353358Sdim
29353358Sdimprivate:
30353358Sdim  /// Whether libgcc, libct, and friends should be linked.
31353358Sdim  ///
32353358Sdim  /// This is not done if the user does not specify a
33353358Sdim  /// microcontroller on the command line.
34353358Sdim  bool LinkStdlib;
35353358Sdim
36353358Sdim  llvm::Optional<std::string> findAVRLibcInstallation() const;
37317019Sdim};
38317019Sdim
39317019Sdim} // end namespace toolchains
40317019Sdim
41317019Sdimnamespace tools {
42317019Sdimnamespace AVR {
43317019Sdimclass LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
44317019Sdimpublic:
45353358Sdim  Linker(const llvm::Triple &Triple, const ToolChain &TC, bool LinkStdlib)
46353358Sdim      : GnuTool("AVR::Linker", "avr-ld", TC), Triple(Triple),
47353358Sdim        LinkStdlib(LinkStdlib) {}
48353358Sdim
49317019Sdim  bool hasIntegratedCPP() const override { return false; }
50317019Sdim  bool isLinkJob() const override { return true; }
51317019Sdim  void ConstructJob(Compilation &C, const JobAction &JA,
52317019Sdim                    const InputInfo &Output, const InputInfoList &Inputs,
53317019Sdim                    const llvm::opt::ArgList &TCArgs,
54317019Sdim                    const char *LinkingOutput) const override;
55353358Sdim
56353358Sdimprotected:
57353358Sdim  const llvm::Triple &Triple;
58353358Sdim  bool LinkStdlib;
59317019Sdim};
60317019Sdim} // end namespace AVR
61317019Sdim} // end namespace tools
62317019Sdim} // end namespace driver
63317019Sdim} // end namespace clang
64317019Sdim
65317019Sdim#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_AVR_H
66