summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2015-10-01 22:08:02 +0000
committerZachary Turner <zturner@google.com>2015-10-01 22:08:02 +0000
commitf686a445db7c381e6cbae810f82ae9b31fa11851 (patch)
tree529e183d06baded49a325bc4bfc94e3252df7755
parentf0672f1187f5f2055e3c7e0af66b706819f421d2 (diff)
downloadbcm5719-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.cpp15
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;
}
OpenPOWER on IntegriCloud