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