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