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