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