ARMSubtarget.cpp revision 4b1747430a2d67702958b95d6776396734f184a0
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"
16a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#include "llvm/Module.h"
17a8e2989ece6dc46df59b0768184028257f913843Evan Chengusing namespace llvm;
18a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
1904321f70f5075673934d5b1ed3353dd15d911183Evan ChengARMSubtarget::ARMSubtarget(const Module &M, const std::string &FS, bool thumb)
201a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng  : ARMArchVersion(V4T)
211a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng  , HasVFP2(false)
2204321f70f5075673934d5b1ed3353dd15d911183Evan Cheng  , IsThumb(thumb)
231a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng  , UseThumbBacktraces(false)
241a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng  , IsR9Reserved(false)
253630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , stackAlignment(4)
263630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetType(isELF) // Default to ELF unless otherwise specified.
273630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  , TargetABI(ARM_ABI_APCS) {
28a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
29a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Determine default and user specified characteristics
30a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  std::string CPU = "generic";
31a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
32a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Parse features string.
33a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  ParseSubtargetFeatures(FS, CPU);
34a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
35a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // Set the boolean corresponding to the current target triple, or the default
36a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  // if one cannot be determined, to true.
37a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  const std::string& TT = M.getTargetTriple();
384b1747430a2d67702958b95d6776396734f184a0Evan Cheng  unsigned Len = TT.length();
394b1747430a2d67702958b95d6776396734f184a0Evan Cheng  if (Len >= 5) {
404b1747430a2d67702958b95d6776396734f184a0Evan Cheng    if (TT.substr(0, 4) == "armv") {
414b1747430a2d67702958b95d6776396734f184a0Evan Cheng      unsigned SubVer = TT[4];
424b1747430a2d67702958b95d6776396734f184a0Evan Cheng      if (SubVer > '4' && SubVer <= '9') {
434b1747430a2d67702958b95d6776396734f184a0Evan Cheng        if (SubVer >= '6')
444b1747430a2d67702958b95d6776396734f184a0Evan Cheng          ARMArchVersion = V6;
454b1747430a2d67702958b95d6776396734f184a0Evan Cheng        else if (SubVer == '5') {
464b1747430a2d67702958b95d6776396734f184a0Evan Cheng          ARMArchVersion = V5T;
474b1747430a2d67702958b95d6776396734f184a0Evan Cheng          if (Len >= 7 && TT[5] == 't' && TT[6] == 'e')
484b1747430a2d67702958b95d6776396734f184a0Evan Cheng            ARMArchVersion = V5TE;
494b1747430a2d67702958b95d6776396734f184a0Evan Cheng        }
504b1747430a2d67702958b95d6776396734f184a0Evan Cheng      }
514b1747430a2d67702958b95d6776396734f184a0Evan Cheng    }
524b1747430a2d67702958b95d6776396734f184a0Evan Cheng  }
534b1747430a2d67702958b95d6776396734f184a0Evan Cheng
544b1747430a2d67702958b95d6776396734f184a0Evan Cheng  if (Len > 5) {
551a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng    if (TT.find("-darwin") != std::string::npos)
561a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng      TargetType = isDarwin;
57a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  } else if (TT.empty()) {
58a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#if defined(__APPLE__)
591a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng    TargetType = isDarwin;
60a8e2989ece6dc46df59b0768184028257f913843Evan Cheng#endif
61a8e2989ece6dc46df59b0768184028257f913843Evan Cheng  }
62a8e2989ece6dc46df59b0768184028257f913843Evan Cheng
633630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (TT.find("eabi") != std::string::npos)
643630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    TargetABI = ARM_ABI_AAPCS;
653630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
663630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  if (isAAPCS_ABI())
673630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio    stackAlignment = 8;
683630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio
691a3771e30e48b9cc21ccdc79fc9cf37ec4104b17Evan Cheng  if (isTargetDarwin()) {
70a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    UseThumbBacktraces = true;
71a8e2989ece6dc46df59b0768184028257f913843Evan Cheng    IsR9Reserved = true;
723630e78db9268dbe81a9369a33e49b857804f2ecLauro Ramos Venancio  }
73a8e2989ece6dc46df59b0768184028257f913843Evan Cheng}
74