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