From 14d56ef43ff4921c6749f7340212fbb743fdbb9b Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 27 Apr 2011 17:14:21 +0000 Subject: [PATCH] Some refactoring of my ms_struct patch. // rdar://8823265 related. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130311 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/ASTContext.h | 5 +++++ lib/AST/ASTContext.cpp | 7 +++++++ lib/AST/RecordLayoutBuilder.cpp | 4 +--- lib/CodeGen/CGRecordLayoutBuilder.cpp | 9 ++------- 4 files changed, 15 insertions(+), 10 deletions(-) diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h index 959e158ceb..9c3cfe73b2 100644 --- a/include/clang/AST/ASTContext.h +++ b/include/clang/AST/ASTContext.h @@ -394,6 +394,11 @@ public: FieldDecl *getInstantiatedFromUnnamedFieldDecl(FieldDecl *Field); void setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, FieldDecl *Tmpl); + + /// ZeroBitfieldFollowsNonBitfield - return 'true" if 'FD' is a zero-length + /// bitfield which follows the non-bitfield 'LastFD'. + bool ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, + const FieldDecl *LastFD) const; // Access to the set of methods overridden by the given C++ method. typedef CXXMethodVector::iterator overridden_cxx_method_iterator; diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index e49bde3487..c571c559bc 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -536,6 +536,13 @@ void ASTContext::setInstantiatedFromUnnamedFieldDecl(FieldDecl *Inst, InstantiatedFromUnnamedFieldDecl[Inst] = Tmpl; } +bool ASTContext::ZeroBitfieldFollowsNonBitfield(const FieldDecl *FD, + const FieldDecl *LastFD) const { + return (FD->isBitField() && LastFD && !LastFD->isBitField() && + FD->getBitWidth()-> EvaluateAsInt(*this).getZExtValue() == 0); + +} + ASTContext::overridden_cxx_method_iterator ASTContext::overridden_methods_begin(const CXXMethodDecl *Method) const { llvm::DenseMap::const_iterator Pos diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index c4a156fbcc..407655770d 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -1261,10 +1261,8 @@ void RecordLayoutBuilder::LayoutFields(const RecordDecl *D) { // Zero-length bitfields following non-bitfield members are // ignored: const FieldDecl *FD = (*Field); - if (FD->isBitField() && LastFD && !LastFD->isBitField() && - FD->getBitWidth()->EvaluateAsInt(Context).getZExtValue() == 0) { + if (Context.ZeroBitfieldFollowsNonBitfield(FD, LastFD)) continue; - } LastFD = FD; } LayoutField(*Field); diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index d202b6e825..3d9fd88613 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -753,10 +753,7 @@ bool CGRecordLayoutBuilder::LayoutFields(const RecordDecl *D) { // Zero-length bitfields following non-bitfield members are // ignored: const FieldDecl *FD = (*Field); - // FIXME. Refactor into common code as it is used in several places. - if (FD->isBitField() && LastFD && !LastFD->isBitField() && - FD->getBitWidth()-> - EvaluateAsInt(Types.getContext()).getZExtValue() == 0) { + if (Types.getContext().ZeroBitfieldFollowsNonBitfield(FD, LastFD)) { --FieldNo; continue; } @@ -999,9 +996,7 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) { if (IsMsStruct) { // Zero-length bitfields following non-bitfield members are // ignored: - if (FD->isBitField() && LastFD && !LastFD->isBitField() && - FD->getBitWidth()-> - EvaluateAsInt(getContext()).getZExtValue() == 0) { + if (getContext().ZeroBitfieldFollowsNonBitfield(FD, LastFD)) { --i; continue; } -- 2.50.1