diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-08-21 21:54:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-08-21 21:54:46 +0000 |
commit | 3cba495abca1f41a17f4092c5cf3f01374271adc (patch) | |
tree | 1a5c9393d8e5f55889463147399fa953acecb622 /clang/lib/Analysis/PrintfFormatString.cpp | |
parent | 3db39dc1ae6f27f10bd7bed91d40048b71c3ffc0 (diff) | |
download | llvm-3cba495abca1f41a17f4092c5cf3f01374271adc.zip llvm-3cba495abca1f41a17f4092c5cf3f01374271adc.tar.gz llvm-3cba495abca1f41a17f4092c5cf3f01374271adc.tar.bz2 |
Analysis: Add support for MS specific printf format specifiers
Summary: Adds support for %I, %I32 and %I64.
Reviewers: hans, jordan_rose, rnk, majnemer
Reviewed By: majnemer
CC: cfe-commits, cdavis5x
Differential Revision: http://llvm-reviews.chandlerc.com/D1456
llvm-svn: 188937
Diffstat (limited to 'clang/lib/Analysis/PrintfFormatString.cpp')
-rw-r--r-- | clang/lib/Analysis/PrintfFormatString.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/clang/lib/Analysis/PrintfFormatString.cpp b/clang/lib/Analysis/PrintfFormatString.cpp index 60f9517..cdf61223 100644 --- a/clang/lib/Analysis/PrintfFormatString.cpp +++ b/clang/lib/Analysis/PrintfFormatString.cpp @@ -187,8 +187,8 @@ static PrintfSpecifierResult ParsePrintfSpecifier(FormatStringHandler &H, case 'i': k = ConversionSpecifier::iArg; break; case 'n': k = ConversionSpecifier::nArg; break; case 'o': k = ConversionSpecifier::oArg; break; - case 'p': k = ConversionSpecifier::pArg; break; - case 's': k = ConversionSpecifier::sArg; break; + case 'p': k = ConversionSpecifier::pArg; break; + case 's': k = ConversionSpecifier::sArg; break; case 'u': k = ConversionSpecifier::uArg; break; case 'x': k = ConversionSpecifier::xArg; break; // POSIX specific. @@ -278,18 +278,26 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx, case LengthModifier::AsLongDouble: // GNU extension. return Ctx.LongLongTy; - case LengthModifier::None: return Ctx.IntTy; + case LengthModifier::None: + return Ctx.IntTy; + case LengthModifier::AsInt32: + return ArgType(Ctx.IntTy, "__int32"); case LengthModifier::AsChar: return ArgType::AnyCharTy; case LengthModifier::AsShort: return Ctx.ShortTy; case LengthModifier::AsLong: return Ctx.LongTy; case LengthModifier::AsLongLong: case LengthModifier::AsQuad: return Ctx.LongLongTy; + case LengthModifier::AsInt64: + return ArgType(Ctx.LongLongTy, "__int64"); case LengthModifier::AsIntMax: return ArgType(Ctx.getIntMaxType(), "intmax_t"); case LengthModifier::AsSizeT: // FIXME: How to get the corresponding signed version of size_t? return ArgType(); + case LengthModifier::AsInt3264: + return Ctx.getTargetInfo().getTriple().isArch64Bit() ? Ctx.LongLongTy + : Ctx.IntTy; case LengthModifier::AsPtrDiff: return ArgType(Ctx.getPointerDiffType(), "ptrdiff_t"); case LengthModifier::AsAllocate: @@ -302,17 +310,26 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx, case LengthModifier::AsLongDouble: // GNU extension. return Ctx.UnsignedLongLongTy; - case LengthModifier::None: return Ctx.UnsignedIntTy; + case LengthModifier::None: + return Ctx.UnsignedIntTy; + case LengthModifier::AsInt32: + return ArgType(Ctx.UnsignedIntTy, "unsigned __int32"); case LengthModifier::AsChar: return Ctx.UnsignedCharTy; case LengthModifier::AsShort: return Ctx.UnsignedShortTy; case LengthModifier::AsLong: return Ctx.UnsignedLongTy; case LengthModifier::AsLongLong: case LengthModifier::AsQuad: return Ctx.UnsignedLongLongTy; + case LengthModifier::AsInt64: + return ArgType(Ctx.UnsignedLongLongTy, "unsigned __int64"); case LengthModifier::AsIntMax: return ArgType(Ctx.getUIntMaxType(), "uintmax_t"); case LengthModifier::AsSizeT: return ArgType(Ctx.getSizeType(), "size_t"); + case LengthModifier::AsInt3264: + return Ctx.getTargetInfo().getTriple().isArch64Bit() + ? Ctx.UnsignedLongLongTy + : Ctx.UnsignedIntTy; case LengthModifier::AsPtrDiff: // FIXME: How to get the corresponding unsigned // version of ptrdiff_t? @@ -351,6 +368,9 @@ ArgType PrintfSpecifier::getArgType(ASTContext &Ctx, return ArgType(); // FIXME: Is this a known extension? case LengthModifier::AsAllocate: case LengthModifier::AsMAllocate: + case LengthModifier::AsInt32: + case LengthModifier::AsInt3264: + case LengthModifier::AsInt64: return ArgType::Invalid(); } } |