r190044 - Add new methods for TargetInfo:

Stepan Dyatkovskiy stpworld at narod.ru
Fri Sep 6 02:53:58 PDT 2013


Eli OK.

You mean this one:
    case 128:
-    if (&getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble)
+    if (&getLongDoubleFormat() == &llvm::APFloat::PPCDoubleDouble ||
+        &getLongDoubleFormat() == &llvm::APFloat::IEEEquad)
        return LongDouble;
      break;
    }
If yes - can I fix it?

Eli Friedman wrote:
> On Thu, Sep 5, 2013 at 4:23 AM, Stepan Dyatkovskiy <stpworld at narod.ru
> <mailto: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




More information about the cfe-commits mailing list