TargetInfo.cpp revision 288943
1//===--- TargetInfo.cpp - Information about Target machine ----------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file implements the TargetInfo and TargetInfoImpl interfaces.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Basic/TargetInfo.h"
15#include "clang/Basic/AddressSpaces.h"
16#include "clang/Basic/CharInfo.h"
17#include "clang/Basic/LangOptions.h"
18#include "llvm/ADT/APFloat.h"
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/Support/ErrorHandling.h"
21#include <cstdlib>
22using namespace clang;
23
24static const LangAS::Map DefaultAddrSpaceMap = { 0 };
25
26// TargetInfo Constructor.
27TargetInfo::TargetInfo(const llvm::Triple &T) : TargetOpts(), Triple(T) {
28  // Set defaults.  Defaults are set for a 32-bit RISC platform, like PPC or
29  // SPARC.  These should be overridden by concrete targets as needed.
30  BigEndian = true;
31  TLSSupported = true;
32  NoAsmVariants = false;
33  PointerWidth = PointerAlign = 32;
34  BoolWidth = BoolAlign = 8;
35  IntWidth = IntAlign = 32;
36  LongWidth = LongAlign = 32;
37  LongLongWidth = LongLongAlign = 64;
38  SuitableAlign = 64;
39  DefaultAlignForAttributeAligned = 128;
40  MinGlobalAlign = 0;
41  HalfWidth = 16;
42  HalfAlign = 16;
43  FloatWidth = 32;
44  FloatAlign = 32;
45  DoubleWidth = 64;
46  DoubleAlign = 64;
47  LongDoubleWidth = 64;
48  LongDoubleAlign = 64;
49  LargeArrayMinWidth = 0;
50  LargeArrayAlign = 0;
51  MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 0;
52  MaxVectorAlign = 0;
53  MaxTLSAlign = 0;
54  SimdDefaultAlign = 0;
55  SizeType = UnsignedLong;
56  PtrDiffType = SignedLong;
57  IntMaxType = SignedLongLong;
58  IntPtrType = SignedLong;
59  WCharType = SignedInt;
60  WIntType = SignedInt;
61  Char16Type = UnsignedShort;
62  Char32Type = UnsignedInt;
63  Int64Type = SignedLongLong;
64  SigAtomicType = SignedInt;
65  ProcessIDType = SignedInt;
66  UseSignedCharForObjCBool = true;
67  UseBitFieldTypeAlignment = true;
68  UseZeroLengthBitfieldAlignment = false;
69  ZeroLengthBitfieldBoundary = 0;
70  HalfFormat = &llvm::APFloat::IEEEhalf;
71  FloatFormat = &llvm::APFloat::IEEEsingle;
72  DoubleFormat = &llvm::APFloat::IEEEdouble;
73  LongDoubleFormat = &llvm::APFloat::IEEEdouble;
74  DescriptionString = nullptr;
75  UserLabelPrefix = "_";
76  MCountName = "mcount";
77  RegParmMax = 0;
78  SSERegParmMax = 0;
79  HasAlignMac68kSupport = false;
80
81  // Default to no types using fpret.
82  RealTypeUsesObjCFPRet = 0;
83
84  // Default to not using fp2ret for __Complex long double
85  ComplexLongDoubleUsesFP2Ret = false;
86
87  // Set the C++ ABI based on the triple.
88  TheCXXABI.set(Triple.isKnownWindowsMSVCEnvironment()
89                    ? TargetCXXABI::Microsoft
90                    : TargetCXXABI::GenericItanium);
91
92  // Default to an empty address space map.
93  AddrSpaceMap = &DefaultAddrSpaceMap;
94  UseAddrSpaceMapMangling = false;
95
96  // Default to an unknown platform name.
97  PlatformName = "unknown";
98  PlatformMinVersion = VersionTuple();
99}
100
101// Out of line virtual dtor for TargetInfo.
102TargetInfo::~TargetInfo() {}
103
104/// getTypeName - Return the user string for the specified integer type enum.
105/// For example, SignedShort -> "short".
106const char *TargetInfo::getTypeName(IntType T) {
107  switch (T) {
108  default: llvm_unreachable("not an integer!");
109  case SignedChar:       return "signed char";
110  case UnsignedChar:     return "unsigned char";
111  case SignedShort:      return "short";
112  case UnsignedShort:    return "unsigned short";
113  case SignedInt:        return "int";
114  case UnsignedInt:      return "unsigned int";
115  case SignedLong:       return "long int";
116  case UnsignedLong:     return "long unsigned int";
117  case SignedLongLong:   return "long long int";
118  case UnsignedLongLong: return "long long unsigned int";
119  }
120}
121
122/// getTypeConstantSuffix - Return the constant suffix for the specified
123/// integer type enum. For example, SignedLong -> "L".
124const char *TargetInfo::getTypeConstantSuffix(IntType T) const {
125  switch (T) {
126  default: llvm_unreachable("not an integer!");
127  case SignedChar:
128  case SignedShort:
129  case SignedInt:        return "";
130  case SignedLong:       return "L";
131  case SignedLongLong:   return "LL";
132  case UnsignedChar:
133    if (getCharWidth() < getIntWidth())
134      return "";
135  case UnsignedShort:
136    if (getShortWidth() < getIntWidth())
137      return "";
138  case UnsignedInt:      return "U";
139  case UnsignedLong:     return "UL";
140  case UnsignedLongLong: return "ULL";
141  }
142}
143
144/// getTypeFormatModifier - Return the printf format modifier for the
145/// specified integer type enum. For example, SignedLong -> "l".
146
147const char *TargetInfo::getTypeFormatModifier(IntType T) {
148  switch (T) {
149  default: llvm_unreachable("not an integer!");
150  case SignedChar:
151  case UnsignedChar:     return "hh";
152  case SignedShort:
153  case UnsignedShort:    return "h";
154  case SignedInt:
155  case UnsignedInt:      return "";
156  case SignedLong:
157  case UnsignedLong:     return "l";
158  case SignedLongLong:
159  case UnsignedLongLong: return "ll";
160  }
161}
162
163/// getTypeWidth - Return the width (in bits) of the specified integer type
164/// enum. For example, SignedInt -> getIntWidth().
165unsigned TargetInfo::getTypeWidth(IntType T) const {
166  switch (T) {
167  default: llvm_unreachable("not an integer!");
168  case SignedChar:
169  case UnsignedChar:     return getCharWidth();
170  case SignedShort:
171  case UnsignedShort:    return getShortWidth();
172  case SignedInt:
173  case UnsignedInt:      return getIntWidth();
174  case SignedLong:
175  case UnsignedLong:     return getLongWidth();
176  case SignedLongLong:
177  case UnsignedLongLong: return getLongLongWidth();
178  };
179}
180
181TargetInfo::IntType TargetInfo::getIntTypeByWidth(
182    unsigned BitWidth, bool IsSigned) const {
183  if (getCharWidth() == BitWidth)
184    return IsSigned ? SignedChar : UnsignedChar;
185  if (getShortWidth() == BitWidth)
186    return IsSigned ? SignedShort : UnsignedShort;
187  if (getIntWidth() == BitWidth)
188    return IsSigned ? SignedInt : UnsignedInt;
189  if (getLongWidth() == BitWidth)
190    return IsSigned ? SignedLong : UnsignedLong;
191  if (getLongLongWidth() == BitWidth)
192    return IsSigned ? SignedLongLong : UnsignedLongLong;
193  return NoInt;
194}
195
196TargetInfo::IntType TargetInfo::getLeastIntTypeByWidth(unsigned BitWidth,
197                                                       bool IsSigned) const {
198  if (getCharWidth() >= BitWidth)
199    return IsSigned ? SignedChar : UnsignedChar;
200  if (getShortWidth() >= BitWidth)
201    return IsSigned ? SignedShort : UnsignedShort;
202  if (getIntWidth() >= BitWidth)
203    return IsSigned ? SignedInt : UnsignedInt;
204  if (getLongWidth() >= BitWidth)
205    return IsSigned ? SignedLong : UnsignedLong;
206  if (getLongLongWidth() >= BitWidth)
207    return IsSigned ? SignedLongLong : UnsignedLongLong;
208  return NoInt;
209}
210
211TargetInfo::RealType TargetInfo::getRealTypeByWidth(unsigned BitWidth) const {
212  if (getFloatWidth() == BitWidth)
213    return Float;
214  if (getDoubleWidth() == BitWidth)
215    return Double;
216
217  switch (BitWidth) {
218  case 96:
219    if (&getLongDoubleFormat() == &llvm::APFloat::x87DoubleExtended)
220      return LongDouble;
221    break;
222  case 128:
223    if (&getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble ||
224        &getLongDoubleFormat() == &llvm::APFloat::IEEEquad)
225      return LongDouble;
226    break;
227  }
228
229  return NoFloat;
230}
231
232/// getTypeAlign - Return the alignment (in bits) of the specified integer type
233/// enum. For example, SignedInt -> getIntAlign().
234unsigned TargetInfo::getTypeAlign(IntType T) const {
235  switch (T) {
236  default: llvm_unreachable("not an integer!");
237  case SignedChar:
238  case UnsignedChar:     return getCharAlign();
239  case SignedShort:
240  case UnsignedShort:    return getShortAlign();
241  case SignedInt:
242  case UnsignedInt:      return getIntAlign();
243  case SignedLong:
244  case UnsignedLong:     return getLongAlign();
245  case SignedLongLong:
246  case UnsignedLongLong: return getLongLongAlign();
247  };
248}
249
250/// isTypeSigned - Return whether an integer types is signed. Returns true if
251/// the type is signed; false otherwise.
252bool TargetInfo::isTypeSigned(IntType T) {
253  switch (T) {
254  default: llvm_unreachable("not an integer!");
255  case SignedChar:
256  case SignedShort:
257  case SignedInt:
258  case SignedLong:
259  case SignedLongLong:
260    return true;
261  case UnsignedChar:
262  case UnsignedShort:
263  case UnsignedInt:
264  case UnsignedLong:
265  case UnsignedLongLong:
266    return false;
267  };
268}
269
270/// adjust - Set forced language options.
271/// Apply changes to the target information with respect to certain
272/// language options which change the target configuration.
273void TargetInfo::adjust(const LangOptions &Opts) {
274  if (Opts.NoBitFieldTypeAlign)
275    UseBitFieldTypeAlignment = false;
276  if (Opts.ShortWChar)
277    WCharType = UnsignedShort;
278
279  if (Opts.OpenCL) {
280    // OpenCL C requires specific widths for types, irrespective of
281    // what these normally are for the target.
282    // We also define long long and long double here, although the
283    // OpenCL standard only mentions these as "reserved".
284    IntWidth = IntAlign = 32;
285    LongWidth = LongAlign = 64;
286    LongLongWidth = LongLongAlign = 128;
287    HalfWidth = HalfAlign = 16;
288    FloatWidth = FloatAlign = 32;
289
290    // Embedded 32-bit targets (OpenCL EP) might have double C type
291    // defined as float. Let's not override this as it might lead
292    // to generating illegal code that uses 64bit doubles.
293    if (DoubleWidth != FloatWidth) {
294      DoubleWidth = DoubleAlign = 64;
295      DoubleFormat = &llvm::APFloat::IEEEdouble;
296    }
297    LongDoubleWidth = LongDoubleAlign = 128;
298
299    assert(PointerWidth == 32 || PointerWidth == 64);
300    bool Is32BitArch = PointerWidth == 32;
301    SizeType = Is32BitArch ? UnsignedInt : UnsignedLong;
302    PtrDiffType = Is32BitArch ? SignedInt : SignedLong;
303    IntPtrType = Is32BitArch ? SignedInt : SignedLong;
304
305    IntMaxType = SignedLongLong;
306    Int64Type = SignedLong;
307
308    HalfFormat = &llvm::APFloat::IEEEhalf;
309    FloatFormat = &llvm::APFloat::IEEEsingle;
310    LongDoubleFormat = &llvm::APFloat::IEEEquad;
311  }
312}
313
314//===----------------------------------------------------------------------===//
315
316
317static StringRef removeGCCRegisterPrefix(StringRef Name) {
318  if (Name[0] == '%' || Name[0] == '#')
319    Name = Name.substr(1);
320
321  return Name;
322}
323
324/// isValidClobber - Returns whether the passed in string is
325/// a valid clobber in an inline asm statement. This is used by
326/// Sema.
327bool TargetInfo::isValidClobber(StringRef Name) const {
328  return (isValidGCCRegisterName(Name) ||
329	  Name == "memory" || Name == "cc");
330}
331
332/// isValidGCCRegisterName - Returns whether the passed in string
333/// is a valid register name according to GCC. This is used by Sema for
334/// inline asm statements.
335bool TargetInfo::isValidGCCRegisterName(StringRef Name) const {
336  if (Name.empty())
337    return false;
338
339  const char * const *Names;
340  unsigned NumNames;
341
342  // Get rid of any register prefix.
343  Name = removeGCCRegisterPrefix(Name);
344  if (Name.empty())
345      return false;
346
347  getGCCRegNames(Names, NumNames);
348
349  // If we have a number it maps to an entry in the register name array.
350  if (isDigit(Name[0])) {
351    int n;
352    if (!Name.getAsInteger(0, n))
353      return n >= 0 && (unsigned)n < NumNames;
354  }
355
356  // Check register names.
357  for (unsigned i = 0; i < NumNames; i++) {
358    if (Name == Names[i])
359      return true;
360  }
361
362  // Check any additional names that we have.
363  const AddlRegName *AddlNames;
364  unsigned NumAddlNames;
365  getGCCAddlRegNames(AddlNames, NumAddlNames);
366  for (unsigned i = 0; i < NumAddlNames; i++)
367    for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) {
368      if (!AddlNames[i].Names[j])
369	break;
370      // Make sure the register that the additional name is for is within
371      // the bounds of the register names from above.
372      if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames)
373	return true;
374  }
375
376  // Now check aliases.
377  const GCCRegAlias *Aliases;
378  unsigned NumAliases;
379
380  getGCCRegAliases(Aliases, NumAliases);
381  for (unsigned i = 0; i < NumAliases; i++) {
382    for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) {
383      if (!Aliases[i].Aliases[j])
384        break;
385      if (Aliases[i].Aliases[j] == Name)
386        return true;
387    }
388  }
389
390  return false;
391}
392
393StringRef
394TargetInfo::getNormalizedGCCRegisterName(StringRef Name) const {
395  assert(isValidGCCRegisterName(Name) && "Invalid register passed in");
396
397  // Get rid of any register prefix.
398  Name = removeGCCRegisterPrefix(Name);
399
400  const char * const *Names;
401  unsigned NumNames;
402
403  getGCCRegNames(Names, NumNames);
404
405  // First, check if we have a number.
406  if (isDigit(Name[0])) {
407    int n;
408    if (!Name.getAsInteger(0, n)) {
409      assert(n >= 0 && (unsigned)n < NumNames &&
410             "Out of bounds register number!");
411      return Names[n];
412    }
413  }
414
415  // Check any additional names that we have.
416  const AddlRegName *AddlNames;
417  unsigned NumAddlNames;
418  getGCCAddlRegNames(AddlNames, NumAddlNames);
419  for (unsigned i = 0; i < NumAddlNames; i++)
420    for (unsigned j = 0; j < llvm::array_lengthof(AddlNames[i].Names); j++) {
421      if (!AddlNames[i].Names[j])
422	break;
423      // Make sure the register that the additional name is for is within
424      // the bounds of the register names from above.
425      if (AddlNames[i].Names[j] == Name && AddlNames[i].RegNum < NumNames)
426	return Name;
427    }
428
429  // Now check aliases.
430  const GCCRegAlias *Aliases;
431  unsigned NumAliases;
432
433  getGCCRegAliases(Aliases, NumAliases);
434  for (unsigned i = 0; i < NumAliases; i++) {
435    for (unsigned j = 0 ; j < llvm::array_lengthof(Aliases[i].Aliases); j++) {
436      if (!Aliases[i].Aliases[j])
437        break;
438      if (Aliases[i].Aliases[j] == Name)
439        return Aliases[i].Register;
440    }
441  }
442
443  return Name;
444}
445
446bool TargetInfo::validateOutputConstraint(ConstraintInfo &Info) const {
447  const char *Name = Info.getConstraintStr().c_str();
448  // An output constraint must start with '=' or '+'
449  if (*Name != '=' && *Name != '+')
450    return false;
451
452  if (*Name == '+')
453    Info.setIsReadWrite();
454
455  Name++;
456  while (*Name) {
457    switch (*Name) {
458    default:
459      if (!validateAsmConstraint(Name, Info)) {
460        // FIXME: We temporarily return false
461        // so we can add more constraints as we hit it.
462        // Eventually, an unknown constraint should just be treated as 'g'.
463        return false;
464      }
465      break;
466    case '&': // early clobber.
467      Info.setEarlyClobber();
468      break;
469    case '%': // commutative.
470      // FIXME: Check that there is a another register after this one.
471      break;
472    case 'r': // general register.
473      Info.setAllowsRegister();
474      break;
475    case 'm': // memory operand.
476    case 'o': // offsetable memory operand.
477    case 'V': // non-offsetable memory operand.
478    case '<': // autodecrement memory operand.
479    case '>': // autoincrement memory operand.
480      Info.setAllowsMemory();
481      break;
482    case 'g': // general register, memory operand or immediate integer.
483    case 'X': // any operand.
484      Info.setAllowsRegister();
485      Info.setAllowsMemory();
486      break;
487    case ',': // multiple alternative constraint.  Pass it.
488      // Handle additional optional '=' or '+' modifiers.
489      if (Name[1] == '=' || Name[1] == '+')
490        Name++;
491      break;
492    case '#': // Ignore as constraint.
493      while (Name[1] && Name[1] != ',')
494        Name++;
495      break;
496    case '?': // Disparage slightly code.
497    case '!': // Disparage severely.
498    case '*': // Ignore for choosing register preferences.
499      break;  // Pass them.
500    }
501
502    Name++;
503  }
504
505  // Early clobber with a read-write constraint which doesn't permit registers
506  // is invalid.
507  if (Info.earlyClobber() && Info.isReadWrite() && !Info.allowsRegister())
508    return false;
509
510  // If a constraint allows neither memory nor register operands it contains
511  // only modifiers. Reject it.
512  return Info.allowsMemory() || Info.allowsRegister();
513}
514
515bool TargetInfo::resolveSymbolicName(const char *&Name,
516                                     ConstraintInfo *OutputConstraints,
517                                     unsigned NumOutputs,
518                                     unsigned &Index) const {
519  assert(*Name == '[' && "Symbolic name did not start with '['");
520  Name++;
521  const char *Start = Name;
522  while (*Name && *Name != ']')
523    Name++;
524
525  if (!*Name) {
526    // Missing ']'
527    return false;
528  }
529
530  std::string SymbolicName(Start, Name - Start);
531
532  for (Index = 0; Index != NumOutputs; ++Index)
533    if (SymbolicName == OutputConstraints[Index].getName())
534      return true;
535
536  return false;
537}
538
539bool TargetInfo::validateInputConstraint(ConstraintInfo *OutputConstraints,
540                                         unsigned NumOutputs,
541                                         ConstraintInfo &Info) const {
542  const char *Name = Info.ConstraintStr.c_str();
543
544  if (!*Name)
545    return false;
546
547  while (*Name) {
548    switch (*Name) {
549    default:
550      // Check if we have a matching constraint
551      if (*Name >= '0' && *Name <= '9') {
552        const char *DigitStart = Name;
553        while (Name[1] >= '0' && Name[1] <= '9')
554          Name++;
555        const char *DigitEnd = Name;
556        unsigned i;
557        if (StringRef(DigitStart, DigitEnd - DigitStart + 1)
558                .getAsInteger(10, i))
559          return false;
560
561        // Check if matching constraint is out of bounds.
562        if (i >= NumOutputs) return false;
563
564        // A number must refer to an output only operand.
565        if (OutputConstraints[i].isReadWrite())
566          return false;
567
568        // If the constraint is already tied, it must be tied to the
569        // same operand referenced to by the number.
570        if (Info.hasTiedOperand() && Info.getTiedOperand() != i)
571          return false;
572
573        // The constraint should have the same info as the respective
574        // output constraint.
575        Info.setTiedOperand(i, OutputConstraints[i]);
576      } else if (!validateAsmConstraint(Name, Info)) {
577        // FIXME: This error return is in place temporarily so we can
578        // add more constraints as we hit it.  Eventually, an unknown
579        // constraint should just be treated as 'g'.
580        return false;
581      }
582      break;
583    case '[': {
584      unsigned Index = 0;
585      if (!resolveSymbolicName(Name, OutputConstraints, NumOutputs, Index))
586        return false;
587
588      // If the constraint is already tied, it must be tied to the
589      // same operand referenced to by the number.
590      if (Info.hasTiedOperand() && Info.getTiedOperand() != Index)
591        return false;
592
593      // A number must refer to an output only operand.
594      if (OutputConstraints[Index].isReadWrite())
595        return false;
596
597      Info.setTiedOperand(Index, OutputConstraints[Index]);
598      break;
599    }
600    case '%': // commutative
601      // FIXME: Fail if % is used with the last operand.
602      break;
603    case 'i': // immediate integer.
604    case 'n': // immediate integer with a known value.
605      break;
606    case 'I':  // Various constant constraints with target-specific meanings.
607    case 'J':
608    case 'K':
609    case 'L':
610    case 'M':
611    case 'N':
612    case 'O':
613    case 'P':
614      if (!validateAsmConstraint(Name, Info))
615        return false;
616      break;
617    case 'r': // general register.
618      Info.setAllowsRegister();
619      break;
620    case 'm': // memory operand.
621    case 'o': // offsettable memory operand.
622    case 'V': // non-offsettable memory operand.
623    case '<': // autodecrement memory operand.
624    case '>': // autoincrement memory operand.
625      Info.setAllowsMemory();
626      break;
627    case 'g': // general register, memory operand or immediate integer.
628    case 'X': // any operand.
629      Info.setAllowsRegister();
630      Info.setAllowsMemory();
631      break;
632    case 'E': // immediate floating point.
633    case 'F': // immediate floating point.
634    case 'p': // address operand.
635      break;
636    case ',': // multiple alternative constraint.  Ignore comma.
637      break;
638    case '#': // Ignore as constraint.
639      while (Name[1] && Name[1] != ',')
640        Name++;
641      break;
642    case '?': // Disparage slightly code.
643    case '!': // Disparage severely.
644    case '*': // Ignore for choosing register preferences.
645      break;  // Pass them.
646    }
647
648    Name++;
649  }
650
651  return true;
652}
653
654bool TargetCXXABI::tryParse(llvm::StringRef name) {
655  const Kind unknown = static_cast<Kind>(-1);
656  Kind kind = llvm::StringSwitch<Kind>(name)
657    .Case("arm", GenericARM)
658    .Case("ios", iOS)
659    .Case("itanium", GenericItanium)
660    .Case("microsoft", Microsoft)
661    .Case("mips", GenericMIPS)
662    .Default(unknown);
663  if (kind == unknown) return false;
664
665  set(kind);
666  return true;
667}
668