r264529 - Improve the representation of CXXUuidofExpr

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Sun Mar 27 20:25:36 PDT 2016


Good call, fixed in r264562.

On Sun, Mar 27, 2016 at 12:29 AM, Richard Smith <richard at metafoo.co.uk>
wrote:

> On Sat, Mar 26, 2016 at 9:46 PM, David Majnemer via cfe-commits
> <cfe-commits at lists.llvm.org> wrote:
> > Author: majnemer
> > Date: Sat Mar 26 23:46:07 2016
> > New Revision: 264529
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=264529&view=rev
> > Log:
> > Improve the representation of CXXUuidofExpr
> >
> > Keep a pointer to the UuidAttr that the CXXUuidofExpr corresponds to.
> > This makes translating from __uuidof to the underlying constant a lot
> > more straightforward.
> >
> > Modified:
> >     cfe/trunk/include/clang/AST/ExprCXX.h
> >     cfe/trunk/lib/AST/ExprCXX.cpp
> >     cfe/trunk/lib/AST/MicrosoftMangle.cpp
> >     cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> >     cfe/trunk/lib/Sema/SemaExprCXX.cpp
> >
> > Modified: cfe/trunk/include/clang/AST/ExprCXX.h
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=264529&r1=264528&r2=264529&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/include/clang/AST/ExprCXX.h (original)
> > +++ cfe/trunk/include/clang/AST/ExprCXX.h Sat Mar 26 23:46:07 2016
> > @@ -778,22 +778,23 @@ public:
> >  class CXXUuidofExpr : public Expr {
> >  private:
> >    llvm::PointerUnion<Stmt *, TypeSourceInfo *> Operand;
> > +  const UuidAttr *UA;
> >    SourceRange Range;
>
> Looks like the serialization / deserialization code for this new
> member is missing? Does this correctly round-trip through AST files?
>
> >  public:
> > -  CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, SourceRange R)
> > -    : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
> > -           false, Operand->getType()->isDependentType(),
> > -           Operand->getType()->isInstantiationDependentType(),
> > -           Operand->getType()->containsUnexpandedParameterPack()),
> > -      Operand(Operand), Range(R) { }
> > -
> > -  CXXUuidofExpr(QualType Ty, Expr *Operand, SourceRange R)
> > -    : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary,
> > -           false, Operand->isTypeDependent(),
> > -           Operand->isInstantiationDependent(),
> > -           Operand->containsUnexpandedParameterPack()),
> > -      Operand(Operand), Range(R) { }
> > +  CXXUuidofExpr(QualType Ty, TypeSourceInfo *Operand, const UuidAttr
> *UA,
> > +                SourceRange R)
> > +      : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false,
> > +             Operand->getType()->isDependentType(),
> > +             Operand->getType()->isInstantiationDependentType(),
> > +             Operand->getType()->containsUnexpandedParameterPack()),
> > +        Operand(Operand), UA(UA), Range(R) {}
> > +
> > +  CXXUuidofExpr(QualType Ty, Expr *Operand, const UuidAttr *UA,
> SourceRange R)
> > +      : Expr(CXXUuidofExprClass, Ty, VK_LValue, OK_Ordinary, false,
> > +             Operand->isTypeDependent(),
> Operand->isInstantiationDependent(),
> > +             Operand->containsUnexpandedParameterPack()),
> > +        Operand(Operand), UA(UA), Range(R) {}
> >
> >    CXXUuidofExpr(EmptyShell Empty, bool isExpr)
> >      : Expr(CXXUuidofExprClass, Empty) {
> > @@ -830,7 +831,7 @@ public:
> >      Operand = E;
> >    }
> >
> > -  StringRef getUuidAsStringRef(ASTContext &Context) const;
> > +  StringRef getUuidAsStringRef() const;
> >
> >    SourceLocation getLocStart() const LLVM_READONLY { return
> Range.getBegin(); }
> >    SourceLocation getLocEnd() const LLVM_READONLY { return
> Range.getEnd(); }
> > @@ -841,11 +842,6 @@ public:
> >      return T->getStmtClass() == CXXUuidofExprClass;
> >    }
> >
> > -  /// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot
> resolve to
> > -  /// a single GUID.
> > -  static const UuidAttr *GetUuidAttrOfType(QualType QT,
> > -                                           bool *HasMultipleGUIDsPtr =
> nullptr);
> > -
> >    // Iterators
> >    child_range children() {
> >      if (isTypeOperand())
> >
> > Modified: cfe/trunk/lib/AST/ExprCXX.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=264529&r1=264528&r2=264529&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/AST/ExprCXX.cpp (original)
> > +++ cfe/trunk/lib/AST/ExprCXX.cpp Sat Mar 26 23:46:07 2016
> > @@ -54,77 +54,8 @@ QualType CXXUuidofExpr::getTypeOperand(A
> >        Operand.get<TypeSourceInfo *>()->getType().getNonReferenceType(),
> Quals);
> >  }
> >
> > -// static
> > -const UuidAttr *CXXUuidofExpr::GetUuidAttrOfType(QualType QT,
> > -                                                 bool
> *RDHasMultipleGUIDsPtr) {
> > -  // Optionally remove one level of pointer, reference or array
> indirection.
> > -  const Type *Ty = QT.getTypePtr();
> > -  if (QT->isPointerType() || QT->isReferenceType())
> > -    Ty = QT->getPointeeType().getTypePtr();
> > -  else if (QT->isArrayType())
> > -    Ty = Ty->getBaseElementTypeUnsafe();
> > -
> > -  const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
> > -  if (!RD)
> > -    return nullptr;
> > -
> > -  if (const UuidAttr *Uuid =
> RD->getMostRecentDecl()->getAttr<UuidAttr>())
> > -    return Uuid;
> > -
> > -  // __uuidof can grab UUIDs from template arguments.
> > -  if (const ClassTemplateSpecializationDecl *CTSD =
> > -          dyn_cast<ClassTemplateSpecializationDecl>(RD)) {
> > -    const TemplateArgumentList &TAL = CTSD->getTemplateArgs();
> > -    const UuidAttr *UuidForRD = nullptr;
> > -
> > -    for (const TemplateArgument &TA : TAL.asArray()) {
> > -      bool SeenMultipleGUIDs = false;
> > -
> > -      const UuidAttr *UuidForTA = nullptr;
> > -      if (TA.getKind() == TemplateArgument::Type)
> > -        UuidForTA = GetUuidAttrOfType(TA.getAsType(),
> &SeenMultipleGUIDs);
> > -      else if (TA.getKind() == TemplateArgument::Declaration)
> > -        UuidForTA =
> > -            GetUuidAttrOfType(TA.getAsDecl()->getType(),
> &SeenMultipleGUIDs);
> > -
> > -      // If the template argument has a UUID, there are three cases:
> > -      //  - This is the first UUID seen for this RecordDecl.
> > -      //  - This is a different UUID than previously seen for this
> RecordDecl.
> > -      //  - This is the same UUID than previously seen for this
> RecordDecl.
> > -      if (UuidForTA) {
> > -        if (!UuidForRD)
> > -          UuidForRD = UuidForTA;
> > -        else if (UuidForRD != UuidForTA)
> > -          SeenMultipleGUIDs = true;
> > -      }
> > -
> > -      // Seeing multiple UUIDs means that we couldn't find a UUID
> > -      if (SeenMultipleGUIDs) {
> > -        if (RDHasMultipleGUIDsPtr)
> > -          *RDHasMultipleGUIDsPtr = true;
> > -        return nullptr;
> > -      }
> > -    }
> > -
> > -    return UuidForRD;
> > -  }
> > -
> > -  return nullptr;
> > -}
> > -
> > -StringRef CXXUuidofExpr::getUuidAsStringRef(ASTContext &Context) const {
> > -  StringRef Uuid;
> > -  if (isTypeOperand())
> > -    Uuid =
> CXXUuidofExpr::GetUuidAttrOfType(getTypeOperand(Context))->getGuid();
> > -  else {
> > -    // Special case: __uuidof(0) means an all-zero GUID.
> > -    Expr *Op = getExprOperand();
> > -    if (!Op->isNullPointerConstant(Context,
> Expr::NPC_ValueDependentIsNull))
> > -      Uuid = CXXUuidofExpr::GetUuidAttrOfType(Op->getType())->getGuid();
> > -    else
> > -      Uuid = "00000000-0000-0000-0000-000000000000";
> > -  }
> > -  return Uuid;
> > +StringRef CXXUuidofExpr::getUuidAsStringRef() const {
> > +  return UA ? UA->getGuid() : "00000000-0000-0000-0000-000000000000";
> >  }
> >
> >  // CXXScalarValueInitExpr
> >
> > Modified: cfe/trunk/lib/AST/MicrosoftMangle.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/MicrosoftMangle.cpp?rev=264529&r1=264528&r2=264529&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/AST/MicrosoftMangle.cpp (original)
> > +++ cfe/trunk/lib/AST/MicrosoftMangle.cpp Sat Mar 26 23:46:07 2016
> > @@ -1186,7 +1186,7 @@ void MicrosoftCXXNameMangler::mangleExpr
> >
> >      // This CXXUuidofExpr is mangled as-if it were actually a VarDecl
> from
> >      // const __s_GUID _GUID_{lower case UUID with underscores}
> > -    StringRef Uuid = UE->getUuidAsStringRef(Context.getASTContext());
> > +    StringRef Uuid = UE->getUuidAsStringRef();
> >      std::string Name = "_GUID_" + Uuid.lower();
> >      std::replace(Name.begin(), Name.end(), '-', '_');
> >
> >
> > Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=264529&r1=264528&r2=264529&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
> > +++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Sat Mar 26 23:46:07 2016
> > @@ -1454,7 +1454,7 @@ ConstantAddress CodeGenModule::GetAddrOf
> >      const CXXUuidofExpr* E) {
> >    // Sema has verified that IIDSource has a __declspec(uuid()), and
> that its
> >    // well-formed.
> > -  StringRef Uuid = E->getUuidAsStringRef(Context);
> > +  StringRef Uuid = E->getUuidAsStringRef();
> >    std::string Name = "_GUID_" + Uuid.lower();
> >    std::replace(Name.begin(), Name.end(), '-', '_');
> >
> >
> > Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> > URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=264529&r1=264528&r2=264529&view=diff
> >
> ==============================================================================
> > --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> > +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Sat Mar 26 23:46:07 2016
> > @@ -508,23 +508,60 @@ Sema::ActOnCXXTypeid(SourceLocation OpLo
> >    return BuildCXXTypeId(TypeInfoType, OpLoc, (Expr*)TyOrExpr,
> RParenLoc);
> >  }
> >
> > +/// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot
> resolve to
> > +/// a single GUID.
> > +static void
> > +getUuidAttrOfType(Sema &SemaRef, QualType QT,
> > +                  llvm::SmallSetVector<const UuidAttr *, 1> &UuidAttrs)
> {
> > +  // Optionally remove one level of pointer, reference or array
> indirection.
> > +  const Type *Ty = QT.getTypePtr();
> > +  if (QT->isPointerType() || QT->isReferenceType())
> > +    Ty = QT->getPointeeType().getTypePtr();
> > +  else if (QT->isArrayType())
> > +    Ty = Ty->getBaseElementTypeUnsafe();
> > +
> > +  const auto *RD = Ty->getAsCXXRecordDecl();
> > +  if (!RD)
> > +    return;
> > +
> > +  if (const auto *Uuid = RD->getMostRecentDecl()->getAttr<UuidAttr>()) {
> > +    UuidAttrs.insert(Uuid);
> > +    return;
> > +  }
> > +
> > +  // __uuidof can grab UUIDs from template arguments.
> > +  if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(RD))
> {
> > +    const TemplateArgumentList &TAL = CTSD->getTemplateArgs();
> > +    for (const TemplateArgument &TA : TAL.asArray()) {
> > +      const UuidAttr *UuidForTA = nullptr;
> > +      if (TA.getKind() == TemplateArgument::Type)
> > +        getUuidAttrOfType(SemaRef, TA.getAsType(), UuidAttrs);
> > +      else if (TA.getKind() == TemplateArgument::Declaration)
> > +        getUuidAttrOfType(SemaRef, TA.getAsDecl()->getType(),
> UuidAttrs);
> > +
> > +      if (UuidForTA)
> > +        UuidAttrs.insert(UuidForTA);
> > +    }
> > +  }
> > +}
> > +
> >  /// \brief Build a Microsoft __uuidof expression with a type operand.
> >  ExprResult Sema::BuildCXXUuidof(QualType TypeInfoType,
> >                                  SourceLocation TypeidLoc,
> >                                  TypeSourceInfo *Operand,
> >                                  SourceLocation RParenLoc) {
> > +  const UuidAttr *UA = nullptr;
> >    if (!Operand->getType()->isDependentType()) {
> > -    bool HasMultipleGUIDs = false;
> > -    if (!CXXUuidofExpr::GetUuidAttrOfType(Operand->getType(),
> > -                                          &HasMultipleGUIDs)) {
> > -      if (HasMultipleGUIDs)
> > -        return ExprError(Diag(TypeidLoc,
> diag::err_uuidof_with_multiple_guids));
> > -      else
> > -        return ExprError(Diag(TypeidLoc,
> diag::err_uuidof_without_guid));
> > -    }
> > +    llvm::SmallSetVector<const UuidAttr *, 1> UuidAttrs;
> > +    getUuidAttrOfType(*this, Operand->getType(), UuidAttrs);
> > +    if (UuidAttrs.empty())
> > +      return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid));
> > +    if (UuidAttrs.size() > 1)
> > +      return ExprError(Diag(TypeidLoc,
> diag::err_uuidof_with_multiple_guids));
> > +    UA = UuidAttrs.back();
> >    }
> >
> > -  return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), Operand,
> > +  return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), Operand,
> UA,
> >                                       SourceRange(TypeidLoc, RParenLoc));
> >  }
> >
> > @@ -533,18 +570,20 @@ ExprResult Sema::BuildCXXUuidof(QualType
> >                                  SourceLocation TypeidLoc,
> >                                  Expr *E,
> >                                  SourceLocation RParenLoc) {
> > +  const UuidAttr *UA = nullptr;
> >    if (!E->getType()->isDependentType()) {
> > -    bool HasMultipleGUIDs = false;
> > -    if (!CXXUuidofExpr::GetUuidAttrOfType(E->getType(),
> &HasMultipleGUIDs) &&
> > -        !E->isNullPointerConstant(Context,
> Expr::NPC_ValueDependentIsNull)) {
> > -      if (HasMultipleGUIDs)
> > -        return ExprError(Diag(TypeidLoc,
> diag::err_uuidof_with_multiple_guids));
> > -      else
> > +    if (!E->isNullPointerConstant(Context,
> Expr::NPC_ValueDependentIsNull)) {
> > +      llvm::SmallSetVector<const UuidAttr *, 1> UuidAttrs;
> > +      getUuidAttrOfType(*this, E->getType(), UuidAttrs);
> > +      if (UuidAttrs.empty())
> >          return ExprError(Diag(TypeidLoc,
> diag::err_uuidof_without_guid));
> > +      if (UuidAttrs.size() > 1)
> > +        return ExprError(Diag(TypeidLoc,
> diag::err_uuidof_with_multiple_guids));
> > +      UA = UuidAttrs.back();
> >      }
> >    }
> >
> > -  return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), E,
> > +  return new (Context) CXXUuidofExpr(TypeInfoType.withConst(), E, UA,
> >                                       SourceRange(TypeidLoc, RParenLoc));
> >  }
> >
> >
> >
> > _______________________________________________
> > cfe-commits mailing list
> > cfe-commits at lists.llvm.org
> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160327/37d7bd7b/attachment-0001.html>


More information about the cfe-commits mailing list