17 #include "llvm/Support/ConvertUTF.h"
25 using namespace clang;
28 FormatStringHandler::~FormatStringHandler() {}
40 unsigned accumulator = 0;
41 bool hasDigits =
false;
43 for ( ; I != E; ++I) {
45 if (
c >=
'0' &&
c <=
'9') {
47 accumulator = (accumulator * 10) + (
c -
'0');
52 return OptionalAmount(OptionalAmount::Constant, accumulator, Beg, I - Beg,
67 return OptionalAmount(OptionalAmount::Arg, argIndex++, Beg, 0,
false);
80 const char *I = Beg + 1;
105 const char *Tmp = Beg;
124 const char *&Beg,
const char *E,
125 unsigned *argIndex) {
158 if (Amt.
getHowSpecified() == OptionalAmount::Constant && *(I++) ==
'$') {
169 FS.setUsesPositionalArg();
188 const char *Start = I;
203 FS.setVectorNumElts(NumElts);
216 const char *lmPosition = I;
222 if (I != E && *I ==
'h') {
224 lmKind = LengthModifier::AsChar;
225 }
else if (I != E && *I ==
'l' && LO.OpenCL) {
227 lmKind = LengthModifier::AsShortLong;
229 lmKind = LengthModifier::AsShort;
234 if (I != E && *I ==
'l') {
236 lmKind = LengthModifier::AsLongLong;
238 lmKind = LengthModifier::AsLong;
241 case 'j': lmKind = LengthModifier::AsIntMax; ++I;
break;
242 case 'z': lmKind = LengthModifier::AsSizeT; ++I;
break;
243 case 't': lmKind = LengthModifier::AsPtrDiff; ++I;
break;
244 case 'L': lmKind = LengthModifier::AsLongDouble; ++I;
break;
245 case 'q': lmKind = LengthModifier::AsQuad; ++I;
break;
247 if (IsScanf && !LO.C99 && !LO.CPlusPlus11) {
252 if (I != E && (*I ==
's' || *I ==
'S' || *I ==
'[')) {
253 lmKind = LengthModifier::AsAllocate;
261 lmKind = LengthModifier::AsMAllocate;
269 if (I + 1 != E && I + 2 != E) {
270 if (I[1] ==
'6' && I[2] ==
'4') {
272 lmKind = LengthModifier::AsInt64;
278 if (I[1] ==
'3' && I[2] ==
'2') {
280 lmKind = LengthModifier::AsInt32;
285 lmKind = LengthModifier::AsInt3264;
288 lmKind = LengthModifier::AsWide; ++I;
break;
291 FS.setLengthModifier(lm);
296 const char *SpecifierBegin,
const char *FmtStrEnd,
unsigned &Len) {
297 if (SpecifierBegin + 1 >= FmtStrEnd)
300 const llvm::UTF8 *SB =
301 reinterpret_cast<const llvm::UTF8 *
>(SpecifierBegin + 1);
302 const llvm::UTF8 *SE =
reinterpret_cast<const llvm::UTF8 *
>(FmtStrEnd);
303 const char FirstByte = *SB;
308 unsigned NumBytes = llvm::getNumBytesForUTF8(FirstByte);
311 if (SB + NumBytes > SE)
339 llvm_unreachable(
"ArgType must be valid");
348 if (!ETy->getDecl()->isComplete())
350 argTy = ETy->getDecl()->getIntegerType();
354 switch (BT->getKind()) {
357 case BuiltinType::Char_S:
358 case BuiltinType::SChar:
359 case BuiltinType::UChar:
360 case BuiltinType::Char_U:
361 case BuiltinType::Bool:
371 if (!ETy->getDecl()->isComplete())
374 argTy = ETy->getDecl()->getIntegerType();
376 argTy = C.getCanonicalType(argTy).getUnqualifiedType();
382 switch (BT->getKind()) {
385 case BuiltinType::Char_S:
386 case BuiltinType::SChar:
387 case BuiltinType::Char_U:
388 case BuiltinType::UChar:
389 case BuiltinType::Bool:
390 if (T == C.UnsignedShortTy || T == C.ShortTy)
391 return NoMatchTypeConfusion;
392 return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match
394 case BuiltinType::Short:
395 return T == C.UnsignedShortTy ? Match : NoMatch;
396 case BuiltinType::UShort:
397 return T == C.ShortTy ? Match : NoMatch;
398 case BuiltinType::Int:
399 return T == C.UnsignedIntTy ? Match : NoMatch;
400 case BuiltinType::UInt:
401 return T == C.IntTy ? Match : NoMatch;
402 case BuiltinType::Long:
403 return T == C.UnsignedLongTy ? Match : NoMatch;
404 case BuiltinType::ULong:
405 return T == C.LongTy ? Match : NoMatch;
406 case BuiltinType::LongLong:
407 return T == C.UnsignedLongLongTy ? Match : NoMatch;
408 case BuiltinType::ULongLong:
409 return T == C.LongLongTy ? Match : NoMatch;
420 switch (BT->getKind()) {
421 case BuiltinType::Char_U:
422 case BuiltinType::UChar:
423 case BuiltinType::Char_S:
424 case BuiltinType::SChar:
439 return pointeeTy == C.getWideCharType() ? Match : NoMatch;
443 QualType WInt = C.getCanonicalType(C.getWIntType()).getUnqualifiedType();
445 if (C.getCanonicalType(argTy).getUnqualifiedType() == WInt)
449 ? C.getPromotedIntegerType(argTy)
451 PromoArg = C.getCanonicalType(PromoArg).getUnqualifiedType();
456 C.getCorrespondingUnsignedType(PromoArg) == WInt)
459 return WInt == PromoArg ? Match : NoMatch;
467 return NoMatchPedantic;
472 case ObjCPointerTy: {
491 llvm_unreachable(
"Invalid ArgType Kind!");
499 QualType Vec = C.getExtVectorType(T, NumElts);
507 llvm_unreachable(
"No representative type for Invalid ArgType");
509 llvm_unreachable(
"No representative type for Unknown ArgType");
517 Res = C.getPointerType(C.CharTy);
520 Res = C.getPointerType(C.getWideCharType());
523 Res = C.ObjCBuiltinIdTy;
529 Res = C.getWIntType();
535 Res = C.getPointerType(Res);
540 std::string S = getRepresentativeType(C).getAsString(C.getPrintingPolicy());
548 Alias += (Alias[Alias.size()-1] ==
'*') ?
"*" :
" *";
556 return std::string(
"'") + Alias +
"' (aka '" + S +
"')";
621 case dArg:
return "d";
622 case DArg:
return "D";
623 case iArg:
return "i";
624 case oArg:
return "o";
625 case OArg:
return "O";
626 case uArg:
return "u";
627 case UArg:
return "U";
628 case xArg:
return "x";
629 case XArg:
return "X";
630 case fArg:
return "f";
631 case FArg:
return "F";
632 case eArg:
return "e";
633 case EArg:
return "E";
634 case gArg:
return "g";
635 case GArg:
return "G";
636 case aArg:
return "a";
637 case AArg:
return "A";
638 case cArg:
return "c";
639 case sArg:
return "s";
640 case pArg:
return "p";
643 case nArg:
return "n";
649 case CArg:
return "C";
650 case SArg:
return "S";
665 case ZArg:
return "Z";
730 if (
Target.getTriple().isOSMSVCRT()) {
763 return Target.getTriple().isOSFreeBSD() ||
Target.getTriple().isPS4();
798 return Target.getTriple().isOSFreeBSD() ||
Target.getTriple().isPS4();
821 return !
Target.getTriple().isOSDarwin() &&
822 !
Target.getTriple().isOSWindows();
858 return Target.getTriple().isOSMSVCRT();
869 return Target.getTriple().isOSMSVCRT();
874 llvm_unreachable(
"Invalid LengthModifier Kind!");
899 llvm_unreachable(
"Invalid LengthModifier Kind!");
943 llvm_unreachable(
"Invalid ConversionSpecifier Kind!");
978 assert(isa<TypedefType>(QT) &&
"Expected a TypedefType");
986 }
else if (
Identifier->getName() ==
"ssize_t") {
990 }
else if (
Identifier->getName() ==
"intmax_t") {
993 }
else if (
Identifier->getName() ==
"uintmax_t") {
996 }
else if (
Identifier->getName() ==
"ptrdiff_t") {
1002 if (!isa<TypedefType>(T))
1005 Typedef = cast<TypedefType>(T)->getDecl();