1317019Sdim//===--- ARM.h - ARM-specific (not AArch64) Tool Helpers --------*- 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_ARCH_ARM_H
10317019Sdim#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_ARM_H
11317019Sdim
12317019Sdim#include "clang/Driver/ToolChain.h"
13317019Sdim#include "llvm/ADT/StringRef.h"
14317019Sdim#include "llvm/ADT/Triple.h"
15317019Sdim#include "llvm/Option/Option.h"
16353358Sdim#include "llvm/Support/TargetParser.h"
17317019Sdim#include <string>
18317019Sdim#include <vector>
19317019Sdim
20317019Sdimnamespace clang {
21317019Sdimnamespace driver {
22317019Sdimnamespace tools {
23317019Sdimnamespace arm {
24317019Sdim
25317019Sdimstd::string getARMTargetCPU(StringRef CPU, llvm::StringRef Arch,
26317019Sdim                            const llvm::Triple &Triple);
27317019Sdimconst std::string getARMArch(llvm::StringRef Arch, const llvm::Triple &Triple);
28317019SdimStringRef getARMCPUForMArch(llvm::StringRef Arch, const llvm::Triple &Triple);
29353358Sdimllvm::ARM::ArchKind getLLVMArchKindForARM(StringRef CPU, StringRef Arch,
30353358Sdim                                          const llvm::Triple &Triple);
31317019SdimStringRef getLLVMArchSuffixForARM(llvm::StringRef CPU, llvm::StringRef Arch,
32317019Sdim                                  const llvm::Triple &Triple);
33317019Sdim
34344779Sdimvoid appendBE8LinkFlag(const llvm::opt::ArgList &Args,
35317019Sdim                       llvm::opt::ArgStringList &CmdArgs,
36317019Sdim                       const llvm::Triple &Triple);
37327952Sdimenum class ReadTPMode {
38327952Sdim  Invalid,
39327952Sdim  Soft,
40327952Sdim  Cp15,
41327952Sdim};
42327952Sdim
43317019Sdimenum class FloatABI {
44317019Sdim  Invalid,
45317019Sdim  Soft,
46317019Sdim  SoftFP,
47317019Sdim  Hard,
48317019Sdim};
49317019Sdim
50317019SdimFloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
51327952SdimReadTPMode getReadTPMode(const ToolChain &TC, const llvm::opt::ArgList &Args);
52317019Sdim
53317019Sdimbool useAAPCSForMachO(const llvm::Triple &T);
54317019Sdimvoid getARMArchCPUFromArgs(const llvm::opt::ArgList &Args,
55317019Sdim                           llvm::StringRef &Arch, llvm::StringRef &CPU,
56317019Sdim                           bool FromAs = false);
57317019Sdimvoid getARMTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
58317019Sdim                          const llvm::opt::ArgList &Args,
59317019Sdim                          llvm::opt::ArgStringList &CmdArgs,
60317019Sdim                          std::vector<llvm::StringRef> &Features, bool ForAS);
61317019Sdimint getARMSubArchVersionNumber(const llvm::Triple &Triple);
62317019Sdimbool isARMMProfile(const llvm::Triple &Triple);
63317019Sdim
64317019Sdim} // end namespace arm
65317019Sdim} // end namespace tools
66317019Sdim} // end namespace driver
67317019Sdim} // end namespace clang
68317019Sdim
69317019Sdim#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_ARM_H
70