15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- TargetInfo.cpp - Information about Target machine ----------------===// 25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// The LLVM Compiler Infrastructure 45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source 60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details. 75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// This file implements the TargetInfo and TargetInfoImpl interfaces. 115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer// 125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===// 135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/TargetInfo.h" 1555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Basic/AddressSpaces.h" 163f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose#include "clang/Basic/CharInfo.h" 17a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson#include "clang/Basic/LangOptions.h" 18525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner#include "llvm/ADT/APFloat.h" 196fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson#include "llvm/ADT/STLExtras.h" 209fe8c74a93ac8e92512615c5f83e7a328b3b0544David Blaikie#include "llvm/Support/ErrorHandling.h" 215483bdf386ae000ca9c0761481850b005077f4cdChris Lattner#include <cstdlib> 225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang; 235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 24207f4d8543529221932af82836016a2ef066c917Peter Collingbournestatic const LangAS::Map DefaultAddrSpaceMap = { 0 }; 25207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 26cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner// TargetInfo Constructor. 279df0823a4b82794f573e333115ad4dfff3ab0a34Benjamin KramerTargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) { 28b6a169395c1b30c76daffebcbd2164b6247a5d21Daniel Dunbar // Set defaults. Defaults are set for a 32-bit RISC platform, like PPC or 29b6a169395c1b30c76daffebcbd2164b6247a5d21Daniel Dunbar // SPARC. These should be overridden by concrete targets as needed. 30e6a24e83e71f361c7b7de82cf24ee6f5ddc7f1c2Eli Friedman BigEndian = true; 31b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman TLSSupported = true; 329bffb0701d02a10e77e1ac0f196074eed6466ed0Chris Lattner NoAsmVariants = false; 33927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner PointerWidth = PointerAlign = 32; 34c81f2a2c7f83e64b3ef2b77030536290d0e2b350Roman Divacky BoolWidth = BoolAlign = 8; 352621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner IntWidth = IntAlign = 32; 36ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner LongWidth = LongAlign = 32; 37ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner LongLongWidth = LongLongAlign = 64; 387ec59c78f1e19157767648cbe3f0e3630ca1afe7Nick Lewycky SuitableAlign = 64; 396b20351a1d6178addfaa86716aaba36f2e9ea188Ulrich Weigand MinGlobalAlign = 0; 40aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov HalfWidth = 16; 41aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov HalfAlign = 16; 4261538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman FloatWidth = 32; 4361538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman FloatAlign = 32; 443d292065d80fd81c327ad8452625cb4e5785913cNate Begeman DoubleWidth = 64; 4561538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman DoubleAlign = 64; 4661538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman LongDoubleWidth = 64; 4761538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman LongDoubleAlign = 64; 486deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola LargeArrayMinWidth = 0; 496deecb0d46bcfd048e651d2db7c4fb0d6407da96Rafael Espindola LargeArrayAlign = 0; 502be460723940f8184ec36529b6f6ddf59c04e411Eli Friedman MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0; 51f9e9af7df0cea6e997ac04131c7af6ca4384b0ccChad Rosier MaxVectorAlign = 0; 526a3615c90e654fce94e9cf635fb4021d5c40743eAnders Carlsson SizeType = UnsignedLong; 53f509d73ecf2c996e257f1a4e23c1282396b0a847Eli Friedman PtrDiffType = SignedLong; 5431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta IntMaxType = SignedLongLong; 5531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta UIntMaxType = UnsignedLongLong; 566ad474f82f0cf32e13128d89fa5ad3a37ae73530Chris Lattner IntPtrType = SignedLong; 57f509d73ecf2c996e257f1a4e23c1282396b0a847Eli Friedman WCharType = SignedInt; 58e64ef80363c84f4f431e26b61db554c89beeddb6Chris Lattner WIntType = SignedInt; 59f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char16Type = UnsignedShort; 60f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith Char32Type = UnsignedInt; 613c7b6e46c5f9bdbe0676c52d80df98b68b02be99Eli Friedman Int64Type = SignedLongLong; 629cf910efc4fb7001a6d276ed2eabf01f0f0efaaaEdward O'Callaghan SigAtomicType = SignedInt; 636902e4146d426998ff6a94b16776c1b3f805a048Eli Friedman ProcessIDType = SignedInt; 6493a49944e0e68e32bc22d45d44ee136b34beffb3Fariborz Jahanian UseSignedCharForObjCBool = true; 65b6830d616a068971f13e1e213e06a945c8c93ceaDaniel Dunbar UseBitFieldTypeAlignment = true; 6661a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier UseZeroLengthBitfieldAlignment = false; 6761a62216a0bb33fb668ab653d9f9a704e43d2fc6Chad Rosier ZeroLengthBitfieldBoundary = 0; 68aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov HalfFormat = &llvm::APFloat::IEEEhalf; 69cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner FloatFormat = &llvm::APFloat::IEEEsingle; 70cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner DoubleFormat = &llvm::APFloat::IEEEdouble; 71cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner LongDoubleFormat = &llvm::APFloat::IEEEdouble; 726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines DescriptionString = nullptr; 733fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner UserLabelPrefix = "_"; 74be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky MCountName = "mcount"; 7562f940bff18f1e0d48466b08d2b61d137ebb65bdAbramo Bagnara RegParmMax = 0; 7662f940bff18f1e0d48466b08d2b61d137ebb65bdAbramo Bagnara SSERegParmMax = 0; 77613fd67e575ff1c038535b18dafebca070f3ed91Daniel Dunbar HasAlignMac68kSupport = false; 78dacf9dda17346c628fdd8c5df53c681738db0dc5Daniel Dunbar 79dacf9dda17346c628fdd8c5df53c681738db0dc5Daniel Dunbar // Default to no types using fpret. 80dacf9dda17346c628fdd8c5df53c681738db0dc5Daniel Dunbar RealTypeUsesObjCFPRet = 0; 81ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall 82eea64802558cc398571938b1f28cda1d4fa79ec3Anders Carlsson // Default to not using fp2ret for __Complex long double 83eea64802558cc398571938b1f28cda1d4fa79ec3Anders Carlsson ComplexLongDoubleUsesFP2Ret = false; 84eea64802558cc398571938b1f28cda1d4fa79ec3Anders Carlsson 85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Set the C++ ABI based on the triple. 86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TheCXXABI.set(Triple.isKnownWindowsMSVCEnvironment() 87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ? TargetCXXABI::Microsoft 88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines : TargetCXXABI::GenericItanium); 89207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 90207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // Default to an empty address space map. 91207f4d8543529221932af82836016a2ef066c917Peter Collingbourne AddrSpaceMap = &DefaultAddrSpaceMap; 921eef85246b411b55c493098266746d0d83c241eaDavid Tweed UseAddrSpaceMapMangling = false; 930a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 940a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor // Default to an unknown platform name. 950a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor PlatformName = "unknown"; 960a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor PlatformMinVersion = VersionTuple(); 97525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner} 98525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner 99cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner// Out of line virtual dtor for TargetInfo. 100cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris LattnerTargetInfo::~TargetInfo() {} 101525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner 1022b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner/// getTypeName - Return the user string for the specified integer type enum. 1032b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner/// For example, SignedShort -> "short". 1042b5abf515f9696912452f431c7738691cf97f4f1Chris Lattnerconst char *TargetInfo::getTypeName(IntType T) { 1052b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner switch (T) { 106b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1077b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: return "char"; 1087b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: return "unsigned char"; 1092b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedShort: return "short"; 1102b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedShort: return "unsigned short"; 1112b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedInt: return "int"; 1122b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedInt: return "unsigned int"; 1132b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedLong: return "long int"; 1142b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedLong: return "long unsigned int"; 1152b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedLongLong: return "long long int"; 1162b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedLongLong: return "long long unsigned int"; 1172b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner } 1182b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner} 1192b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner 120b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// getTypeConstantSuffix - Return the constant suffix for the specified 121b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// integer type enum. For example, SignedLong -> "L". 122b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattnerconst char *TargetInfo::getTypeConstantSuffix(IntType T) { 123b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner switch (T) { 124b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1257b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 126b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedShort: 127b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedInt: return ""; 128b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedLong: return "L"; 129b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedLongLong: return "LL"; 1307b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: 131b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedShort: 132b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedInt: return "U"; 133b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLong: return "UL"; 134b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLongLong: return "ULL"; 135b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner } 136b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner} 137b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 138237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer/// getTypeWidth - Return the width (in bits) of the specified integer type 139b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// enum. For example, SignedInt -> getIntWidth(). 140b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattnerunsigned TargetInfo::getTypeWidth(IntType T) const { 141b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner switch (T) { 142b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1437b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 1447b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: return getCharWidth(); 1459099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedShort: 146b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedShort: return getShortWidth(); 1479099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedInt: 148b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedInt: return getIntWidth(); 1499099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLong: 150b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLong: return getLongWidth(); 1519099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLongLong: 152b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLongLong: return getLongLongWidth(); 153b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner }; 154b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner} 155b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 1567b7bef1ec355fb46643349d77c266b913f36b656Stepan DyatkovskiyTargetInfo::IntType TargetInfo::getIntTypeByWidth( 1577b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy unsigned BitWidth, bool IsSigned) const { 1587b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getCharWidth() == BitWidth) 1597b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedChar : UnsignedChar; 1607b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getShortWidth() == BitWidth) 1617b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedShort : UnsignedShort; 1627b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getIntWidth() == BitWidth) 1637b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedInt : UnsignedInt; 1647b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getLongWidth() == BitWidth) 1657b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedLong : UnsignedLong; 1667b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getLongLongWidth() == BitWidth) 1677b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedLongLong : UnsignedLongLong; 1687b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return NoInt; 1697b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy} 1707b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 171ef8225444452a1486bd721f3285301fe84643b00Stephen HinesTargetInfo::IntType TargetInfo::getLeastIntTypeByWidth(unsigned BitWidth, 172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines bool IsSigned) const { 173ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (getCharWidth() >= BitWidth) 174ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return IsSigned ? SignedChar : UnsignedChar; 175ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (getShortWidth() >= BitWidth) 176ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return IsSigned ? SignedShort : UnsignedShort; 177ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (getIntWidth() >= BitWidth) 178ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return IsSigned ? SignedInt : UnsignedInt; 179ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (getLongWidth() >= BitWidth) 180ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return IsSigned ? SignedLong : UnsignedLong; 181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (getLongLongWidth() >= BitWidth) 182ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return IsSigned ? SignedLongLong : UnsignedLongLong; 183ef8225444452a1486bd721f3285301fe84643b00Stephen Hines return NoInt; 184ef8225444452a1486bd721f3285301fe84643b00Stephen Hines} 185ef8225444452a1486bd721f3285301fe84643b00Stephen Hines 1867b7bef1ec355fb46643349d77c266b913f36b656Stepan DyatkovskiyTargetInfo::RealType TargetInfo::getRealTypeByWidth(unsigned BitWidth) const { 1877b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getFloatWidth() == BitWidth) 1887b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return Float; 1897b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getDoubleWidth() == BitWidth) 1907b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return Double; 1917b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 1927b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy switch (BitWidth) { 1937b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case 96: 1947b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (&getLongDoubleFormat() == &llvm::APFloat::x87DoubleExtended) 1957b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return LongDouble; 1967b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy break; 1977b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case 128: 19835451d9a00b2a3b40689f6e4d4e259a6d786b395Stepan Dyatkovskiy if (&getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble || 19935451d9a00b2a3b40689f6e4d4e259a6d786b395Stepan Dyatkovskiy &getLongDoubleFormat() == &llvm::APFloat::IEEEquad) 2007b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return LongDouble; 2017b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy break; 2027b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy } 2037b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 2047b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return NoFloat; 2057b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy} 2067b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 207237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer/// getTypeAlign - Return the alignment (in bits) of the specified integer type 2089099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner/// enum. For example, SignedInt -> getIntAlign(). 2099099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattnerunsigned TargetInfo::getTypeAlign(IntType T) const { 2109099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner switch (T) { 211b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 2127b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 2137b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: return getCharAlign(); 2149099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedShort: 2159099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedShort: return getShortAlign(); 2169099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedInt: 2179099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedInt: return getIntAlign(); 2189099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLong: 2199099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedLong: return getLongAlign(); 2209099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLongLong: 2219099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedLongLong: return getLongLongAlign(); 2229099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner }; 2239099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner} 2249099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner 225961f0708fb66375acf47f9e9bc1aecfb3f992aeaChris Lattner/// isTypeSigned - Return whether an integer types is signed. Returns true if 226b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// the type is signed; false otherwise. 2273f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattnerbool TargetInfo::isTypeSigned(IntType T) { 228b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner switch (T) { 229b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 2307b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 231b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedShort: 232b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedInt: 233b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedLong: 234237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer case SignedLongLong: 235b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner return true; 2367b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: 237b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedShort: 238b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedInt: 239b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLong: 240237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer case UnsignedLongLong: 241b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner return false; 242b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner }; 243b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner} 244b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 245ef8225444452a1486bd721f3285301fe84643b00Stephen Hines/// adjust - Set forced language options. 246a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson/// Apply changes to the target information with respect to certain 247a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson/// language options which change the target configuration. 248ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesvoid TargetInfo::adjust(const LangOptions &Opts) { 249fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar if (Opts.NoBitFieldTypeAlign) 250fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar UseBitFieldTypeAlignment = false; 251fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar if (Opts.ShortWChar) 252a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson WCharType = UnsignedShort; 2538bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2548bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed if (Opts.OpenCL) { 2558bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // OpenCL C requires specific widths for types, irrespective of 2568bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // what these normally are for the target. 2578bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // We also define long long and long double here, although the 2588bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // OpenCL standard only mentions these as "reserved". 2598bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed IntWidth = IntAlign = 32; 2608bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongWidth = LongAlign = 64; 2618bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongLongWidth = LongLongAlign = 128; 2628bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed HalfWidth = HalfAlign = 16; 2638bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed FloatWidth = FloatAlign = 32; 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // Embedded 32-bit targets (OpenCL EP) might have double C type 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // defined as float. Let's not override this as it might lead 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // to generating illegal code that uses 64bit doubles. 268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (DoubleWidth != FloatWidth) { 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DoubleWidth = DoubleAlign = 64; 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines DoubleFormat = &llvm::APFloat::IEEEdouble; 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 2728bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongDoubleWidth = LongDoubleAlign = 128; 2738bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2748bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed assert(PointerWidth == 32 || PointerWidth == 64); 2751e24463067cd8d270e67cc926341e43e6b6f019aDavid Tweed bool Is32BitArch = PointerWidth == 32; 2761e24463067cd8d270e67cc926341e43e6b6f019aDavid Tweed SizeType = Is32BitArch ? UnsignedInt : UnsignedLong; 2771e24463067cd8d270e67cc926341e43e6b6f019aDavid Tweed PtrDiffType = Is32BitArch ? SignedInt : SignedLong; 2781e24463067cd8d270e67cc926341e43e6b6f019aDavid Tweed IntPtrType = Is32BitArch ? SignedInt : SignedLong; 2798bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2808bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed IntMaxType = SignedLongLong; 2818bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed UIntMaxType = UnsignedLongLong; 2828bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed Int64Type = SignedLong; 2838bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2848bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed HalfFormat = &llvm::APFloat::IEEEhalf; 2858bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed FloatFormat = &llvm::APFloat::IEEEsingle; 2868bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongDoubleFormat = &llvm::APFloat::IEEEquad; 2878bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed } 288a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson} 289b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 290525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner//===----------------------------------------------------------------------===// 291525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner 2925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef removeGCCRegisterPrefix(StringRef Name) { 294ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson if (Name[0] == '%' || Name[0] == '#') 29583c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson Name = Name.substr(1); 296237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer 29783c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson return Name; 298ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson} 299ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson 300de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher/// isValidClobber - Returns whether the passed in string is 301de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher/// a valid clobber in an inline asm statement. This is used by 302de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher/// Sema. 3035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool TargetInfo::isValidClobber(StringRef Name) const { 304de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher return (isValidGCCRegisterName(Name) || 305de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher Name == "memory" || Name == "cc"); 306de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher} 307de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher 3083346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// isValidGCCRegisterName - Returns whether the passed in string 3093346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// is a valid register name according to GCC. This is used by Sema for 3103346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// inline asm statements. 3115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool TargetInfo::isValidGCCRegisterName(StringRef Name) const { 31283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Name.empty()) 31383c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson return false; 314237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer 3156fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson const char * const *Names; 3166fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson unsigned NumNames; 3171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3186fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // Get rid of any register prefix. 31983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson Name = removeGCCRegisterPrefix(Name); 320ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson 3210eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegNames(Names, NumNames); 3221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3236fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // If we have a number it maps to an entry in the register name array. 3243f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isDigit(Name[0])) { 32583c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson int n; 32683c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (!Name.getAsInteger(0, n)) 3276fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson return n >= 0 && (unsigned)n < NumNames; 3286fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3296fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson 3306fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // Check register names. 3316fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson for (unsigned i = 0; i < NumNames; i++) { 33283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Name == Names[i]) 3336fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson return true; 3346fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3351eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 336cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Check any additional names that we have. 337cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher const AddlRegName *AddlNames; 338cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher unsigned NumAddlNames; 339cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher getGCCAddlRegNames(AddlNames, NumAddlNames); 340cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned i = 0; i < NumAddlNames; i++) 341cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) { 342cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (!AddlNames[i].Names[j]) 343cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher break; 344cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Make sure the register that the additional name is for is within 345cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // the bounds of the register names from above. 346cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames) 347cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher return true; 348cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher } 349cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher 3506fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // Now check aliases. 3510eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner const GCCRegAlias *Aliases; 3526fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson unsigned NumAliases; 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3540eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegAliases(Aliases, NumAliases); 3556fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson for (unsigned i = 0; i < NumAliases; i++) { 3566fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) { 3576fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson if (!Aliases[i].Aliases[j]) 3586fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson break; 35983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Aliases[i].Aliases[j] == Name) 3606fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson return true; 3616fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3626fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3631eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3643346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson return false; 3653346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson} 366d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 3675f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef 3685f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerTargetInfo::getNormalizedGCCRegisterName(StringRef Name) const { 369d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson assert(isValidGCCRegisterName(Name) && "Invalid register passed in"); 3701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 37183c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson // Get rid of any register prefix. 37283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson Name = removeGCCRegisterPrefix(Name); 3731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 374d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson const char * const *Names; 375d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson unsigned NumNames; 376d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 3770eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegNames(Names, NumNames); 378d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 379d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // First, check if we have a number. 3803f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isDigit(Name[0])) { 38183c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson int n; 38283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (!Name.getAsInteger(0, n)) { 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(n >= 0 && (unsigned)n < NumNames && 384d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson "Out of bounds register number!"); 385d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return Names[n]; 386d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 387d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 3881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 389cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Check any additional names that we have. 390cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher const AddlRegName *AddlNames; 391cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher unsigned NumAddlNames; 392cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher getGCCAddlRegNames(AddlNames, NumAddlNames); 393cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned i = 0; i < NumAddlNames; i++) 394cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) { 395cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (!AddlNames[i].Names[j]) 396cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher break; 397cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Make sure the register that the additional name is for is within 398cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // the bounds of the register names from above. 399cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames) 400cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher return Name; 401cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher } 402cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher 403d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Now check aliases. 4040eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner const GCCRegAlias *Aliases; 405d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson unsigned NumAliases; 4061eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4070eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegAliases(Aliases, NumAliases); 408d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson for (unsigned i = 0; i < NumAliases; i++) { 409d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) { 410d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (!Aliases[i].Aliases[j]) 411d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 41283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Aliases[i].Aliases[j] == Name) 413d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return Aliases[i].Register; 414d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 415d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 4161eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 417d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return Name; 418d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson} 419d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 420432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattnerbool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { 421432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner const char *Name = Info.getConstraintStr().c_str(); 422d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // An output constraint must start with '=' or '+' 423d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (*Name != '=' && *Name != '+') 424d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return false; 425d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 426d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (*Name == '+') 42744def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setIsReadWrite(); 428d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 429d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson Name++; 430d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson while (*Name) { 431d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson switch (*Name) { 432d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson default: 43344def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner if (!validateAsmConstraint(Name, Info)) { 4345ab201a324b2153ce151904d397c05fab798e0bcTed Kremenek // FIXME: We temporarily return false 435d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // so we can add more constraints as we hit it. 436d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Eventually, an unknown constraint should just be treated as 'g'. 4375ab201a324b2153ce151904d397c05fab798e0bcTed Kremenek return false; 438d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 439d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case '&': // early clobber. 440d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 4414053983963cb94a6129da47bca8cce637c8b7bffChris Lattner case '%': // commutative. 4424053983963cb94a6129da47bca8cce637c8b7bffChris Lattner // FIXME: Check that there is a another register after this one. 4434053983963cb94a6129da47bca8cce637c8b7bffChris Lattner break; 444d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'r': // general register. 44544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 446d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 447d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'm': // memory operand. 4480f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'o': // offsetable memory operand. 4490f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'V': // non-offsetable memory operand. 4500f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '<': // autodecrement memory operand. 4510f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '>': // autoincrement memory operand. 45244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 453d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 454d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'g': // general register, memory operand or immediate integer. 455775841fd76a7aead92c10cec4acb5e8a199f53b1Anders Carlsson case 'X': // any operand. 45644def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 45744def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 458d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 459ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case ',': // multiple alternative constraint. Pass it. 4606f158034915a112d6082a6b238a56337d1528328John Thompson // Handle additional optional '=' or '+' modifiers. 4612f474ea9ef7505df5d092287c48c19974222293bJohn Thompson if (Name[1] == '=' || Name[1] == '+') 4626f158034915a112d6082a6b238a56337d1528328John Thompson Name++; 463ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; 464ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case '?': // Disparage slightly code. 4650f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '!': // Disparage severely. 466e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '#': // Ignore as constraint. 467e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '*': // Ignore for choosing register preferences. 468ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; // Pass them. 469d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 471d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson Name++; 472d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 4731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4746576a0d1e26f617d29d54ed99b16099d93a05264Benjamin Kramer // If a constraint allows neither memory nor register operands it contains 4756576a0d1e26f617d29d54ed99b16099d93a05264Benjamin Kramer // only modifiers. Reject it. 4765ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer return Info.allowsMemory() || Info.allowsRegister(); 477d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson} 478d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 47942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlssonbool TargetInfo::resolveSymbolicName(const char *&Name, 4802819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner ConstraintInfo *OutputConstraints, 4812819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner unsigned NumOutputs, 48244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner unsigned &Index) const { 48342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson assert(*Name == '[' && "Symbolic name did not start with '['"); 48442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson Name++; 48542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson const char *Start = Name; 48642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson while (*Name && *Name != ']') 48742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson Name++; 4881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 48942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson if (!*Name) { 49042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson // Missing ']' 49142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return false; 49242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson } 4931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson std::string SymbolicName(Start, Name - Start); 4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4962819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner for (Index = 0; Index != NumOutputs; ++Index) 4972819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner if (SymbolicName == OutputConstraints[Index].getName()) 49842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return true; 49942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson 50042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return false; 50142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson} 50242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson 5032819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattnerbool TargetInfo::validateInputConstraint(ConstraintInfo *OutputConstraints, 5042819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner unsigned NumOutputs, 50544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner ConstraintInfo &Info) const { 506432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner const char *Name = Info.ConstraintStr.c_str(); 507432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner 508651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!*Name) 509651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 511d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson while (*Name) { 512d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson switch (*Name) { 513d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson default: 514d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Check if we have a matching constraint 515d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (*Name >= '0' && *Name <= '9') { 516d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson unsigned i = *Name - '0'; 5171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 518d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Check if matching constraint is out of bounds. 519d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (i >= NumOutputs) 520d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return false; 5211eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52286eda39c8af47280273758debf0432933bdeee3cAnders Carlsson // A number must refer to an output only operand. 52386eda39c8af47280273758debf0432933bdeee3cAnders Carlsson if (OutputConstraints[i].isReadWrite()) 52486eda39c8af47280273758debf0432933bdeee3cAnders Carlsson return false; 52586eda39c8af47280273758debf0432933bdeee3cAnders Carlsson 52679ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // If the constraint is already tied, it must be tied to the 52779ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // same operand referenced to by the number. 52879ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson if (Info.hasTiedOperand() && Info.getTiedOperand() != i) 52979ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson return false; 53079ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson 5311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // The constraint should have the same info as the respective 53203eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson // output constraint. 533d68876176a0d2c19e3864e7d38f6036c4f72f0a3Chris Lattner Info.setTiedOperand(i, OutputConstraints[i]); 53444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner } else if (!validateAsmConstraint(Name, Info)) { 535302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar // FIXME: This error return is in place temporarily so we can 536302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar // add more constraints as we hit it. Eventually, an unknown 537302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar // constraint should just be treated as 'g'. 538302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar return false; 53942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson } 54042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson break; 54142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson case '[': { 54242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson unsigned Index = 0; 5432819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner if (!resolveSymbolicName(Name, OutputConstraints, NumOutputs, Index)) 54442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return false; 5451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 54679ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // If the constraint is already tied, it must be tied to the 54779ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // same operand referenced to by the number. 54879ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson if (Info.hasTiedOperand() && Info.getTiedOperand() != Index) 54979ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson return false; 55079ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson 5510eff4e73d58cf28458470beec31b33bcb302377cEli Friedman Info.setTiedOperand(Index, OutputConstraints[Index]); 55242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson break; 5531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 55444fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson case '%': // commutative 55544fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson // FIXME: Fail if % is used with the last operand. 55644fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson break; 557d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'i': // immediate integer. 558efdfa77fecdfc400d18263213f569e0526fea9dcAnders Carlsson case 'n': // immediate integer with a known value. 559d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 5601d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'I': // Various constant constraints with target-specific meanings. 5611d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'J': 5621d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'K': 5631d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'L': 5641d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'M': 5651d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'N': 5661d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'O': 5671d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'P': 5681d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner break; 569d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'r': // general register. 57044def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 571d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 572d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'm': // memory operand. 5730f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'o': // offsettable memory operand. 5740f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'V': // non-offsettable memory operand. 5750f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '<': // autodecrement memory operand. 5760f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '>': // autoincrement memory operand. 57744def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 578d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 579d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'g': // general register, memory operand or immediate integer. 580775841fd76a7aead92c10cec4acb5e8a199f53b1Anders Carlsson case 'X': // any operand. 58144def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 58244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 583d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 5847ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson case 'E': // immediate floating point. 5857ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson case 'F': // immediate floating point. 5867ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson case 'p': // address operand. 5877ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson break; 588ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case ',': // multiple alternative constraint. Ignore comma. 589ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; 590ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case '?': // Disparage slightly code. 591fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner case '!': // Disparage severely. 592e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '#': // Ignore as constraint. 593e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '*': // Ignore for choosing register preferences. 594ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; // Pass them. 595d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 5961eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 597d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson Name++; 598d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 5991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 600d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return true; 601d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson} 602b8b2c9da87e7d70a1679db026f40548b3192b705John McCall 603b8b2c9da87e7d70a1679db026f40548b3192b705John McCallbool TargetCXXABI::tryParse(llvm::StringRef name) { 604b8b2c9da87e7d70a1679db026f40548b3192b705John McCall const Kind unknown = static_cast<Kind>(-1); 605b8b2c9da87e7d70a1679db026f40548b3192b705John McCall Kind kind = llvm::StringSwitch<Kind>(name) 606b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("arm", GenericARM) 607b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("ios", iOS) 608b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("itanium", GenericItanium) 609b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("microsoft", Microsoft) 610b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Default(unknown); 611b8b2c9da87e7d70a1679db026f40548b3192b705John McCall if (kind == unknown) return false; 612b8b2c9da87e7d70a1679db026f40548b3192b705John McCall 613b8b2c9da87e7d70a1679db026f40548b3192b705John McCall set(kind); 614b8b2c9da87e7d70a1679db026f40548b3192b705John McCall return true; 615b8b2c9da87e7d70a1679db026f40548b3192b705John McCall} 616