FormatString.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  1. // FormatString.cpp - Common stuff for handling printf/scanf formats -*- C++ -*-
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // Shared details for processing format strings of printf and scanf
  10. // (and friends).
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "FormatStringParsing.h"
  14. #include "clang/Basic/LangOptions.h"
  15. #include "clang/Basic/TargetInfo.h"
  16. #include "llvm/Support/ConvertUTF.h"
  17. using clang::analyze_format_string::ArgType;
  18. using clang::analyze_format_string::FormatStringHandler;
  19. using clang::analyze_format_string::FormatSpecifier;
  20. using clang::analyze_format_string::LengthModifier;
  21. using clang::analyze_format_string::OptionalAmount;
  22. using clang::analyze_format_string::PositionContext;
  23. using clang::analyze_format_string::ConversionSpecifier;
  24. using namespace clang;
  25. // Key function to FormatStringHandler.
  26. FormatStringHandler::~FormatStringHandler() {}
  27. //===----------------------------------------------------------------------===//
  28. // Functions for parsing format strings components in both printf and
  29. // scanf format strings.
  30. //===----------------------------------------------------------------------===//
  31. OptionalAmount
  32. clang::analyze_format_string::ParseAmount(const char *&Beg, const char *E) {
  33. const char *I = Beg;
  34. UpdateOnReturn <const char*> UpdateBeg(Beg, I);
  35. unsigned accumulator = 0;
  36. bool hasDigits = false;
  37. for ( ; I != E; ++I) {
  38. char c = *I;
  39. if (c >= '0' && c <= '9') {
  40. hasDigits = true;
  41. accumulator = (accumulator * 10) + (c - '0');
  42. continue;
  43. }
  44. if (hasDigits)
  45. return OptionalAmount(OptionalAmount::Constant, accumulator, Beg, I - Beg,
  46. false);
  47. break;
  48. }
  49. return OptionalAmount();
  50. }
  51. OptionalAmount
  52. clang::analyze_format_string::ParseNonPositionAmount(const char *&Beg,
  53. const char *E,
  54. unsigned &argIndex) {
  55. if (*Beg == '*') {
  56. ++Beg;
  57. return OptionalAmount(OptionalAmount::Arg, argIndex++, Beg, 0, false);
  58. }
  59. return ParseAmount(Beg, E);
  60. }
  61. OptionalAmount
  62. clang::analyze_format_string::ParsePositionAmount(FormatStringHandler &H,
  63. const char *Start,
  64. const char *&Beg,
  65. const char *E,
  66. PositionContext p) {
  67. if (*Beg == '*') {
  68. const char *I = Beg + 1;
  69. const OptionalAmount &Amt = ParseAmount(I, E);
  70. if (Amt.getHowSpecified() == OptionalAmount::NotSpecified) {
  71. H.HandleInvalidPosition(Beg, I - Beg, p);
  72. return OptionalAmount(false);
  73. }
  74. if (I == E) {
  75. // No more characters left?
  76. H.HandleIncompleteSpecifier(Start, E - Start);
  77. return OptionalAmount(false);
  78. }
  79. assert(Amt.getHowSpecified() == OptionalAmount::Constant);
  80. if (*I == '$') {
  81. // Handle positional arguments
  82. // Special case: '*0$', since this is an easy mistake.
  83. if (Amt.getConstantAmount() == 0) {
  84. H.HandleZeroPosition(Beg, I - Beg + 1);
  85. return OptionalAmount(false);
  86. }
  87. const char *Tmp = Beg;
  88. Beg = ++I;
  89. return OptionalAmount(OptionalAmount::Arg, Amt.getConstantAmount() - 1,
  90. Tmp, 0, true);
  91. }
  92. H.HandleInvalidPosition(Beg, I - Beg, p);
  93. return OptionalAmount(false);
  94. }
  95. return ParseAmount(Beg, E);
  96. }
  97. bool
  98. clang::analyze_format_string::ParseFieldWidth(FormatStringHandler &H,
  99. FormatSpecifier &CS,
  100. const char *Start,
  101. const char *&Beg, const char *E,
  102. unsigned *argIndex) {
  103. // FIXME: Support negative field widths.
  104. if (argIndex) {
  105. CS.setFieldWidth(ParseNonPositionAmount(Beg, E, *argIndex));
  106. }
  107. else {
  108. const OptionalAmount Amt =
  109. ParsePositionAmount(H, Start, Beg, E,
  110. analyze_format_string::FieldWidthPos);
  111. if (Amt.isInvalid())
  112. return true;
  113. CS.setFieldWidth(Amt);
  114. }
  115. return false;
  116. }
  117. bool
  118. clang::analyze_format_string::ParseArgPosition(FormatStringHandler &H,
  119. FormatSpecifier &FS,
  120. const char *Start,
  121. const char *&Beg,
  122. const char *E) {
  123. const char *I = Beg;
  124. const OptionalAmount &Amt = ParseAmount(I, E);
  125. if (I == E) {
  126. // No more characters left?
  127. H.HandleIncompleteSpecifier(Start, E - Start);
  128. return true;
  129. }
  130. if (Amt.getHowSpecified() == OptionalAmount::Constant && *(I++) == '$') {
  131. // Warn that positional arguments are non-standard.
  132. H.HandlePosition(Start, I - Start);
  133. // Special case: '%0$', since this is an easy mistake.
  134. if (Amt.getConstantAmount() == 0) {
  135. H.HandleZeroPosition(Start, I - Start);
  136. return true;
  137. }
  138. FS.setArgIndex(Amt.getConstantAmount() - 1);
  139. FS.setUsesPositionalArg();
  140. // Update the caller's pointer if we decided to consume
  141. // these characters.
  142. Beg = I;
  143. return false;
  144. }
  145. return false;
  146. }
  147. bool
  148. clang::analyze_format_string::ParseVectorModifier(FormatStringHandler &H,
  149. FormatSpecifier &FS,
  150. const char *&I,
  151. const char *E,
  152. const LangOptions &LO) {
  153. if (!LO.OpenCL)
  154. return false;
  155. const char *Start = I;
  156. if (*I == 'v') {
  157. ++I;
  158. if (I == E) {
  159. H.HandleIncompleteSpecifier(Start, E - Start);
  160. return true;
  161. }
  162. OptionalAmount NumElts = ParseAmount(I, E);
  163. if (NumElts.getHowSpecified() != OptionalAmount::Constant) {
  164. H.HandleIncompleteSpecifier(Start, E - Start);
  165. return true;
  166. }
  167. FS.setVectorNumElts(NumElts);
  168. }
  169. return false;
  170. }
  171. bool
  172. clang::analyze_format_string::ParseLengthModifier(FormatSpecifier &FS,
  173. const char *&I,
  174. const char *E,
  175. const LangOptions &LO,
  176. bool IsScanf) {
  177. LengthModifier::Kind lmKind = LengthModifier::None;
  178. const char *lmPosition = I;
  179. switch (*I) {
  180. default:
  181. return false;
  182. case 'h':
  183. ++I;
  184. if (I != E && *I == 'h') {
  185. ++I;
  186. lmKind = LengthModifier::AsChar;
  187. } else if (I != E && *I == 'l' && LO.OpenCL) {
  188. ++I;
  189. lmKind = LengthModifier::AsShortLong;
  190. } else {
  191. lmKind = LengthModifier::AsShort;
  192. }
  193. break;
  194. case 'l':
  195. ++I;
  196. if (I != E && *I == 'l') {
  197. ++I;
  198. lmKind = LengthModifier::AsLongLong;
  199. } else {
  200. lmKind = LengthModifier::AsLong;
  201. }
  202. break;
  203. case 'j': lmKind = LengthModifier::AsIntMax; ++I; break;
  204. case 'z': lmKind = LengthModifier::AsSizeT; ++I; break;
  205. case 't': lmKind = LengthModifier::AsPtrDiff; ++I; break;
  206. case 'L': lmKind = LengthModifier::AsLongDouble; ++I; break;
  207. case 'q': lmKind = LengthModifier::AsQuad; ++I; break;
  208. case 'a':
  209. if (IsScanf && !LO.C99 && !LO.CPlusPlus11) {
  210. // For scanf in C90, look at the next character to see if this should
  211. // be parsed as the GNU extension 'a' length modifier. If not, this
  212. // will be parsed as a conversion specifier.
  213. ++I;
  214. if (I != E && (*I == 's' || *I == 'S' || *I == '[')) {
  215. lmKind = LengthModifier::AsAllocate;
  216. break;
  217. }
  218. --I;
  219. }
  220. return false;
  221. case 'm':
  222. if (IsScanf) {
  223. lmKind = LengthModifier::AsMAllocate;
  224. ++I;
  225. break;
  226. }
  227. return false;
  228. // printf: AsInt64, AsInt32, AsInt3264
  229. // scanf: AsInt64
  230. case 'I':
  231. if (I + 1 != E && I + 2 != E) {
  232. if (I[1] == '6' && I[2] == '4') {
  233. I += 3;
  234. lmKind = LengthModifier::AsInt64;
  235. break;
  236. }
  237. if (IsScanf)
  238. return false;
  239. if (I[1] == '3' && I[2] == '2') {
  240. I += 3;
  241. lmKind = LengthModifier::AsInt32;
  242. break;
  243. }
  244. }
  245. ++I;
  246. lmKind = LengthModifier::AsInt3264;
  247. break;
  248. case 'w':
  249. lmKind = LengthModifier::AsWide; ++I; break;
  250. }
  251. LengthModifier lm(lmPosition, lmKind);
  252. FS.setLengthModifier(lm);
  253. return true;
  254. }
  255. bool clang::analyze_format_string::ParseUTF8InvalidSpecifier(
  256. const char *SpecifierBegin, const char *FmtStrEnd, unsigned &Len) {
  257. if (SpecifierBegin + 1 >= FmtStrEnd)
  258. return false;
  259. const llvm::UTF8 *SB =
  260. reinterpret_cast<const llvm::UTF8 *>(SpecifierBegin + 1);
  261. const llvm::UTF8 *SE = reinterpret_cast<const llvm::UTF8 *>(FmtStrEnd);
  262. const char FirstByte = *SB;
  263. // If the invalid specifier is a multibyte UTF-8 string, return the
  264. // total length accordingly so that the conversion specifier can be
  265. // properly updated to reflect a complete UTF-8 specifier.
  266. unsigned NumBytes = llvm::getNumBytesForUTF8(FirstByte);
  267. if (NumBytes == 1)
  268. return false;
  269. if (SB + NumBytes > SE)
  270. return false;
  271. Len = NumBytes + 1;
  272. return true;
  273. }
  274. //===----------------------------------------------------------------------===//
  275. // Methods on ArgType.
  276. //===----------------------------------------------------------------------===//
  277. clang::analyze_format_string::ArgType::MatchKind
  278. ArgType::matchesType(ASTContext &C, QualType argTy) const {
  279. if (Ptr) {
  280. // It has to be a pointer.
  281. const PointerType *PT = argTy->getAs<PointerType>();
  282. if (!PT)
  283. return NoMatch;
  284. // We cannot write through a const qualified pointer.
  285. if (PT->getPointeeType().isConstQualified())
  286. return NoMatch;
  287. argTy = PT->getPointeeType();
  288. }
  289. switch (K) {
  290. case InvalidTy:
  291. llvm_unreachable("ArgType must be valid");
  292. case UnknownTy:
  293. return Match;
  294. case AnyCharTy: {
  295. if (const EnumType *ETy = argTy->getAs<EnumType>()) {
  296. // If the enum is incomplete we know nothing about the underlying type.
  297. // Assume that it's 'int'.
  298. if (!ETy->getDecl()->isComplete())
  299. return NoMatch;
  300. argTy = ETy->getDecl()->getIntegerType();
  301. }
  302. if (const BuiltinType *BT = argTy->getAs<BuiltinType>())
  303. switch (BT->getKind()) {
  304. default:
  305. break;
  306. case BuiltinType::Char_S:
  307. case BuiltinType::SChar:
  308. case BuiltinType::UChar:
  309. case BuiltinType::Char_U:
  310. return Match;
  311. }
  312. return NoMatch;
  313. }
  314. case SpecificTy: {
  315. if (const EnumType *ETy = argTy->getAs<EnumType>()) {
  316. // If the enum is incomplete we know nothing about the underlying type.
  317. // Assume that it's 'int'.
  318. if (!ETy->getDecl()->isComplete())
  319. argTy = C.IntTy;
  320. else
  321. argTy = ETy->getDecl()->getIntegerType();
  322. }
  323. argTy = C.getCanonicalType(argTy).getUnqualifiedType();
  324. if (T == argTy)
  325. return Match;
  326. // Check for "compatible types".
  327. if (const BuiltinType *BT = argTy->getAs<BuiltinType>())
  328. switch (BT->getKind()) {
  329. default:
  330. break;
  331. case BuiltinType::Char_S:
  332. case BuiltinType::SChar:
  333. case BuiltinType::Char_U:
  334. case BuiltinType::UChar:
  335. return T == C.UnsignedCharTy || T == C.SignedCharTy ? Match
  336. : NoMatch;
  337. case BuiltinType::Short:
  338. return T == C.UnsignedShortTy ? Match : NoMatch;
  339. case BuiltinType::UShort:
  340. return T == C.ShortTy ? Match : NoMatch;
  341. case BuiltinType::Int:
  342. return T == C.UnsignedIntTy ? Match : NoMatch;
  343. case BuiltinType::UInt:
  344. return T == C.IntTy ? Match : NoMatch;
  345. case BuiltinType::Long:
  346. return T == C.UnsignedLongTy ? Match : NoMatch;
  347. case BuiltinType::ULong:
  348. return T == C.LongTy ? Match : NoMatch;
  349. case BuiltinType::LongLong:
  350. return T == C.UnsignedLongLongTy ? Match : NoMatch;
  351. case BuiltinType::ULongLong:
  352. return T == C.LongLongTy ? Match : NoMatch;
  353. }
  354. return NoMatch;
  355. }
  356. case CStrTy: {
  357. const PointerType *PT = argTy->getAs<PointerType>();
  358. if (!PT)
  359. return NoMatch;
  360. QualType pointeeTy = PT->getPointeeType();
  361. if (const BuiltinType *BT = pointeeTy->getAs<BuiltinType>())
  362. switch (BT->getKind()) {
  363. case BuiltinType::Void:
  364. case BuiltinType::Char_U:
  365. case BuiltinType::UChar:
  366. case BuiltinType::Char_S:
  367. case BuiltinType::SChar:
  368. return Match;
  369. default:
  370. break;
  371. }
  372. return NoMatch;
  373. }
  374. case WCStrTy: {
  375. const PointerType *PT = argTy->getAs<PointerType>();
  376. if (!PT)
  377. return NoMatch;
  378. QualType pointeeTy =
  379. C.getCanonicalType(PT->getPointeeType()).getUnqualifiedType();
  380. return pointeeTy == C.getWideCharType() ? Match : NoMatch;
  381. }
  382. case WIntTy: {
  383. QualType WInt = C.getCanonicalType(C.getWIntType()).getUnqualifiedType();
  384. if (C.getCanonicalType(argTy).getUnqualifiedType() == WInt)
  385. return Match;
  386. QualType PromoArg = argTy->isPromotableIntegerType()
  387. ? C.getPromotedIntegerType(argTy)
  388. : argTy;
  389. PromoArg = C.getCanonicalType(PromoArg).getUnqualifiedType();
  390. // If the promoted argument is the corresponding signed type of the
  391. // wint_t type, then it should match.
  392. if (PromoArg->hasSignedIntegerRepresentation() &&
  393. C.getCorrespondingUnsignedType(PromoArg) == WInt)
  394. return Match;
  395. return WInt == PromoArg ? Match : NoMatch;
  396. }
  397. case CPointerTy:
  398. if (argTy->isVoidPointerType()) {
  399. return Match;
  400. } if (argTy->isPointerType() || argTy->isObjCObjectPointerType() ||
  401. argTy->isBlockPointerType() || argTy->isNullPtrType()) {
  402. return NoMatchPedantic;
  403. } else {
  404. return NoMatch;
  405. }
  406. case ObjCPointerTy: {
  407. if (argTy->getAs<ObjCObjectPointerType>() ||
  408. argTy->getAs<BlockPointerType>())
  409. return Match;
  410. // Handle implicit toll-free bridging.
  411. if (const PointerType *PT = argTy->getAs<PointerType>()) {
  412. // Things such as CFTypeRef are really just opaque pointers
  413. // to C structs representing CF types that can often be bridged
  414. // to Objective-C objects. Since the compiler doesn't know which
  415. // structs can be toll-free bridged, we just accept them all.
  416. QualType pointee = PT->getPointeeType();
  417. if (pointee->getAsStructureType() || pointee->isVoidType())
  418. return Match;
  419. }
  420. return NoMatch;
  421. }
  422. }
  423. llvm_unreachable("Invalid ArgType Kind!");
  424. }
  425. ArgType ArgType::makeVectorType(ASTContext &C, unsigned NumElts) const {
  426. // Check for valid vector element types.
  427. if (T.isNull())
  428. return ArgType::Invalid();
  429. QualType Vec = C.getExtVectorType(T, NumElts);
  430. return ArgType(Vec, Name);
  431. }
  432. QualType ArgType::getRepresentativeType(ASTContext &C) const {
  433. QualType Res;
  434. switch (K) {
  435. case InvalidTy:
  436. llvm_unreachable("No representative type for Invalid ArgType");
  437. case UnknownTy:
  438. llvm_unreachable("No representative type for Unknown ArgType");
  439. case AnyCharTy:
  440. Res = C.CharTy;
  441. break;
  442. case SpecificTy:
  443. Res = T;
  444. break;
  445. case CStrTy:
  446. Res = C.getPointerType(C.CharTy);
  447. break;
  448. case WCStrTy:
  449. Res = C.getPointerType(C.getWideCharType());
  450. break;
  451. case ObjCPointerTy:
  452. Res = C.ObjCBuiltinIdTy;
  453. break;
  454. case CPointerTy:
  455. Res = C.VoidPtrTy;
  456. break;
  457. case WIntTy: {
  458. Res = C.getWIntType();
  459. break;
  460. }
  461. }
  462. if (Ptr)
  463. Res = C.getPointerType(Res);
  464. return Res;
  465. }
  466. std::string ArgType::getRepresentativeTypeName(ASTContext &C) const {
  467. std::string S = getRepresentativeType(C).getAsString();
  468. std::string Alias;
  469. if (Name) {
  470. // Use a specific name for this type, e.g. "size_t".
  471. Alias = Name;
  472. if (Ptr) {
  473. // If ArgType is actually a pointer to T, append an asterisk.
  474. Alias += (Alias[Alias.size()-1] == '*') ? "*" : " *";
  475. }
  476. // If Alias is the same as the underlying type, e.g. wchar_t, then drop it.
  477. if (S == Alias)
  478. Alias.clear();
  479. }
  480. if (!Alias.empty())
  481. return std::string("'") + Alias + "' (aka '" + S + "')";
  482. return std::string("'") + S + "'";
  483. }
  484. //===----------------------------------------------------------------------===//
  485. // Methods on OptionalAmount.
  486. //===----------------------------------------------------------------------===//
  487. ArgType
  488. analyze_format_string::OptionalAmount::getArgType(ASTContext &Ctx) const {
  489. return Ctx.IntTy;
  490. }
  491. //===----------------------------------------------------------------------===//
  492. // Methods on LengthModifier.
  493. //===----------------------------------------------------------------------===//
  494. const char *
  495. analyze_format_string::LengthModifier::toString() const {
  496. switch (kind) {
  497. case AsChar:
  498. return "hh";
  499. case AsShort:
  500. return "h";
  501. case AsShortLong:
  502. return "hl";
  503. case AsLong: // or AsWideChar
  504. return "l";
  505. case AsLongLong:
  506. return "ll";
  507. case AsQuad:
  508. return "q";
  509. case AsIntMax:
  510. return "j";
  511. case AsSizeT:
  512. return "z";
  513. case AsPtrDiff:
  514. return "t";
  515. case AsInt32:
  516. return "I32";
  517. case AsInt3264:
  518. return "I";
  519. case AsInt64:
  520. return "I64";
  521. case AsLongDouble:
  522. return "L";
  523. case AsAllocate:
  524. return "a";
  525. case AsMAllocate:
  526. return "m";
  527. case AsWide:
  528. return "w";
  529. case None:
  530. return "";
  531. }
  532. return nullptr;
  533. }
  534. //===----------------------------------------------------------------------===//
  535. // Methods on ConversionSpecifier.
  536. //===----------------------------------------------------------------------===//
  537. const char *ConversionSpecifier::toString() const {
  538. switch (kind) {
  539. case dArg: return "d";
  540. case DArg: return "D";
  541. case iArg: return "i";
  542. case oArg: return "o";
  543. case OArg: return "O";
  544. case uArg: return "u";
  545. case UArg: return "U";
  546. case xArg: return "x";
  547. case XArg: return "X";
  548. case fArg: return "f";
  549. case FArg: return "F";
  550. case eArg: return "e";
  551. case EArg: return "E";
  552. case gArg: return "g";
  553. case GArg: return "G";
  554. case aArg: return "a";
  555. case AArg: return "A";
  556. case cArg: return "c";
  557. case sArg: return "s";
  558. case pArg: return "p";
  559. case PArg:
  560. return "P";
  561. case nArg: return "n";
  562. case PercentArg: return "%";
  563. case ScanListArg: return "[";
  564. case InvalidSpecifier: return nullptr;
  565. // POSIX unicode extensions.
  566. case CArg: return "C";
  567. case SArg: return "S";
  568. // Objective-C specific specifiers.
  569. case ObjCObjArg: return "@";
  570. // FreeBSD kernel specific specifiers.
  571. case FreeBSDbArg: return "b";
  572. case FreeBSDDArg: return "D";
  573. case FreeBSDrArg: return "r";
  574. case FreeBSDyArg: return "y";
  575. // GlibC specific specifiers.
  576. case PrintErrno: return "m";
  577. // MS specific specifiers.
  578. case ZArg: return "Z";
  579. }
  580. return nullptr;
  581. }
  582. Optional<ConversionSpecifier>
  583. ConversionSpecifier::getStandardSpecifier() const {
  584. ConversionSpecifier::Kind NewKind;
  585. switch (getKind()) {
  586. default:
  587. return None;
  588. case DArg:
  589. NewKind = dArg;
  590. break;
  591. case UArg:
  592. NewKind = uArg;
  593. break;
  594. case OArg:
  595. NewKind = oArg;
  596. break;
  597. }
  598. ConversionSpecifier FixedCS(*this);
  599. FixedCS.setKind(NewKind);
  600. return FixedCS;
  601. }
  602. //===----------------------------------------------------------------------===//
  603. // Methods on OptionalAmount.
  604. //===----------------------------------------------------------------------===//
  605. void OptionalAmount::toString(raw_ostream &os) const {
  606. switch (hs) {
  607. case Invalid:
  608. case NotSpecified:
  609. return;
  610. case Arg:
  611. if (UsesDotPrefix)
  612. os << ".";
  613. if (usesPositionalArg())
  614. os << "*" << getPositionalArgIndex() << "$";
  615. else
  616. os << "*";
  617. break;
  618. case Constant:
  619. if (UsesDotPrefix)
  620. os << ".";
  621. os << amt;
  622. break;
  623. }
  624. }
  625. bool FormatSpecifier::hasValidLengthModifier(const TargetInfo &Target,
  626. const LangOptions &LO) const {
  627. switch (LM.getKind()) {
  628. case LengthModifier::None:
  629. return true;
  630. // Handle most integer flags
  631. case LengthModifier::AsShort:
  632. // Length modifier only applies to FP vectors.
  633. if (LO.OpenCL && CS.isDoubleArg())
  634. return !VectorNumElts.isInvalid();
  635. if (Target.getTriple().isOSMSVCRT()) {
  636. switch (CS.getKind()) {
  637. case ConversionSpecifier::cArg:
  638. case ConversionSpecifier::CArg:
  639. case ConversionSpecifier::sArg:
  640. case ConversionSpecifier::SArg:
  641. case ConversionSpecifier::ZArg:
  642. return true;
  643. default:
  644. break;
  645. }
  646. }
  647. LLVM_FALLTHROUGH;
  648. case LengthModifier::AsChar:
  649. case LengthModifier::AsLongLong:
  650. case LengthModifier::AsQuad:
  651. case LengthModifier::AsIntMax:
  652. case LengthModifier::AsSizeT:
  653. case LengthModifier::AsPtrDiff:
  654. switch (CS.getKind()) {
  655. case ConversionSpecifier::dArg:
  656. case ConversionSpecifier::DArg:
  657. case ConversionSpecifier::iArg:
  658. case ConversionSpecifier::oArg:
  659. case ConversionSpecifier::OArg:
  660. case ConversionSpecifier::uArg:
  661. case ConversionSpecifier::UArg:
  662. case ConversionSpecifier::xArg:
  663. case ConversionSpecifier::XArg:
  664. case ConversionSpecifier::nArg:
  665. return true;
  666. case ConversionSpecifier::FreeBSDrArg:
  667. case ConversionSpecifier::FreeBSDyArg:
  668. return Target.getTriple().isOSFreeBSD() || Target.getTriple().isPS4();
  669. default:
  670. return false;
  671. }
  672. case LengthModifier::AsShortLong:
  673. return LO.OpenCL && !VectorNumElts.isInvalid();
  674. // Handle 'l' flag
  675. case LengthModifier::AsLong: // or AsWideChar
  676. if (CS.isDoubleArg()) {
  677. // Invalid for OpenCL FP scalars.
  678. if (LO.OpenCL && VectorNumElts.isInvalid())
  679. return false;
  680. return true;
  681. }
  682. switch (CS.getKind()) {
  683. case ConversionSpecifier::dArg:
  684. case ConversionSpecifier::DArg:
  685. case ConversionSpecifier::iArg:
  686. case ConversionSpecifier::oArg:
  687. case ConversionSpecifier::OArg:
  688. case ConversionSpecifier::uArg:
  689. case ConversionSpecifier::UArg:
  690. case ConversionSpecifier::xArg:
  691. case ConversionSpecifier::XArg:
  692. case ConversionSpecifier::nArg:
  693. case ConversionSpecifier::cArg:
  694. case ConversionSpecifier::sArg:
  695. case ConversionSpecifier::ScanListArg:
  696. case ConversionSpecifier::ZArg:
  697. return true;
  698. case ConversionSpecifier::FreeBSDrArg:
  699. case ConversionSpecifier::FreeBSDyArg:
  700. return Target.getTriple().isOSFreeBSD() || Target.getTriple().isPS4();
  701. default:
  702. return false;
  703. }
  704. case LengthModifier::AsLongDouble:
  705. switch (CS.getKind()) {
  706. case ConversionSpecifier::aArg:
  707. case ConversionSpecifier::AArg:
  708. case ConversionSpecifier::fArg:
  709. case ConversionSpecifier::FArg:
  710. case ConversionSpecifier::eArg:
  711. case ConversionSpecifier::EArg:
  712. case ConversionSpecifier::gArg:
  713. case ConversionSpecifier::GArg:
  714. return true;
  715. // GNU libc extension.
  716. case ConversionSpecifier::dArg:
  717. case ConversionSpecifier::iArg:
  718. case ConversionSpecifier::oArg:
  719. case ConversionSpecifier::uArg:
  720. case ConversionSpecifier::xArg:
  721. case ConversionSpecifier::XArg:
  722. return !Target.getTriple().isOSDarwin() &&
  723. !Target.getTriple().isOSWindows();
  724. default:
  725. return false;
  726. }
  727. case LengthModifier::AsAllocate:
  728. switch (CS.getKind()) {
  729. case ConversionSpecifier::sArg:
  730. case ConversionSpecifier::SArg:
  731. case ConversionSpecifier::ScanListArg:
  732. return true;
  733. default:
  734. return false;
  735. }
  736. case LengthModifier::AsMAllocate:
  737. switch (CS.getKind()) {
  738. case ConversionSpecifier::cArg:
  739. case ConversionSpecifier::CArg:
  740. case ConversionSpecifier::sArg:
  741. case ConversionSpecifier::SArg:
  742. case ConversionSpecifier::ScanListArg:
  743. return true;
  744. default:
  745. return false;
  746. }
  747. case LengthModifier::AsInt32:
  748. case LengthModifier::AsInt3264:
  749. case LengthModifier::AsInt64:
  750. switch (CS.getKind()) {
  751. case ConversionSpecifier::dArg:
  752. case ConversionSpecifier::iArg:
  753. case ConversionSpecifier::oArg:
  754. case ConversionSpecifier::uArg:
  755. case ConversionSpecifier::xArg:
  756. case ConversionSpecifier::XArg:
  757. return Target.getTriple().isOSMSVCRT();
  758. default:
  759. return false;
  760. }
  761. case LengthModifier::AsWide:
  762. switch (CS.getKind()) {
  763. case ConversionSpecifier::cArg:
  764. case ConversionSpecifier::CArg:
  765. case ConversionSpecifier::sArg:
  766. case ConversionSpecifier::SArg:
  767. case ConversionSpecifier::ZArg:
  768. return Target.getTriple().isOSMSVCRT();
  769. default:
  770. return false;
  771. }
  772. }
  773. llvm_unreachable("Invalid LengthModifier Kind!");
  774. }
  775. bool FormatSpecifier::hasStandardLengthModifier() const {
  776. switch (LM.getKind()) {
  777. case LengthModifier::None:
  778. case LengthModifier::AsChar:
  779. case LengthModifier::AsShort:
  780. case LengthModifier::AsLong:
  781. case LengthModifier::AsLongLong:
  782. case LengthModifier::AsIntMax:
  783. case LengthModifier::AsSizeT:
  784. case LengthModifier::AsPtrDiff:
  785. case LengthModifier::AsLongDouble:
  786. return true;
  787. case LengthModifier::AsAllocate:
  788. case LengthModifier::AsMAllocate:
  789. case LengthModifier::AsQuad:
  790. case LengthModifier::AsInt32:
  791. case LengthModifier::AsInt3264:
  792. case LengthModifier::AsInt64:
  793. case LengthModifier::AsWide:
  794. case LengthModifier::AsShortLong: // ???
  795. return false;
  796. }
  797. llvm_unreachable("Invalid LengthModifier Kind!");
  798. }
  799. bool FormatSpecifier::hasStandardConversionSpecifier(
  800. const LangOptions &LangOpt) const {
  801. switch (CS.getKind()) {
  802. case ConversionSpecifier::cArg:
  803. case ConversionSpecifier::dArg:
  804. case ConversionSpecifier::iArg:
  805. case ConversionSpecifier::oArg:
  806. case ConversionSpecifier::uArg:
  807. case ConversionSpecifier::xArg:
  808. case ConversionSpecifier::XArg:
  809. case ConversionSpecifier::fArg:
  810. case ConversionSpecifier::FArg:
  811. case ConversionSpecifier::eArg:
  812. case ConversionSpecifier::EArg:
  813. case ConversionSpecifier::gArg:
  814. case ConversionSpecifier::GArg:
  815. case ConversionSpecifier::aArg:
  816. case ConversionSpecifier::AArg:
  817. case ConversionSpecifier::sArg:
  818. case ConversionSpecifier::pArg:
  819. case ConversionSpecifier::nArg:
  820. case ConversionSpecifier::ObjCObjArg:
  821. case ConversionSpecifier::ScanListArg:
  822. case ConversionSpecifier::PercentArg:
  823. case ConversionSpecifier::PArg:
  824. return true;
  825. case ConversionSpecifier::CArg:
  826. case ConversionSpecifier::SArg:
  827. return LangOpt.ObjC;
  828. case ConversionSpecifier::InvalidSpecifier:
  829. case ConversionSpecifier::FreeBSDbArg:
  830. case ConversionSpecifier::FreeBSDDArg:
  831. case ConversionSpecifier::FreeBSDrArg:
  832. case ConversionSpecifier::FreeBSDyArg:
  833. case ConversionSpecifier::PrintErrno:
  834. case ConversionSpecifier::DArg:
  835. case ConversionSpecifier::OArg:
  836. case ConversionSpecifier::UArg:
  837. case ConversionSpecifier::ZArg:
  838. return false;
  839. }
  840. llvm_unreachable("Invalid ConversionSpecifier Kind!");
  841. }
  842. bool FormatSpecifier::hasStandardLengthConversionCombination() const {
  843. if (LM.getKind() == LengthModifier::AsLongDouble) {
  844. switch(CS.getKind()) {
  845. case ConversionSpecifier::dArg:
  846. case ConversionSpecifier::iArg:
  847. case ConversionSpecifier::oArg:
  848. case ConversionSpecifier::uArg:
  849. case ConversionSpecifier::xArg:
  850. case ConversionSpecifier::XArg:
  851. return false;
  852. default:
  853. return true;
  854. }
  855. }
  856. return true;
  857. }
  858. Optional<LengthModifier> FormatSpecifier::getCorrectedLengthModifier() const {
  859. if (CS.isAnyIntArg() || CS.getKind() == ConversionSpecifier::nArg) {
  860. if (LM.getKind() == LengthModifier::AsLongDouble ||
  861. LM.getKind() == LengthModifier::AsQuad) {
  862. LengthModifier FixedLM(LM);
  863. FixedLM.setKind(LengthModifier::AsLongLong);
  864. return FixedLM;
  865. }
  866. }
  867. return None;
  868. }
  869. bool FormatSpecifier::namedTypeToLengthModifier(QualType QT,
  870. LengthModifier &LM) {
  871. assert(isa<TypedefType>(QT) && "Expected a TypedefType");
  872. const TypedefNameDecl *Typedef = cast<TypedefType>(QT)->getDecl();
  873. for (;;) {
  874. const IdentifierInfo *Identifier = Typedef->getIdentifier();
  875. if (Identifier->getName() == "size_t") {
  876. LM.setKind(LengthModifier::AsSizeT);
  877. return true;
  878. } else if (Identifier->getName() == "ssize_t") {
  879. // Not C99, but common in Unix.
  880. LM.setKind(LengthModifier::AsSizeT);
  881. return true;
  882. } else if (Identifier->getName() == "intmax_t") {
  883. LM.setKind(LengthModifier::AsIntMax);
  884. return true;
  885. } else if (Identifier->getName() == "uintmax_t") {
  886. LM.setKind(LengthModifier::AsIntMax);
  887. return true;
  888. } else if (Identifier->getName() == "ptrdiff_t") {
  889. LM.setKind(LengthModifier::AsPtrDiff);
  890. return true;
  891. }
  892. QualType T = Typedef->getUnderlyingType();
  893. if (!isa<TypedefType>(T))
  894. break;
  895. Typedef = cast<TypedefType>(T)->getDecl();
  896. }
  897. return false;
  898. }