diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2012-03-30 03:55:31 +0000 |
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2012-03-30 03:55:31 +0000 |
| commit | a154dd5b33dc1e8b7d2c09e88dbba39486c26271 (patch) | |
| tree | 48a651b851ec2112f969626c84744588f6254f3a /clang/lib/CodeGen/CGExprConstant.cpp | |
| parent | 356e17ce69b41905d9f9b2ce22d22dbde38e4022 (diff) | |
| download | bcm5719-llvm-a154dd5b33dc1e8b7d2c09e88dbba39486c26271.tar.gz bcm5719-llvm-a154dd5b33dc1e8b7d2c09e88dbba39486c26271.zip | |
ConstStructBuilder: fix offset math for base classes so it works correctly in general. Found by inspection.
llvm-svn: 153720
Diffstat (limited to 'clang/lib/CodeGen/CGExprConstant.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGExprConstant.cpp | 10 |
1 files changed, 3 insertions, 7 deletions
diff --git a/clang/lib/CodeGen/CGExprConstant.cpp b/clang/lib/CodeGen/CGExprConstant.cpp index fb019f4d00a..60cb4c5c23a 100644 --- a/clang/lib/CodeGen/CGExprConstant.cpp +++ b/clang/lib/CodeGen/CGExprConstant.cpp @@ -469,21 +469,17 @@ void ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD, for (unsigned I = 0, N = Bases.size(); I != N; ++I) { BaseInfo &Base = Bases[I]; - // Build the base class subobject at the appropriately-offset location - // within this object. - NextFieldOffsetInChars -= Base.Offset; bool IsPrimaryBase = Layout.getPrimaryBase() == Base.Decl; Build(Val.getStructBase(Base.Index), Base.Decl, IsPrimaryBase, VTable, VTableClass, Offset + Base.Offset); - - NextFieldOffsetInChars += Base.Offset; } } unsigned FieldNo = 0; const FieldDecl *LastFD = 0; bool IsMsStruct = RD->hasAttr<MsStructAttr>(); + uint64_t OffsetBits = CGM.getContext().toBits(Offset); for (RecordDecl::field_iterator Field = RD->field_begin(), FieldEnd = RD->field_end(); Field != FieldEnd; ++Field, ++FieldNo) { @@ -516,10 +512,10 @@ void ConstStructBuilder::Build(const APValue &Val, const RecordDecl *RD, if (!Field->isBitField()) { // Handle non-bitfield members. - AppendField(*Field, Layout.getFieldOffset(FieldNo), EltInit); + AppendField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits, EltInit); } else { // Otherwise we have a bitfield. - AppendBitField(*Field, Layout.getFieldOffset(FieldNo), + AppendBitField(*Field, Layout.getFieldOffset(FieldNo) + OffsetBits, cast<llvm::ConstantInt>(EltInit)); } } |

