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 case BuiltinType::Char_U:
427 case BuiltinType::UChar:
428 if (T ==
C.UnsignedShortTy || T ==
C.ShortTy)
430 if (T ==
C.UnsignedCharTy || T ==
C.SignedCharTy)
433 case BuiltinType::Short:
434 if (T ==
C.UnsignedShortTy)
437 case BuiltinType::UShort:
441 case BuiltinType::Int:
442 if (T ==
C.UnsignedIntTy)
445 case BuiltinType::UInt:
449 case BuiltinType::Long:
450 if (T ==
C.UnsignedLongTy)
453 case BuiltinType::ULong:
457 case BuiltinType::LongLong:
458 if (T ==
C.UnsignedLongLongTy)
461 case BuiltinType::ULongLong:
462 if (T ==
C.LongLongTy)
468 switch (BT->getKind()) {
471 case BuiltinType::Bool:
472 if (T ==
C.IntTy || T ==
C.UnsignedIntTy)
475 case BuiltinType::Int:
476 case BuiltinType::UInt:
477 if (T ==
C.SignedCharTy || T ==
C.UnsignedCharTy ||
478 T ==
C.ShortTy || T ==
C.UnsignedShortTy || T ==
C.WCharTy ||
482 case BuiltinType::Char_U:
483 if (T ==
C.UnsignedIntTy)
485 if (T ==
C.UnsignedShortTy)
488 case BuiltinType::Char_S:
494 case BuiltinType::Half:
495 case BuiltinType::Float:
499 case BuiltinType::Short:
500 case BuiltinType::UShort:
501 if (T ==
C.SignedCharTy || T ==
C.UnsignedCharTy)
504 case BuiltinType::WChar_U:
505 case BuiltinType::WChar_S:
506 if (T !=
C.WCharTy && T !=
C.WideCharTy)
520 switch (BT->getKind()) {
521 case BuiltinType::Char_U:
522 case BuiltinType::UChar:
523 case BuiltinType::Char_S:
524 case BuiltinType::SChar:
543 QualType WInt =
C.getCanonicalType(
C.getWIntType()).getUnqualifiedType();
545 if (
C.getCanonicalType(argTy).getUnqualifiedType() == WInt)
548 QualType PromoArg =
C.isPromotableIntegerType(argTy)
549 ?
C.getPromotedIntegerType(argTy)
551 PromoArg =
C.getCanonicalType(PromoArg).getUnqualifiedType();
556 C.getCorrespondingUnsignedType(PromoArg) == WInt)
591 llvm_unreachable(
"Invalid ArgType Kind!");
599 QualType Vec =
C.getExtVectorType(T, NumElts);
607 llvm_unreachable(
"No representative type for Invalid ArgType");
609 llvm_unreachable(
"No representative type for Unknown ArgType");
617 Res =
C.getPointerType(
C.CharTy);
620 Res =
C.getPointerType(
C.getWideCharType());
623 Res =
C.ObjCBuiltinIdTy;
629 Res =
C.getWIntType();
635 Res =
C.getPointerType(Res);
648 Alias += (Alias[Alias.size()-1] ==
'*') ?
"*" :
" *";
656 return std::string(
"'") + Alias +
"' (aka '" + S +
"')";
657 return std::string(
"'") + S +
"'";
721 case bArg:
return "b";
722 case BArg:
return "B";
723 case dArg:
return "d";
724 case DArg:
return "D";
725 case iArg:
return "i";
726 case oArg:
return "o";
727 case OArg:
return "O";
728 case uArg:
return "u";
729 case UArg:
return "U";
730 case xArg:
return "x";
731 case XArg:
return "X";
732 case fArg:
return "f";
733 case FArg:
return "F";
734 case eArg:
return "e";
735 case EArg:
return "E";
736 case gArg:
return "g";
737 case GArg:
return "G";
738 case aArg:
return "a";
739 case AArg:
return "A";
740 case cArg:
return "c";
741 case sArg:
return "s";
742 case pArg:
return "p";
745 case nArg:
return "n";
751 case CArg:
return "C";
752 case SArg:
return "S";
767 case ZArg:
return "Z";
782std::optional<ConversionSpecifier>
845 if (
Target.getTriple().isOSMSVCRT()) {
880 return Target.getTriple().isOSFreeBSD() ||
Target.getTriple().isPS();
920 return Target.getTriple().isOSFreeBSD() ||
Target.getTriple().isPS();
943 return !
Target.getTriple().isOSDarwin() &&
944 !
Target.getTriple().isOSWindows();
980 return Target.getTriple().isOSMSVCRT();
991 return Target.getTriple().isOSMSVCRT();
996 llvm_unreachable(
"Invalid LengthModifier Kind!");
1021 llvm_unreachable(
"Invalid LengthModifier Kind!");
1054 return LangOpt.ObjC;
1070 return LangOpt.FixedPoint;
1072 llvm_unreachable(
"Invalid ConversionSpecifier Kind!");
1092std::optional<LengthModifier>
1103 return std::nullopt;
1109 QT = TT->getDecl()->getUnderlyingType()) {
1115 }
else if (
Identifier->getName() ==
"ssize_t") {
1119 }
else if (
Identifier->getName() ==
"intmax_t") {
1122 }
else if (
Identifier->getName() ==
"uintmax_t") {
1125 }
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.
bool isVoidPointerType() const
bool isPointerType() const
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.