xref: /freebsd/contrib/llvm-project/clang/lib/Driver/ToolChains/Arch/ARM.h (revision 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e)
10b57cec5SDimitry Andric //===--- ARM.h - ARM-specific (not AArch64) Tool Helpers --------*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #ifndef LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_ARM_H
100b57cec5SDimitry Andric #define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_ARM_H
110b57cec5SDimitry Andric 
120b57cec5SDimitry Andric #include "clang/Driver/ToolChain.h"
130b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
14*06c3fb27SDimitry Andric #include "llvm/Option/ArgList.h"
150b57cec5SDimitry Andric #include "llvm/Option/Option.h"
16*06c3fb27SDimitry Andric #include "llvm/TargetParser/ARMTargetParser.h"
17*06c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h"
180b57cec5SDimitry Andric #include <string>
190b57cec5SDimitry Andric #include <vector>
200b57cec5SDimitry Andric 
210b57cec5SDimitry Andric namespace clang {
220b57cec5SDimitry Andric namespace driver {
230b57cec5SDimitry Andric namespace tools {
240b57cec5SDimitry Andric namespace arm {
250b57cec5SDimitry Andric 
260b57cec5SDimitry Andric std::string getARMTargetCPU(StringRef CPU, llvm::StringRef Arch,
270b57cec5SDimitry Andric                             const llvm::Triple &Triple);
28349cc55cSDimitry Andric std::string getARMArch(llvm::StringRef Arch, const llvm::Triple &Triple);
290b57cec5SDimitry Andric StringRef getARMCPUForMArch(llvm::StringRef Arch, const llvm::Triple &Triple);
300b57cec5SDimitry Andric llvm::ARM::ArchKind getLLVMArchKindForARM(StringRef CPU, StringRef Arch,
310b57cec5SDimitry Andric                                           const llvm::Triple &Triple);
320b57cec5SDimitry Andric StringRef getLLVMArchSuffixForARM(llvm::StringRef CPU, llvm::StringRef Arch,
330b57cec5SDimitry Andric                                   const llvm::Triple &Triple);
340b57cec5SDimitry Andric 
350b57cec5SDimitry Andric void appendBE8LinkFlag(const llvm::opt::ArgList &Args,
360b57cec5SDimitry Andric                        llvm::opt::ArgStringList &CmdArgs,
370b57cec5SDimitry Andric                        const llvm::Triple &Triple);
380b57cec5SDimitry Andric enum class ReadTPMode {
390b57cec5SDimitry Andric   Invalid,
400b57cec5SDimitry Andric   Soft,
41*06c3fb27SDimitry Andric   TPIDRURW,
42*06c3fb27SDimitry Andric   TPIDRURO,
43*06c3fb27SDimitry Andric   TPIDRPRW,
440b57cec5SDimitry Andric };
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric enum class FloatABI {
470b57cec5SDimitry Andric   Invalid,
480b57cec5SDimitry Andric   Soft,
490b57cec5SDimitry Andric   SoftFP,
500b57cec5SDimitry Andric   Hard,
510b57cec5SDimitry Andric };
520b57cec5SDimitry Andric 
53e8d8bef9SDimitry Andric FloatABI getDefaultFloatABI(const llvm::Triple &Triple);
540b57cec5SDimitry Andric FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
555ffd83dbSDimitry Andric FloatABI getARMFloatABI(const Driver &D, const llvm::Triple &Triple,
565ffd83dbSDimitry Andric                         const llvm::opt::ArgList &Args);
57fe6060f1SDimitry Andric void setFloatABIInTriple(const Driver &D, const llvm::opt::ArgList &Args,
58fe6060f1SDimitry Andric                          llvm::Triple &triple);
590eae32dcSDimitry Andric bool isHardTPSupported(const llvm::Triple &Triple);
60349cc55cSDimitry Andric ReadTPMode getReadTPMode(const Driver &D, const llvm::opt::ArgList &Args,
610eae32dcSDimitry Andric                          const llvm::Triple &Triple, bool ForAS);
62fe6060f1SDimitry Andric void setArchNameInTriple(const Driver &D, const llvm::opt::ArgList &Args,
63fe6060f1SDimitry Andric                          types::ID InputType, llvm::Triple &Triple);
640b57cec5SDimitry Andric 
650b57cec5SDimitry Andric bool useAAPCSForMachO(const llvm::Triple &T);
660b57cec5SDimitry Andric void getARMArchCPUFromArgs(const llvm::opt::ArgList &Args,
670b57cec5SDimitry Andric                            llvm::StringRef &Arch, llvm::StringRef &CPU,
680b57cec5SDimitry Andric                            bool FromAs = false);
69*06c3fb27SDimitry Andric llvm::ARM::FPUKind getARMTargetFeatures(const Driver &D,
70*06c3fb27SDimitry Andric                                         const llvm::Triple &Triple,
710b57cec5SDimitry Andric                                         const llvm::opt::ArgList &Args,
72*06c3fb27SDimitry Andric                                         std::vector<llvm::StringRef> &Features,
73*06c3fb27SDimitry Andric                                         bool ForAS, bool ForMultilib = false);
740b57cec5SDimitry Andric int getARMSubArchVersionNumber(const llvm::Triple &Triple);
750b57cec5SDimitry Andric bool isARMMProfile(const llvm::Triple &Triple);
76e8d8bef9SDimitry Andric bool isARMAProfile(const llvm::Triple &Triple);
77*06c3fb27SDimitry Andric bool isARMBigEndian(const llvm::Triple &Triple, const llvm::opt::ArgList &Args);
780b57cec5SDimitry Andric 
790b57cec5SDimitry Andric } // end namespace arm
800b57cec5SDimitry Andric } // end namespace tools
810b57cec5SDimitry Andric } // end namespace driver
820b57cec5SDimitry Andric } // end namespace clang
830b57cec5SDimitry Andric 
840b57cec5SDimitry Andric #endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_ARCH_ARM_H
85