r190044 - Add new methods for TargetInfo:

Stepan Dyatkovskiy stpworld at narod.ru
Mon Sep 9 05:01:29 PDT 2013


Fixed in 190294.
-Stepan.
Eli Friedman wrote:
> On Fri, Sep 6, 2013 at 2:53 AM, Stepan Dyatkovskiy <stpworld at narod.ru
> <mailto:stpworld at narod.ru>> wrote:
>
>     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?
>
>
> Yes.
>
> -Eli
>
>
>     Eli Friedman wrote:
>
>         On Thu, Sep 5, 2013 at 4:23 AM, Stepan Dyatkovskiy
>         <stpworld at narod.ru <mailto:stpworld at narod.ru>
>         <mailto: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
>         <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
>         <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
>         <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
>         <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(__ClassScopeSpecializationPatter__n);
>                }
>
>              +/// 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
>         <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