diff options
author | Zachary Turner <zturner@google.com> | 2015-10-01 22:08:02 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2015-10-01 22:08:02 +0000 |
commit | f686a445db7c381e6cbae810f82ae9b31fa11851 (patch) | |
tree | 529e183d06baded49a325bc4bfc94e3252df7755 | |
parent | f0672f1187f5f2055e3c7e0af66b706819f421d2 (diff) | |
download | bcm5719-llvm-f686a445db7c381e6cbae810f82ae9b31fa11851.tar.gz bcm5719-llvm-f686a445db7c381e6cbae810f82ae9b31fa11851.zip |
Don't adjust field offsets when using external record layout.
This was already being done when injecting the VBPtr, but not
when injecting the VFPtr. This fixes a number of tests in LLDB's
test suite.
Reviewed by: David Majnemer
Differential Revision: http://reviews.llvm.org/D13276
llvm-svn: 249085
-rw-r--r-- | clang/lib/AST/RecordLayoutBuilder.cpp | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp index 630d780b764..0c76838a6d2 100644 --- a/clang/lib/AST/RecordLayoutBuilder.cpp +++ b/clang/lib/AST/RecordLayoutBuilder.cpp @@ -2667,13 +2667,20 @@ void MicrosoftRecordLayoutBuilder::injectVFPtr(const CXXRecordDecl *RD) { // alignment. CharUnits Offset = PointerInfo.Size.RoundUpToAlignment( std::max(RequiredAlignment, Alignment)); - // Increase the size of the object and push back all fields, the vbptr and all - // bases by the offset amount. + // Push back the vbptr, but increase the size of the object and push back + // regular fields by the offset only if not using external record layout. + if (HasVBPtr) + VBPtrOffset += Offset; + + if (UseExternalLayout) + return; + Size += Offset; + + // If we're using an external layout, the fields offsets have already + // accounted for this adjustment. for (uint64_t &FieldOffset : FieldOffsets) FieldOffset += Context.toBits(Offset); - if (HasVBPtr) - VBPtrOffset += Offset; for (BaseOffsetsMapTy::value_type &Base : Bases) Base.second += Offset; } |