r190044 - Add new methods for TargetInfo:
Eli Friedman
eli.friedman at gmail.com
Thu Sep 5 12:53:44 PDT 2013
On Thu, Sep 5, 2013 at 4:23 AM, Stepan Dyatkovskiy <stpworld at narod.ru>wrote:
> Author: dyatkovskiy
> Date: Thu Sep 5 06:23:21 2013
> New Revision: 190044
>
> URL: http://llvm.org/viewvc/llvm-project?rev=190044&view=rev
> Log:
> Add new methods for TargetInfo:
> getRealTypeByWidth and getIntTypeByWidth
> for ASTContext names are almost same(invokes new methods from
> TargetInfo):
> getIntTypeForBitwidth and getRealTypeForBitwidth.
>
> As first commit for PR16752 fix: 'mode' attribute for unusual targets
> doesn't work properly
> Description:
> Troubles could be happened due to some assumptions in handleModeAttr
> function (see SemaDeclAttr.cpp).
> For example, it assumes that 32 bit integer is 'int', while it could be 16
> bit only.
> Instead of asking target: 'which type do you want to use for int32_t ?' it
> just hardcodes general opinion. That doesn't looks pretty correct.
> Please consider the next solution:
> 1. In Basic/TargetInfo add getIntTypeByWidth and getRealTypeByWidth
> virtual methods. By default current behaviour could be implemented here.
> 2. Fix handleModeAttr according to new methods in TargetInfo.
> This approach is implemented in the patch attached to this post.
>
> Fixes:
> 1st Commit (Current): Add new methods for TargetInfo:
> getRealTypeByWidth and getIntTypeByWidth
> for ASTContext names are almost same(invokes new methods from
> TargetInfo):
> getIntTypeForBitwidth and getRealTypeForBitwidth
>
> 2nd Commit (Next): Fix SemaDeclAttr, handleModeAttr function.
>
>
> Modified:
> cfe/trunk/include/clang/AST/ASTContext.h
> cfe/trunk/include/clang/Basic/TargetInfo.h
> cfe/trunk/lib/AST/ASTContext.cpp
> cfe/trunk/lib/Basic/TargetInfo.cpp
> cfe/trunk/lib/Frontend/InitPreprocessor.cpp
>
> Modified: cfe/trunk/include/clang/AST/ASTContext.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ASTContext.h?rev=190044&r1=190043&r2=190044&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/AST/ASTContext.h (original)
> +++ cfe/trunk/include/clang/AST/ASTContext.h Thu Sep 5 06:23:21 2013
> @@ -480,6 +480,17 @@ public:
>
> const TargetInfo &getTargetInfo() const { return *Target; }
>
> + /// getIntTypeForBitwidth -
> + /// sets integer QualTy according to specified details:
> + /// bitwidth, signed/unsigned.
> + /// Returns empty type if there is no appropriate target types.
> + QualType getIntTypeForBitwidth(unsigned DestWidth,
> + unsigned Signed) const;
> + /// getRealTypeForBitwidth -
> + /// sets floating point QualTy according to specified bitwidth.
> + /// Returns empty type if there is no appropriate target types.
> + QualType getRealTypeForBitwidth(unsigned DestWidth) const;
> +
> bool AtomicUsesUnsupportedLibcall(const AtomicExpr *E) const;
>
> const LangOptions& getLangOpts() const { return LangOpts; }
>
> Modified: cfe/trunk/include/clang/Basic/TargetInfo.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TargetInfo.h?rev=190044&r1=190043&r2=190044&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/TargetInfo.h (original)
> +++ cfe/trunk/include/clang/Basic/TargetInfo.h Thu Sep 5 06:23:21 2013
> @@ -112,6 +112,8 @@ public:
> ///===---- Target Data Type Query Methods
> -------------------------------===//
> enum IntType {
> NoInt = 0,
> + SignedChar,
> + UnsignedChar,
> SignedShort,
> UnsignedShort,
> SignedInt,
> @@ -123,6 +125,7 @@ public:
> };
>
> enum RealType {
> + NoFloat = 255,
> Float = 0,
> Double,
> LongDouble
> @@ -220,6 +223,12 @@ public:
> /// For example, SignedInt -> getIntWidth().
> unsigned getTypeWidth(IntType T) const;
>
> + /// \brief Return integer type with specified width.
> + IntType getIntTypeByWidth(unsigned BitWidth, bool IsSigned) const;
> +
> + /// \brief Return floating point type with specified width.
> + RealType getRealTypeByWidth(unsigned BitWidth) const;
> +
> /// \brief Return the alignment (in bits) of the specified integer type
> enum.
> ///
> /// For example, SignedInt -> getIntAlign().
>
> Modified: cfe/trunk/lib/AST/ASTContext.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ASTContext.cpp?rev=190044&r1=190043&r2=190044&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/AST/ASTContext.cpp (original)
> +++ cfe/trunk/lib/AST/ASTContext.cpp Thu Sep 5 06:23:21 2013
> @@ -6314,6 +6314,8 @@ ASTContext::getSubstTemplateTemplateParm
> CanQualType ASTContext::getFromTargetType(unsigned Type) const {
> switch (Type) {
> case TargetInfo::NoInt: return CanQualType();
> + case TargetInfo::SignedChar: return SignedCharTy;
> + case TargetInfo::UnsignedChar: return UnsignedCharTy;
> case TargetInfo::SignedShort: return ShortTy;
> case TargetInfo::UnsignedShort: return UnsignedShortTy;
> case TargetInfo::SignedInt: return IntTy;
> @@ -7990,6 +7992,38 @@ size_t ASTContext::getSideTableAllocated
> llvm::capacity_in_bytes(ClassScopeSpecializationPattern);
> }
>
> +/// getIntTypeForBitwidth -
> +/// sets integer QualTy according to specified details:
> +/// bitwidth, signed/unsigned.
> +/// Returns empty type if there is no appropriate target types.
> +QualType ASTContext::getIntTypeForBitwidth(unsigned DestWidth,
> + unsigned Signed) const {
> + TargetInfo::IntType Ty = getTargetInfo().getIntTypeByWidth(DestWidth,
> Signed);
> + CanQualType QualTy = getFromTargetType(Ty);
> + if (!QualTy && DestWidth == 128)
> + return Signed ? Int128Ty : UnsignedInt128Ty;
> + return QualTy;
> +}
> +
> +/// getRealTypeForBitwidth -
> +/// sets floating point QualTy according to specified bitwidth.
> +/// Returns empty type if there is no appropriate target types.
> +QualType ASTContext::getRealTypeForBitwidth(unsigned DestWidth) const {
> + TargetInfo::RealType Ty = getTargetInfo().getRealTypeByWidth(DestWidth);
> + switch (Ty) {
> + case TargetInfo::Float:
> + return FloatTy;
> + case TargetInfo::Double:
> + return DoubleTy;
> + case TargetInfo::LongDouble:
> + return LongDoubleTy;
> + case TargetInfo::NoFloat:
> + return QualType();
> + }
> +
> + llvm_unreachable("Unhandled TargetInfo::RealType value");
> +}
> +
> void ASTContext::setManglingNumber(const NamedDecl *ND, unsigned Number) {
> if (Number > 1)
> MangleNumbers[ND] = Number;
>
> Modified: cfe/trunk/lib/Basic/TargetInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/TargetInfo.cpp?rev=190044&r1=190043&r2=190044&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Basic/TargetInfo.cpp (original)
> +++ cfe/trunk/lib/Basic/TargetInfo.cpp Thu Sep 5 06:23:21 2013
> @@ -102,6 +102,8 @@ TargetInfo::~TargetInfo() {}
> const char *TargetInfo::getTypeName(IntType T) {
> switch (T) {
> default: llvm_unreachable("not an integer!");
> + case SignedChar: return "char";
> + case UnsignedChar: return "unsigned char";
> case SignedShort: return "short";
> case UnsignedShort: return "unsigned short";
> case SignedInt: return "int";
> @@ -118,10 +120,12 @@ const char *TargetInfo::getTypeName(IntT
> const char *TargetInfo::getTypeConstantSuffix(IntType T) {
> switch (T) {
> default: llvm_unreachable("not an integer!");
> + case SignedChar:
> case SignedShort:
> case SignedInt: return "";
> case SignedLong: return "L";
> case SignedLongLong: return "LL";
> + case UnsignedChar:
> case UnsignedShort:
> case UnsignedInt: return "U";
> case UnsignedLong: return "UL";
> @@ -134,6 +138,8 @@ const char *TargetInfo::getTypeConstantS
> unsigned TargetInfo::getTypeWidth(IntType T) const {
> switch (T) {
> default: llvm_unreachable("not an integer!");
> + case SignedChar:
> + case UnsignedChar: return getCharWidth();
> case SignedShort:
> case UnsignedShort: return getShortWidth();
> case SignedInt:
> @@ -145,11 +151,48 @@ unsigned TargetInfo::getTypeWidth(IntTyp
> };
> }
>
> +TargetInfo::IntType TargetInfo::getIntTypeByWidth(
> + unsigned BitWidth, bool IsSigned) const {
> + if (getCharWidth() == BitWidth)
> + return IsSigned ? SignedChar : UnsignedChar;
> + if (getShortWidth() == BitWidth)
> + return IsSigned ? SignedShort : UnsignedShort;
> + if (getIntWidth() == BitWidth)
> + return IsSigned ? SignedInt : UnsignedInt;
> + if (getLongWidth() == BitWidth)
> + return IsSigned ? SignedLong : UnsignedLong;
> + if (getLongLongWidth() == BitWidth)
> + return IsSigned ? SignedLongLong : UnsignedLongLong;
> + return NoInt;
> +}
> +
> +TargetInfo::RealType TargetInfo::getRealTypeByWidth(unsigned BitWidth)
> const {
> + if (getFloatWidth() == BitWidth)
> + return Float;
> + if (getDoubleWidth() == BitWidth)
> + return Double;
> +
> + switch (BitWidth) {
> + case 96:
> + if (&getLongDoubleFormat() == &llvm::APFloat::x87DoubleExtended)
> + return LongDouble;
> + break;
> + case 128:
> + if (&getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble)
> + return LongDouble;
>
You probably need to check for IEEEquad here as well.
I won't ask you to revert this, since the patch is correct otherwise, but
in the future, please don't commit patches while they are in the middle of
being reviewed.
-Eli
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130905/dc0975de/attachment.html>
More information about the cfe-commits
mailing list