17#include "llvm/Support/ConvertUTF.h"
39 UpdateOnReturn <const char*> UpdateBeg(Beg, I);
41 unsigned accumulator = 0;
42 bool hasDigits =
false;
44 for ( ; I !=
E; ++I) {
46 if (
c >=
'0' &&
c <=
'9') {
48 accumulator = (accumulator * 10) + (
c -
'0');
81 const char *I = Beg + 1;
106 const char *Tmp = Beg;
125 const char *&Beg,
const char *
E,
126 unsigned *argIndex) {
170 FS.setUsesPositionalArg();
189 const char *Start = I;
204 FS.setVectorNumElts(NumElts);
217 const char *lmPosition = I;
223 if (I !=
E && *I ==
'h') {
226 }
else if (I !=
E && *I ==
'l' && LO.OpenCL) {
235 if (I !=
E && *I ==
'l') {
248 if (IsScanf && !LO.C99 && !LO.CPlusPlus11) {
253 if (I !=
E && (*I ==
's' || *I ==
'S' || *I ==
'[')) {
270 if (I + 1 !=
E && I + 2 !=
E) {
271 if (I[1] ==
'6' && I[2] ==
'4') {
279 if (I[1] ==
'3' && I[2] ==
'2') {
292 FS.setLengthModifier(lm);
297 const char *SpecifierBegin,
const char *FmtStrEnd,
unsigned &Len) {
298 if (SpecifierBegin + 1 >= FmtStrEnd)
301 const llvm::UTF8 *SB =
302 reinterpret_cast<const llvm::UTF8 *
>(SpecifierBegin + 1);
303 const llvm::UTF8 *SE =
reinterpret_cast<const llvm::UTF8 *
>(FmtStrEnd);
304 const char FirstByte = *SB;
309 unsigned NumBytes = llvm::getNumBytesForUTF8(FirstByte);
312 if (SB + NumBytes > SE)
329 argTy =
C.getDecayedType(argTy);
346 llvm_unreachable(
"ArgType must be valid");
356 if (!ETy->getDecl()->isComplete())
358 if (ETy->isUnscopedEnumerationType())
359 argTy = ETy->getDecl()->getIntegerType();
364 switch (BT->getKind()) {
367 case BuiltinType::Char_S:
368 case BuiltinType::SChar:
369 case BuiltinType::UChar:
370 case BuiltinType::Char_U:
372 case BuiltinType::Bool:
379 switch (BT->getKind()) {
382 case BuiltinType::Int:
383 case BuiltinType::UInt:
385 case BuiltinType::Short:
386 case BuiltinType::UShort:
387 case BuiltinType::WChar_S:
388 case BuiltinType::WChar_U:
401 if (!ETy->getDecl()->isComplete())
403 else if (ETy->isUnscopedEnumerationType())
404 argTy = ETy->getDecl()->getIntegerType();
408 argTy =
C.getCorrespondingUnsaturatedType(argTy);
410 argTy =
C.getCanonicalType(argTy).getUnqualifiedType();
417 switch (BT->getKind()) {
420 case BuiltinType::Bool:
421 if (Ptr && (T ==
C.UnsignedCharTy || T ==
C.SignedCharTy))
424 case BuiltinType::Char_S:
425 case BuiltinType::SChar:
426 if (T ==
C.UnsignedShortTy || T ==
C.ShortTy)
428 if (T ==
C.UnsignedCharTy)
430 if (T ==
C.SignedCharTy)
433 case BuiltinType::Char_U:
434 case BuiltinType::UChar:
435 if (T ==
C.UnsignedShortTy || T ==
C.ShortTy)
437 if (T ==
C.UnsignedCharTy)
439 if (T ==
C.SignedCharTy)
442 case BuiltinType::Short:
443 if (T ==
C.UnsignedShortTy)
446 case BuiltinType::UShort:
450 case BuiltinType::Int:
451 if (T ==
C.UnsignedIntTy)
454 case BuiltinType::UInt:
458 case BuiltinType::Long:
459 if (T ==
C.UnsignedLongTy)
462 case BuiltinType::ULong:
466 case BuiltinType::LongLong:
467 if (T ==
C.UnsignedLongLongTy)
470 case BuiltinType::ULongLong:
471 if (T ==
C.LongLongTy)
477 switch (BT->getKind()) {
480 case BuiltinType::Bool:
481 if (T ==
C.IntTy || T ==
C.UnsignedIntTy)
484 case BuiltinType::Int:
485 case BuiltinType::UInt:
486 if (T ==
C.SignedCharTy || T ==
C.UnsignedCharTy ||
487 T ==
C.ShortTy || T ==
C.UnsignedShortTy || T ==
C.WCharTy ||
491 case BuiltinType::Char_U:
492 if (T ==
C.UnsignedIntTy)
494 if (T ==
C.UnsignedShortTy)
497 case BuiltinType::Char_S:
503 case BuiltinType::Half:
504 case BuiltinType::Float:
508 case BuiltinType::Short:
509 case BuiltinType::UShort:
510 if (T ==
C.SignedCharTy || T ==
C.UnsignedCharTy)
513 case BuiltinType::WChar_U:
514 case BuiltinType::WChar_S:
515 if (T !=
C.WCharTy && T !=
C.WideCharTy)
532 C.hasSameUnqualifiedType(PT->getPointeeType(),
C.getWideCharType()))
537 QualType WInt =
C.getCanonicalType(
C.getWIntType()).getUnqualifiedType();
539 if (
C.getCanonicalType(argTy).getUnqualifiedType() == WInt)
542 QualType PromoArg =
C.isPromotableIntegerType(argTy)
543 ?
C.getPromotedIntegerType(argTy)
545 PromoArg =
C.getCanonicalType(PromoArg).getUnqualifiedType();
550 C.getCorrespondingUnsignedType(PromoArg) == WInt)
595 llvm_unreachable(
"Invalid ArgType Kind!");
603 QualType Vec =
C.getExtVectorType(T, NumElts);
611 llvm_unreachable(
"No representative type for Invalid ArgType");
613 llvm_unreachable(
"No representative type for Unknown ArgType");
621 Res =
C.getPointerType(
C.CharTy);
624 Res =
C.getPointerType(
C.getWideCharType());
627 Res =
C.ObjCBuiltinIdTy;
633 Res =
C.getWIntType();
639 Res =
C.getPointerType(Res);
652 Alias += (Alias[Alias.size()-1] ==
'*') ?
"*" :
" *";
660 return std::string(
"'") + Alias +
"' (aka '" + S +
"')";
661 return std::string(
"'") + S +
"'";
725 case bArg:
return "b";
726 case BArg:
return "B";
727 case dArg:
return "d";
728 case DArg:
return "D";
729 case iArg:
return "i";
730 case oArg:
return "o";
731 case OArg:
return "O";
732 case uArg:
return "u";
733 case UArg:
return "U";
734 case xArg:
return "x";
735 case XArg:
return "X";
736 case fArg:
return "f";
737 case FArg:
return "F";
738 case eArg:
return "e";
739 case EArg:
return "E";
740 case gArg:
return "g";
741 case GArg:
return "G";
742 case aArg:
return "a";
743 case AArg:
return "A";
744 case cArg:
return "c";
745 case sArg:
return "s";
746 case pArg:
return "p";
749 case nArg:
return "n";
755 case CArg:
return "C";
756 case SArg:
return "S";
771 case ZArg:
return "Z";
786std::optional<ConversionSpecifier>
849 if (
Target.getTriple().isOSMSVCRT()) {
884 return Target.getTriple().isOSFreeBSD() ||
Target.getTriple().isPS();
924 return Target.getTriple().isOSFreeBSD() ||
Target.getTriple().isPS();
947 return !
Target.getTriple().isOSDarwin() &&
948 !
Target.getTriple().isOSWindows();
984 return Target.getTriple().isOSMSVCRT();
995 return Target.getTriple().isOSMSVCRT();
1000 llvm_unreachable(
"Invalid LengthModifier Kind!");
1025 llvm_unreachable(
"Invalid LengthModifier Kind!");
1058 return LangOpt.ObjC;
1074 return LangOpt.FixedPoint;
1076 llvm_unreachable(
"Invalid ConversionSpecifier Kind!");
1096std::optional<LengthModifier>
1107 return std::nullopt;
1113 QT = TT->getDecl()->getUnderlyingType()) {
1119 }
else if (
Identifier->getName() ==
"ssize_t") {
1123 }
else if (
Identifier->getName() ==
"intmax_t") {
1126 }
else if (
Identifier->getName() ==
"uintmax_t") {
1129 }
else if (
Identifier->getName() ==
"ptrdiff_t") {
Defines the clang::LangOptions interface.
llvm::MachO::Target Target
__device__ __2f16 float c
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
This class is used for builtin types like 'int'.
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
One of these records is kept for each identifier that is lexed.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Represents a pointer to an Objective C object.
PointerType - C99 6.7.5.1 - Pointer Declarators.
QualType getPointeeType() const
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
bool isConstQualified() const
Determine whether this type is const-qualified.
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Exposes information about the current target.
bool isBlockPointerType() const
bool canDecayToPointerType() const
Determines whether this type can decay to a pointer type.
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isSaturatedFixedPointType() const
Return true if this is a saturated fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
bool hasSignedIntegerRepresentation() const
Determine whether this type has an signed integer representation of some sort, e.g....
const RecordType * getAsStructureType() const
bool isObjCObjectPointerType() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isNullPtrType() const
Base class for declarations which introduce a typedef-name.
Defines the clang::TargetInfo interface.
The JSON file list parser is used to communicate input to InstallAPI.
@ None
The alignment was not explicit in code.