ARMSubtarget.h revision 04321f70f5075673934d5b1ed3353dd15d911183
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//=====---- ARMSubtarget.h - Define Subtarget for the ARM -----*- C++ -*--====// 2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// The LLVM Compiler Infrastructure 4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 5a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file was developed by Evan Cheng and is distributed under the 6a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// University of Illinois Open Source License. See LICENSE.TXT for details. 7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file declares the ARM specific subclass of TargetSubtarget. 11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// 12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===// 13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#ifndef ARMSUBTARGET_H 15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#define ARMSUBTARGET_H 16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 17a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/Target/TargetSubtarget.h" 18a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include <string> 19a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 20a8e2989ece6dc46df59b0768184028257f913843Evan Chengnamespace llvm { 21a8e2989ece6dc46df59b0768184028257f913843Evan Chengclass Module; 22a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 23a8e2989ece6dc46df59b0768184028257f913843Evan Chengclass ARMSubtarget : public TargetSubtarget { 24a8e2989ece6dc46df59b0768184028257f913843Evan Chengprotected: 25a8e2989ece6dc46df59b0768184028257f913843Evan Cheng enum ARMArchEnum { 26a8e2989ece6dc46df59b0768184028257f913843Evan Cheng V4T, V5T, V5TE, V6 27a8e2989ece6dc46df59b0768184028257f913843Evan Cheng }; 28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// ARMArchVersion - ARM architecture vecrsion: V4T (base), V5T, V5TE, 30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// and V6. 31a8e2989ece6dc46df59b0768184028257f913843Evan Cheng ARMArchEnum ARMArchVersion; 32a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 33a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// HasVFP2 - True if the processor supports Vector Floating Point (VFP) V2 34a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// instructions. 35a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool HasVFP2; 36a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 37a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// IsThumb - True if we are in thumb mode, false if in ARM mode. 38a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsThumb; 39a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 40a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// UseThumbBacktraces - True if we use thumb style backtraces. 41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool UseThumbBacktraces; 42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 43a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// IsR9Reserved - True if R9 is a not available as general purpose register. 44a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool IsR9Reserved; 453630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stackAlignment - The minimum alignment known to hold of the stack frame on 47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// entry to the function and which must be maintained by every function. 48a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned stackAlignment; 49a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 50a8e2989ece6dc46df59b0768184028257f913843Evan Cheng public: 511a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng enum { 521a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng isELF, isDarwin 531a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng } TargetType; 541a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng 553630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio enum { 563630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio ARM_ABI_APCS, 573630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio ARM_ABI_AAPCS // ARM EABI 583630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio } TargetABI; 593630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 60a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// This constructor initializes the data members to match that 61a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// of the specified module. 62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// 6304321f70f5075673934d5b1ed3353dd15d911183Evan Cheng ARMSubtarget(const Module &M, const std::string &FS, bool thumb); 64a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 65a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// ParseSubtargetFeatures - Parses features string setting specified 66a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// subtarget options. Definition of function is auto generated by tblgen. 67a8e2989ece6dc46df59b0768184028257f913843Evan Cheng void ParseSubtargetFeatures(const std::string &FS, const std::string &CPU); 68a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 69a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV4TOps() const { return ARMArchVersion >= V4T; } 70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TOps() const { return ARMArchVersion >= V5T; } 71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV5TEOps() const { return ARMArchVersion >= V5TE; } 72a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasV6Ops() const { return ARMArchVersion >= V6; } 73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 74a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool hasVFP2() const { return HasVFP2; } 75a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 761a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng bool isTargetDarwin() const { return TargetType == isDarwin; } 771a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng bool isTargetELF() const { return TargetType == isELF; } 781a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng 793630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio bool isAPCS_ABI() const { return TargetABI == ARM_ABI_APCS; } 803630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio bool isAAPCS_ABI() const { return TargetABI == ARM_ABI_AAPCS; } 813630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio 82a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isThumb() const { return IsThumb; } 83a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 84a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool useThumbBacktraces() const { return UseThumbBacktraces; } 85a8e2989ece6dc46df59b0768184028257f913843Evan Cheng bool isR9Reserved() const { return IsR9Reserved; } 86a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 87a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// getStackAlignment - Returns the minimum alignment known to hold of the 88a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// stack frame on entry to the function and which must be maintained by every 89a8e2989ece6dc46df59b0768184028257f913843Evan Cheng /// function for this subtarget. 90a8e2989ece6dc46df59b0768184028257f913843Evan Cheng unsigned getStackAlignment() const { return stackAlignment; } 91a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}; 92a8e2989ece6dc46df59b0768184028257f913843Evan Cheng} // End llvm namespace 93a8e2989ece6dc46df59b0768184028257f913843Evan Cheng 94a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif // ARMSUBTARGET_H 95