r190044 - Add new methods for TargetInfo:

Eli Friedman eli.friedman at gmail.com
Fri Sep 6 11:24:46 PDT 2013


On Fri, Sep 6, 2013 at 2:53 AM, Stepan Dyatkovskiy <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>> 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20130906/4c3c173a/attachment.html>


More information about the cfe-commits mailing list