TargetInfo.cpp revision 8bc56022db2d9b16aab25ce3b6fccda9dd8991fc
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; 72ed855cbbdfa53215c23b49064bb79579a1840fe1Eli Friedman DescriptionString = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-" 731932e12d8bf435b9d449906bea7edcf183aa5d19Chris Lattner "i64:64:64-f32:32:32-f64:64:64-n32"; 743fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner UserLabelPrefix = "_"; 75be4c8705e499b55548467eb7adaa23cbc6edfef9Roman Divacky MCountName = "mcount"; 7662f940bff18f1e0d48466b08d2b61d137ebb65bdAbramo Bagnara RegParmMax = 0; 7762f940bff18f1e0d48466b08d2b61d137ebb65bdAbramo Bagnara SSERegParmMax = 0; 78613fd67e575ff1c038535b18dafebca070f3ed91Daniel Dunbar HasAlignMac68kSupport = false; 79dacf9dda17346c628fdd8c5df53c681738db0dc5Daniel Dunbar 80dacf9dda17346c628fdd8c5df53c681738db0dc5Daniel Dunbar // Default to no types using fpret. 81dacf9dda17346c628fdd8c5df53c681738db0dc5Daniel Dunbar RealTypeUsesObjCFPRet = 0; 82ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall 83eea64802558cc398571938b1f28cda1d4fa79ec3Anders Carlsson // Default to not using fp2ret for __Complex long double 84eea64802558cc398571938b1f28cda1d4fa79ec3Anders Carlsson ComplexLongDoubleUsesFP2Ret = false; 85eea64802558cc398571938b1f28cda1d4fa79ec3Anders Carlsson 86ee79a4c30e5d1c5285551c9a25b8ec6d45d46aa7John McCall // Default to using the Itanium ABI. 87b8b2c9da87e7d70a1679db026f40548b3192b705John McCall TheCXXABI.set(TargetCXXABI::GenericItanium); 88207f4d8543529221932af82836016a2ef066c917Peter Collingbourne 89207f4d8543529221932af82836016a2ef066c917Peter Collingbourne // Default to an empty address space map. 90207f4d8543529221932af82836016a2ef066c917Peter Collingbourne AddrSpaceMap = &DefaultAddrSpaceMap; 910a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor 920a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor // Default to an unknown platform name. 930a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor PlatformName = "unknown"; 940a0d2b179085a52c10402feebeb6db8b4d96a140Douglas Gregor PlatformMinVersion = VersionTuple(); 95525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner} 96525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner 97cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner// Out of line virtual dtor for TargetInfo. 98cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris LattnerTargetInfo::~TargetInfo() {} 99525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner 1002b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner/// getTypeName - Return the user string for the specified integer type enum. 1012b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner/// For example, SignedShort -> "short". 1022b5abf515f9696912452f431c7738691cf97f4f1Chris Lattnerconst char *TargetInfo::getTypeName(IntType T) { 1032b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner switch (T) { 104b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1057b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: return "char"; 1067b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: return "unsigned char"; 1072b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedShort: return "short"; 1082b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedShort: return "unsigned short"; 1092b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedInt: return "int"; 1102b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedInt: return "unsigned int"; 1112b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedLong: return "long int"; 1122b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedLong: return "long unsigned int"; 1132b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case SignedLongLong: return "long long int"; 1142b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner case UnsignedLongLong: return "long long unsigned int"; 1152b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner } 1162b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner} 1172b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner 118b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// getTypeConstantSuffix - Return the constant suffix for the specified 119b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// integer type enum. For example, SignedLong -> "L". 120b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattnerconst char *TargetInfo::getTypeConstantSuffix(IntType T) { 121b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner switch (T) { 122b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1237b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 124b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedShort: 125b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedInt: return ""; 126b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedLong: return "L"; 127b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedLongLong: return "LL"; 1287b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: 129b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedShort: 130b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedInt: return "U"; 131b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLong: return "UL"; 132b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLongLong: return "ULL"; 133b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner } 134b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner} 135b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 136237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer/// getTypeWidth - Return the width (in bits) of the specified integer type 137b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// enum. For example, SignedInt -> getIntWidth(). 138b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattnerunsigned TargetInfo::getTypeWidth(IntType T) const { 139b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner switch (T) { 140b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1417b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 1427b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: return getCharWidth(); 1439099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedShort: 144b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedShort: return getShortWidth(); 1459099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedInt: 146b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedInt: return getIntWidth(); 1479099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLong: 148b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLong: return getLongWidth(); 1499099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLongLong: 150b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLongLong: return getLongLongWidth(); 151b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner }; 152b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner} 153b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 1547b7bef1ec355fb46643349d77c266b913f36b656Stepan DyatkovskiyTargetInfo::IntType TargetInfo::getIntTypeByWidth( 1557b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy unsigned BitWidth, bool IsSigned) const { 1567b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getCharWidth() == BitWidth) 1577b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedChar : UnsignedChar; 1587b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getShortWidth() == BitWidth) 1597b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedShort : UnsignedShort; 1607b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getIntWidth() == BitWidth) 1617b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedInt : UnsignedInt; 1627b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getLongWidth() == BitWidth) 1637b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedLong : UnsignedLong; 1647b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getLongLongWidth() == BitWidth) 1657b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return IsSigned ? SignedLongLong : UnsignedLongLong; 1667b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return NoInt; 1677b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy} 1687b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 1697b7bef1ec355fb46643349d77c266b913f36b656Stepan DyatkovskiyTargetInfo::RealType TargetInfo::getRealTypeByWidth(unsigned BitWidth) const { 1707b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getFloatWidth() == BitWidth) 1717b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return Float; 1727b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (getDoubleWidth() == BitWidth) 1737b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return Double; 1747b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 1757b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy switch (BitWidth) { 1767b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case 96: 1777b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy if (&getLongDoubleFormat() == &llvm::APFloat::x87DoubleExtended) 1787b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return LongDouble; 1797b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy break; 1807b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case 128: 18135451d9a00b2a3b40689f6e4d4e259a6d786b395Stepan Dyatkovskiy if (&getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble || 18235451d9a00b2a3b40689f6e4d4e259a6d786b395Stepan Dyatkovskiy &getLongDoubleFormat() == &llvm::APFloat::IEEEquad) 1837b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return LongDouble; 1847b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy break; 1857b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy } 1867b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 1877b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy return NoFloat; 1887b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy} 1897b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy 190237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer/// getTypeAlign - Return the alignment (in bits) of the specified integer type 1919099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner/// enum. For example, SignedInt -> getIntAlign(). 1929099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattnerunsigned TargetInfo::getTypeAlign(IntType T) const { 1939099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner switch (T) { 194b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 1957b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 1967b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: return getCharAlign(); 1979099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedShort: 1989099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedShort: return getShortAlign(); 1999099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedInt: 2009099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedInt: return getIntAlign(); 2019099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLong: 2029099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedLong: return getLongAlign(); 2039099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case SignedLongLong: 2049099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner case UnsignedLongLong: return getLongLongAlign(); 2059099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner }; 2069099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner} 2079099e7bcda3922cee0cffcdf21332ac4aa193ceaChris Lattner 208961f0708fb66375acf47f9e9bc1aecfb3f992aeaChris Lattner/// isTypeSigned - Return whether an integer types is signed. Returns true if 209b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner/// the type is signed; false otherwise. 2103f59c975aa5d047f7edd1b900b5e885c38af0ef7Chris Lattnerbool TargetInfo::isTypeSigned(IntType T) { 211b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner switch (T) { 212b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("not an integer!"); 2137b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case SignedChar: 214b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedShort: 215b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedInt: 216b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case SignedLong: 217237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer case SignedLongLong: 218b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner return true; 2197b7bef1ec355fb46643349d77c266b913f36b656Stepan Dyatkovskiy case UnsignedChar: 220b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedShort: 221b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedInt: 222b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner case UnsignedLong: 223237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer case UnsignedLongLong: 224b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner return false; 225b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner }; 226b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner} 227b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 228a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson/// setForcedLangOptions - Set forced language options. 229a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson/// Apply changes to the target information with respect to certain 230a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson/// language options which change the target configuration. 231a6fda124bf380479529d6a80b84b62cacd3cb707John Thompsonvoid TargetInfo::setForcedLangOptions(LangOptions &Opts) { 232fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar if (Opts.NoBitFieldTypeAlign) 233fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar UseBitFieldTypeAlignment = false; 234fb937b8c5f1c5dc9cfd4223b5cae230cc42b0287Daniel Dunbar if (Opts.ShortWChar) 235a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson WCharType = UnsignedShort; 2368bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2378bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed if (Opts.OpenCL) { 2388bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // OpenCL C requires specific widths for types, irrespective of 2398bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // what these normally are for the target. 2408bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // We also define long long and long double here, although the 2418bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed // OpenCL standard only mentions these as "reserved". 2428bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed IntWidth = IntAlign = 32; 2438bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongWidth = LongAlign = 64; 2448bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongLongWidth = LongLongAlign = 128; 2458bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed HalfWidth = HalfAlign = 16; 2468bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed FloatWidth = FloatAlign = 32; 2478bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed DoubleWidth = DoubleAlign = 64; 2488bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongDoubleWidth = LongDoubleAlign = 128; 2498bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2508bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed assert(PointerWidth == 32 || PointerWidth == 64); 2518bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed bool is32BitArch = PointerWidth == 32; 2528bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed SizeType = is32BitArch ? UnsignedInt : UnsignedLong; 2538bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed PtrDiffType = is32BitArch ? SignedInt : SignedLong; 2548bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed IntPtrType = is32BitArch ? SignedInt : SignedLong; 2558bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2568bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed IntMaxType = SignedLongLong; 2578bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed UIntMaxType = UnsignedLongLong; 2588bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed Int64Type = SignedLong; 2598bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed 2608bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed HalfFormat = &llvm::APFloat::IEEEhalf; 2618bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed FloatFormat = &llvm::APFloat::IEEEsingle; 2628bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed DoubleFormat = &llvm::APFloat::IEEEdouble; 2638bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed LongDoubleFormat = &llvm::APFloat::IEEEquad; 2648bc56022db2d9b16aab25ce3b6fccda9dd8991fcDavid Tweed } 265a6fda124bf380479529d6a80b84b62cacd3cb707John Thompson} 266b304f77cb621a47221f2aa2d35acdb5c730421ffChris Lattner 267525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner//===----------------------------------------------------------------------===// 268525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner 2695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 2705f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerstatic StringRef removeGCCRegisterPrefix(StringRef Name) { 271ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson if (Name[0] == '%' || Name[0] == '#') 27283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson Name = Name.substr(1); 273237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer 27483c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson return Name; 275ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson} 276ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson 277de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher/// isValidClobber - Returns whether the passed in string is 278de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher/// a valid clobber in an inline asm statement. This is used by 279de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher/// Sema. 2805f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool TargetInfo::isValidClobber(StringRef Name) const { 281de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher return (isValidGCCRegisterName(Name) || 282de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher Name == "memory" || Name == "cc"); 283de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher} 284de31fd7eeebdc64fb043463e7f515dab8eccac8dEric Christopher 2853346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// isValidGCCRegisterName - Returns whether the passed in string 2863346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// is a valid register name according to GCC. This is used by Sema for 2873346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson/// inline asm statements. 2885f9e272e632e951b1efe824cd16acb4d96077930Chris Lattnerbool TargetInfo::isValidGCCRegisterName(StringRef Name) const { 28983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Name.empty()) 29083c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson return false; 291237cf582b89bbcc22640cea15426ddc7ada8412bMichael J. Spencer 2926fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson const char * const *Names; 2936fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson unsigned NumNames; 2941eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 2956fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // Get rid of any register prefix. 29683c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson Name = removeGCCRegisterPrefix(Name); 297ea041758d49215167e473a515b8d46e77b170ccfAnders Carlsson 2980eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegNames(Names, NumNames); 2991eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3006fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // If we have a number it maps to an entry in the register name array. 3013f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isDigit(Name[0])) { 30283c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson int n; 30383c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (!Name.getAsInteger(0, n)) 3046fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson return n >= 0 && (unsigned)n < NumNames; 3056fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3066fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson 3076fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // Check register names. 3086fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson for (unsigned i = 0; i < NumNames; i++) { 30983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Name == Names[i]) 3106fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson return true; 3116fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 313cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Check any additional names that we have. 314cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher const AddlRegName *AddlNames; 315cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher unsigned NumAddlNames; 316cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher getGCCAddlRegNames(AddlNames, NumAddlNames); 317cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned i = 0; i < NumAddlNames; i++) 318cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) { 319cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (!AddlNames[i].Names[j]) 320cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher break; 321cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Make sure the register that the additional name is for is within 322cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // the bounds of the register names from above. 323cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames) 324cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher return true; 325cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher } 326cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher 3276fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson // Now check aliases. 3280eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner const GCCRegAlias *Aliases; 3296fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson unsigned NumAliases; 3301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3310eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegAliases(Aliases, NumAliases); 3326fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson for (unsigned i = 0; i < NumAliases; i++) { 3336fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) { 3346fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson if (!Aliases[i].Aliases[j]) 3356fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson break; 33683c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Aliases[i].Aliases[j] == Name) 3376fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson return true; 3386fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3396fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson } 3401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3413346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson return false; 3423346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson} 343d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 3445f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerStringRef 3455f9e272e632e951b1efe824cd16acb4d96077930Chris LattnerTargetInfo::getNormalizedGCCRegisterName(StringRef Name) const { 346d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson assert(isValidGCCRegisterName(Name) && "Invalid register passed in"); 3471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 34883c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson // Get rid of any register prefix. 34983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson Name = removeGCCRegisterPrefix(Name); 3501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 351d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson const char * const *Names; 352d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson unsigned NumNames; 353d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 3540eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegNames(Names, NumNames); 355d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 356d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // First, check if we have a number. 3573f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan Rose if (isDigit(Name[0])) { 35883c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson int n; 35983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (!Name.getAsInteger(0, n)) { 3601eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump assert(n >= 0 && (unsigned)n < NumNames && 361d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson "Out of bounds register number!"); 362d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return Names[n]; 363d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 364d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 3651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 366cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Check any additional names that we have. 367cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher const AddlRegName *AddlNames; 368cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher unsigned NumAddlNames; 369cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher getGCCAddlRegNames(AddlNames, NumAddlNames); 370cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned i = 0; i < NumAddlNames; i++) 371cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) { 372cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (!AddlNames[i].Names[j]) 373cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher break; 374cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // Make sure the register that the additional name is for is within 375cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher // the bounds of the register names from above. 376cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames) 377cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher return Name; 378cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher } 379cfd323d0d4476dd4ff64097c91b114067ecaa82bEric Christopher 380d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Now check aliases. 3810eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner const GCCRegAlias *Aliases; 382d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson unsigned NumAliases; 3831eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3840eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner getGCCRegAliases(Aliases, NumAliases); 385d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson for (unsigned i = 0; i < NumAliases; i++) { 386d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) { 387d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (!Aliases[i].Aliases[j]) 388d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 38983c021c6d33aa173cf1a6e3bc61006dabb042703Anders Carlsson if (Aliases[i].Aliases[j] == Name) 390d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return Aliases[i].Register; 391d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 392d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 3931eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 394d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return Name; 395d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson} 396d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 397432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattnerbool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const { 398432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner const char *Name = Info.getConstraintStr().c_str(); 399d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // An output constraint must start with '=' or '+' 400d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (*Name != '=' && *Name != '+') 401d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return false; 402d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 403d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (*Name == '+') 40444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setIsReadWrite(); 405d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 406d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson Name++; 407d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson while (*Name) { 408d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson switch (*Name) { 409d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson default: 41044def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner if (!validateAsmConstraint(Name, Info)) { 4115ab201a324b2153ce151904d397c05fab798e0bcTed Kremenek // FIXME: We temporarily return false 412d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // so we can add more constraints as we hit it. 413d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Eventually, an unknown constraint should just be treated as 'g'. 4145ab201a324b2153ce151904d397c05fab798e0bcTed Kremenek return false; 415d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 416d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case '&': // early clobber. 417d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 4184053983963cb94a6129da47bca8cce637c8b7bffChris Lattner case '%': // commutative. 4194053983963cb94a6129da47bca8cce637c8b7bffChris Lattner // FIXME: Check that there is a another register after this one. 4204053983963cb94a6129da47bca8cce637c8b7bffChris Lattner break; 421d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'r': // general register. 42244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 423d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 424d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'm': // memory operand. 4250f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'o': // offsetable memory operand. 4260f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'V': // non-offsetable memory operand. 4270f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '<': // autodecrement memory operand. 4280f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '>': // autoincrement memory operand. 42944def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 430d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 431d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'g': // general register, memory operand or immediate integer. 432775841fd76a7aead92c10cec4acb5e8a199f53b1Anders Carlsson case 'X': // any operand. 43344def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 43444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 435d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 436ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case ',': // multiple alternative constraint. Pass it. 4376f158034915a112d6082a6b238a56337d1528328John Thompson // Handle additional optional '=' or '+' modifiers. 4382f474ea9ef7505df5d092287c48c19974222293bJohn Thompson if (Name[1] == '=' || Name[1] == '+') 4396f158034915a112d6082a6b238a56337d1528328John Thompson Name++; 440ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; 441ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case '?': // Disparage slightly code. 4420f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '!': // Disparage severely. 443e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '#': // Ignore as constraint. 444e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '*': // Ignore for choosing register preferences. 445ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; // Pass them. 446d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 4471eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 448d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson Name++; 449d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 4501eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4516576a0d1e26f617d29d54ed99b16099d93a05264Benjamin Kramer // If a constraint allows neither memory nor register operands it contains 4526576a0d1e26f617d29d54ed99b16099d93a05264Benjamin Kramer // only modifiers. Reject it. 4535ddf70f1e736d4919c147cf938c8f20b0d17dd00Benjamin Kramer return Info.allowsMemory() || Info.allowsRegister(); 454d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson} 455d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson 45642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlssonbool TargetInfo::resolveSymbolicName(const char *&Name, 4572819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner ConstraintInfo *OutputConstraints, 4582819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner unsigned NumOutputs, 45944def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner unsigned &Index) const { 46042e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson assert(*Name == '[' && "Symbolic name did not start with '['"); 46142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson Name++; 46242e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson const char *Start = Name; 46342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson while (*Name && *Name != ']') 46442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson Name++; 4651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 46642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson if (!*Name) { 46742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson // Missing ']' 46842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return false; 46942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson } 4701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 47142e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson std::string SymbolicName(Start, Name - Start); 4721eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 4732819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner for (Index = 0; Index != NumOutputs; ++Index) 4742819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner if (SymbolicName == OutputConstraints[Index].getName()) 47542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return true; 47642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson 47742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return false; 47842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson} 47942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson 4802819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattnerbool TargetInfo::validateInputConstraint(ConstraintInfo *OutputConstraints, 4812819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner unsigned NumOutputs, 48244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner ConstraintInfo &Info) const { 483432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner const char *Name = Info.ConstraintStr.c_str(); 484432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner 485d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson while (*Name) { 486d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson switch (*Name) { 487d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson default: 488d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Check if we have a matching constraint 489d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (*Name >= '0' && *Name <= '9') { 490d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson unsigned i = *Name - '0'; 4911eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 492d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson // Check if matching constraint is out of bounds. 493d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson if (i >= NumOutputs) 494d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return false; 4951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 49686eda39c8af47280273758debf0432933bdeee3cAnders Carlsson // A number must refer to an output only operand. 49786eda39c8af47280273758debf0432933bdeee3cAnders Carlsson if (OutputConstraints[i].isReadWrite()) 49886eda39c8af47280273758debf0432933bdeee3cAnders Carlsson return false; 49986eda39c8af47280273758debf0432933bdeee3cAnders Carlsson 50079ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // If the constraint is already tied, it must be tied to the 50179ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // same operand referenced to by the number. 50279ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson if (Info.hasTiedOperand() && Info.getTiedOperand() != i) 50379ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson return false; 50479ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson 5051eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump // The constraint should have the same info as the respective 50603eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson // output constraint. 507d68876176a0d2c19e3864e7d38f6036c4f72f0a3Chris Lattner Info.setTiedOperand(i, OutputConstraints[i]); 50844def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner } else if (!validateAsmConstraint(Name, Info)) { 509302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar // FIXME: This error return is in place temporarily so we can 510302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar // add more constraints as we hit it. Eventually, an unknown 511302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar // constraint should just be treated as 'g'. 512302684c5e2242c350efb3a638cd0ed1de21705e1Daniel Dunbar return false; 51342e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson } 51442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson break; 51542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson case '[': { 51642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson unsigned Index = 0; 5172819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner if (!resolveSymbolicName(Name, OutputConstraints, NumOutputs, Index)) 51842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson return false; 5191eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 52079ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // If the constraint is already tied, it must be tied to the 52179ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson // same operand referenced to by the number. 52279ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson if (Info.hasTiedOperand() && Info.getTiedOperand() != Index) 52379ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson return false; 52479ca1ee4b637c01458584bb571f1b309180c780dAnders Carlsson 5250eff4e73d58cf28458470beec31b33bcb302377cEli Friedman Info.setTiedOperand(Index, OutputConstraints[Index]); 52642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson break; 5271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump } 52844fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson case '%': // commutative 52944fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson // FIXME: Fail if % is used with the last operand. 53044fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson break; 531d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'i': // immediate integer. 532efdfa77fecdfc400d18263213f569e0526fea9dcAnders Carlsson case 'n': // immediate integer with a known value. 533d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 5341d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'I': // Various constant constraints with target-specific meanings. 5351d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'J': 5361d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'K': 5371d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'L': 5381d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'M': 5391d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'N': 5401d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'O': 5411d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner case 'P': 5421d13879044344c06d2933c268391ab8a2a2f46e7Chris Lattner break; 543d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'r': // general register. 54444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 545d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 546d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'm': // memory operand. 5470f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'o': // offsettable memory operand. 5480f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case 'V': // non-offsettable memory operand. 5490f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '<': // autodecrement memory operand. 5500f048a44b5280f5fae28b9363ed4eab618bb1083Dale Johannesen case '>': // autoincrement memory operand. 55144def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 552d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 553d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson case 'g': // general register, memory operand or immediate integer. 554775841fd76a7aead92c10cec4acb5e8a199f53b1Anders Carlsson case 'X': // any operand. 55544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsRegister(); 55644def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner Info.setAllowsMemory(); 557d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson break; 5587ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson case 'E': // immediate floating point. 5597ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson case 'F': // immediate floating point. 5607ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson case 'p': // address operand. 5617ccc58f9ffa0d2cad6fcf00b66c0fc0d2fae26e6John Thompson break; 562ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case ',': // multiple alternative constraint. Ignore comma. 563ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; 564ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson case '?': // Disparage slightly code. 565fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner case '!': // Disparage severely. 566e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '#': // Ignore as constraint. 567e6b3dbae38f62164cab3989380cd940242d80120Ulrich Weigand case '*': // Ignore for choosing register preferences. 568ef44e1110711276ffffe4b22d4ba0cebd49cb330John Thompson break; // Pass them. 569d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 5701eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 571d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson Name++; 572d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson } 5731eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 574d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson return true; 575d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson} 576b8b2c9da87e7d70a1679db026f40548b3192b705John McCall 577b8b2c9da87e7d70a1679db026f40548b3192b705John McCallbool TargetCXXABI::tryParse(llvm::StringRef name) { 578b8b2c9da87e7d70a1679db026f40548b3192b705John McCall const Kind unknown = static_cast<Kind>(-1); 579b8b2c9da87e7d70a1679db026f40548b3192b705John McCall Kind kind = llvm::StringSwitch<Kind>(name) 580b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("arm", GenericARM) 581b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("ios", iOS) 582b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("itanium", GenericItanium) 583b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Case("microsoft", Microsoft) 584b8b2c9da87e7d70a1679db026f40548b3192b705John McCall .Default(unknown); 585b8b2c9da87e7d70a1679db026f40548b3192b705John McCall if (kind == unknown) return false; 586b8b2c9da87e7d70a1679db026f40548b3192b705John McCall 587b8b2c9da87e7d70a1679db026f40548b3192b705John McCall set(kind); 588b8b2c9da87e7d70a1679db026f40548b3192b705John McCall return true; 589b8b2c9da87e7d70a1679db026f40548b3192b705John McCall} 590