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