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