diff options
author | Anders Carlsson <andersca@mac.com> | 2010-04-17 20:49:27 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-04-17 20:49:27 +0000 |
commit | 86664465bac330871d4a476f68a1d6f7f6f102af (patch) | |
tree | 00326f8a580dd3d2686c9ecbf4c63fe9105c4c52 | |
parent | de9f153b2348f590151504888c22cb937134cd27 (diff) |
Factor union field layout code out into a separate function. No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@101671 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/CGRecordLayoutBuilder.cpp | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index 63e38f36ad..60ef7fe409 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp @@ -68,6 +68,11 @@ private: /// NextFieldOffsetInBytes - Holds the next field offset in bytes. uint64_t NextFieldOffsetInBytes; + /// LayoutUnionField - Will layout a field in an union and return the type + /// that the field will have. + const llvm::Type *LayoutUnionField(const FieldDecl *Field, + const ASTRecordLayout &Layout); + /// LayoutUnion - Will layout a union RecordDecl. void LayoutUnion(const RecordDecl *D); @@ -316,6 +321,28 @@ bool CGRecordLayoutBuilder::LayoutField(const FieldDecl *D, return true; } +const llvm::Type * +CGRecordLayoutBuilder::LayoutUnionField(const FieldDecl *Field, + const ASTRecordLayout &Layout) { + if (Field->isBitField()) { + uint64_t FieldSize = + Field->getBitWidth()->EvaluateAsInt(Types.getContext()).getZExtValue(); + + // Ignore zero sized bit fields. + if (FieldSize == 0) + return 0; + + // Add the bit field info. + LLVMBitFields.push_back( + LLVMBitFieldInfo(Field, ComputeBitFieldInfo(Types, Field, 0, FieldSize))); + return Types.ConvertTypeForMemRecursive(Field->getType()); + } + + // This is a regular union field. + LLVMFields.push_back(LLVMFieldInfo(Field, 0)); + return Types.ConvertTypeForMemRecursive(Field->getType()); +} + void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) { assert(D->isUnion() && "Can't call LayoutUnion on a non-union record!"); @@ -332,24 +359,10 @@ void CGRecordLayoutBuilder::LayoutUnion(const RecordDecl *D) { FieldEnd = D->field_end(); Field != FieldEnd; ++Field, ++FieldNo) { assert(Layout.getFieldOffset(FieldNo) == 0 && "Union field offset did not start at the beginning of record!"); - const llvm::Type *FieldTy = - Types.ConvertTypeForMemRecursive(Field->getType()); - - if (Field->isBitField()) { - uint64_t FieldSize = - Field->getBitWidth()->EvaluateAsInt(Types.getContext()).getZExtValue(); - - // Ignore zero sized bit fields. - if (FieldSize == 0) - continue; - - // Add the bit field info. - LLVMBitFields.push_back( - LLVMBitFieldInfo(*Field, ComputeBitFieldInfo(Types, *Field, - 0, FieldSize))); - } else { - LLVMFields.push_back(LLVMFieldInfo(*Field, 0)); - } + const llvm::Type *FieldTy = LayoutUnionField(*Field, Layout); + + if (!FieldTy) + continue; HasOnlyZeroSizedBitFields = false; |