ARMSubtarget.cpp revision e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296c
1a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===-- ARMSubtarget.cpp - ARM Subtarget Information ------------*- C++ -*-===//
2a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
3a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//                     The LLVM Compiler Infrastructure
4a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
8a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
9a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
10a8e2989ece6dc46df59b0768184028257f913843Evan Cheng// This file implements the ARM specific subclass of TargetSubtarget.
11a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//
12a8e2989ece6dc46df59b0768184028257f913843Evan Cheng//===----------------------------------------------------------------------===//
13a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
14a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMSubtarget.h"
15a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "ARMGenSubtarget.inc"
16e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng#include "llvm/GlobalValue.h"
170eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov#include "llvm/Target/TargetOptions.h"
1854fc124d72512d65d62565cabcd85c7b07496513Bob Wilson#include "llvm/Support/CommandLine.h"
19a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm;
20a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
2154fc124d72512d65d62565cabcd85c7b07496513Bob Wilsonstatic cl::opt<bool>
2254fc124d72512d65d62565cabcd85c7b07496513Bob WilsonReserveR9("arm-reserve-r9", cl::Hidden,
2354fc124d72512d65d62565cabcd85c7b07496513Bob Wilson          cl::desc("Reserve R9, making it unavailable as GPR"));
2454fc124d72512d65d62565cabcd85c7b07496513Bob Wilson
253be03406c9c3b2075d5ae416499af2f15f703d6fDaniel DunbarARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &FS,
26d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov                           bool isThumb)
271a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng  : ARMArchVersion(V4T)
286d7d2aa38a247426e2ccf53e3c6ad0315c9a4d8cAnton Korobeynikov  , ARMFPUType(None)
2942a83f2d15cbbc08f5be19856198e3c885221e9cDavid Goodwin  , UseNEONForSinglePrecisionFP(false)
3070459bef9ccd73b3a2a44fdd62f2509861112745Anton Korobeynikov  , IsThumb(isThumb)
3170459bef9ccd73b3a2a44fdd62f2509861112745Anton Korobeynikov  , ThumbMode(Thumb1)
3254fc124d72512d65d62565cabcd85c7b07496513Bob Wilson  , IsR9Reserved(ReserveR9)
333630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , stackAlignment(4)
3441a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov  , CPUString("generic")
353630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetType(isELF) // Default to ELF unless otherwise specified.
363630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetABI(ARM_ABI_APCS) {
370eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov  // default to soft float ABI
380eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov  if (FloatABIType == FloatABI::Default)
390eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov    FloatABIType = FloatABI::Soft;
400eebf653a7b2978e7761f8d068b6fbec22aea0f6Anton Korobeynikov
41a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Determine default and user specified characteristics
42a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
43a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Parse features string.
4441a024385f1220eadc48b48cb4c044a5fbc1b361Anton Korobeynikov  CPUString = ParseSubtargetFeatures(FS, CPUString);
45a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
46a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Set the boolean corresponding to the current target triple, or the default
47a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // if one cannot be determined, to true.
484b1747430a2d67702958b95d6776396734f184a0Evan Cheng  unsigned Len = TT.length();
498c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  unsigned Idx = 0;
50d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov
518c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  if (Len >= 5 && TT.substr(0, 4) == "armv")
528c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    Idx = 4;
539170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson  else if (Len >= 6 && TT.substr(0, 5) == "thumb") {
5470459bef9ccd73b3a2a44fdd62f2509861112745Anton Korobeynikov    IsThumb = true;
558c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    if (Len >= 7 && TT[5] == 'v')
568c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng      Idx = 6;
578c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  }
588c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  if (Idx) {
598c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    unsigned SubVer = TT[Idx];
608c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng    if (SubVer > '4' && SubVer <= '9') {
619170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson      if (SubVer >= '7') {
62d4022c3fbb0705abdc8eddc3ee4a5059f5ef8094Anton Korobeynikov        ARMArchVersion = V7A;
639170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson      } else if (SubVer == '6') {
648c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng        ARMArchVersion = V6;
659170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson        if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == '2')
669170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson          ARMArchVersion = V6T2;
679170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson      } else if (SubVer == '5') {
688c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng        ARMArchVersion = V5T;
698c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng        if (Len >= Idx+3 && TT[Idx+1] == 't' && TT[Idx+2] == 'e')
708c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng          ARMArchVersion = V5TE;
714b1747430a2d67702958b95d6776396734f184a0Evan Cheng      }
729170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson      if (ARMArchVersion >= V6T2)
739170ab6685fcd820c6274e761b8c3a71f25ae074Bob Wilson        ThumbMode = Thumb2;
744b1747430a2d67702958b95d6776396734f184a0Evan Cheng    }
754b1747430a2d67702958b95d6776396734f184a0Evan Cheng  }
764b1747430a2d67702958b95d6776396734f184a0Evan Cheng
77b620724e614c6594e7b269b6ea7d8483947ea944Evan Cheng  // Thumb2 implies at least V6T2.
78b620724e614c6594e7b269b6ea7d8483947ea944Evan Cheng  if (ARMArchVersion < V6T2 && ThumbMode >= Thumb2)
79b620724e614c6594e7b269b6ea7d8483947ea944Evan Cheng    ARMArchVersion = V6T2;
80b620724e614c6594e7b269b6ea7d8483947ea944Evan Cheng
818c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng  if (Len >= 10) {
821a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng    if (TT.find("-darwin") != std::string::npos)
838c6b991635ff589fbe4b8db013bcc1d2ef57a0e0Evan Cheng      // arm-darwin
841a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng      TargetType = isDarwin;
85a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
86a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
873630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (TT.find("eabi") != std::string::npos)
883630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    TargetABI = ARM_ABI_AAPCS;
893630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
903630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (isAAPCS_ABI())
913630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    stackAlignment = 8;
923630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
93cd828618b8c6ec58df94aec0f5546f009f2fd0d5Evan Cheng  if (isTargetDarwin())
9454fc124d72512d65d62565cabcd85c7b07496513Bob Wilson    IsR9Reserved = ReserveR9 | (ARMArchVersion < V6);
95a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
96e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng
97e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng/// GVIsIndirectSymbol - true if the GV will be accessed via an indirect symbol.
98e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Chengbool ARMSubtarget::GVIsIndirectSymbol(GlobalValue *GV, bool isStatic) const {
99e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng  // If symbol visibility is hidden, the extra load is not needed if
100e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng  // the symbol is definitely defined in the current translation unit.
101e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng  bool isDecl = GV->isDeclaration() || GV->hasAvailableExternallyLinkage();
102e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng  if (GV->hasHiddenVisibility() && (!isDecl && !GV->hasCommonLinkage()))
103e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng    return false;
104e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng  return !isStatic && (isDecl || GV->isWeakForLinker());
105e4e4ed3b56f63e9343e01bf0b2ecd7c1f45d296cEvan Cheng}
106