[cfe-commits] [PATCH] Improved handling of 128-bit integer literals
Richard Smith
richard at metafoo.co.uk
Thu Nov 29 16:16:13 PST 2012
Generally, we still need to handle Eli's observation that the C and C++
extended integer type rules require us to make intmax_t be __int128 if
we're going to allow literals to be of type __int128. I'm inclined to say
we should bite the bullet here, and treat __int128 as a proper extended
integer type (and thus change intmax_t, preprocessor constant expressions,
and so on). Any objections?
You can go ahead with this patch and (you or someone else) make the
intmax_t changes afterwards, if we have consensus on that direction.
Index: lib/Sema/SemaDeclAttr.cpp
===================================================================
--- lib/Sema/SemaDeclAttr.cpp (revision 168447)
+++ lib/Sema/SemaDeclAttr.cpp (working copy)
@@ -1114,6 +1114,12 @@
return;
}
+ if (!ArgNum.isIntN(64)) {
+ S.Diag(Attr.getLoc(), diag::err_attribute_argument_out_of_bounds)
+ << "alloc_size" << I.getArgNum() << Ex->getSourceRange();
This line needs more indentation.
Index: lib/Sema/SemaExpr.cpp
===================================================================
--- lib/Sema/SemaExpr.cpp (revision 168447)
+++ lib/Sema/SemaExpr.cpp (working copy)
[...]
+ // Microsoft literals simply *are* the specified type, regardless of
+ // whether the value fits into it or not, or whether they are hex or
+ // decimal or octal.
+ if (Literal.isLongLong) {
+ Width = Context.getTargetInfo().getLongLongWidth();
+ Ty = Literal.isUnsigned ? Context.UnsignedLongLongTy :
+ Context.LongLongTy;
+ } else if (Literal.isLong) {
+ Width = Context.getTargetInfo().getLongWidth();
+ Ty = Literal.isUnsigned ? Context.UnsignedLongTy : Context.LongTy;
+ } else {
+ Width = Context.getTargetInfo().getIntWidth();
+ Ty = Literal.isUnsigned ? Context.UnsignedIntTy : Context.IntTy;
}
Hmm, it looks incorrect to use isLong here instead of checking
microsoftWidth. In particular, if I use -fms-extensions on Linux, this
static_assert fails:
static_assert(sizeof(0i32) == 4, "");
... because 'long' is a 64-bit type on my target. (We also incorrectly use
'int' for i16 and i8.) We should presumably use the smallest integer type
which is at least N bits wide. I'm OK with this being dealt with in a
separate patch, since it's not a regression.
+ if (ResultVal.getActiveBits() > (Literal.isUnsigned ?
+ Literal.microsoftWidth :
+ Literal.microsoftWidth - 1)) {
+ Diag(Tok.getLocation(), diag::warn_integer_too_large);
+ // APInt asserts on NOP-truncations, so we need to be a little bit
+ // carefull; otherwise we would crash when the literal is signed
and
+ // microsoftWidth == Width.
+ if (Literal.microsoftWidth < Width)
+ ResultVal = ResultVal.trunc(Literal.microsoftWidth);
This can be simplified somewhat by passing Literal.microsoftWidth instead
of 64 when constructing ResultVal (you'd still need to check for the high
bit being set for a signed literal).
}
+
+ // Unlike in the non-MS-literal case, we may have already truncated
the
+ // APInt to be smaller than the final literal, so we may need to
adjust
+ // the size in either direciton here; use sextOrTrunc instead of
trunc.
+ if (ResultVal.getBitWidth() != Width)
+ ResultVal = ResultVal.sextOrTrunc(Width);
You should zext if the literal is unsigned (maybe make ResultVal an
APSInt, and use extOrTrunc). For instance, 0x18000Ui16 will currently first
be truncated to 0x8000 (with a warning), then sign extended to 0x80000000,
rather than producing the desired value 0x00008000.
+ // Checking for 64-bit pointers is perhaps not the correct way to
detect
+ // i128 support, but it seems to be what is done elsewhere.
+ if (PP.getTargetInfo().getPointerWidth(0) >= 64) {
TargetInfo now has a hasInt128Type().
On Sat, Nov 24, 2012 at 8:59 AM, Stephen Canon <scanon at apple.com> wrote:
> Updated patch with feedback from the first round. Please review.
>
> Thanks!
> - Steve
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20121129/f394a2ce/attachment.html>
More information about the cfe-commits
mailing list