summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2010-04-21 19:10:49 +0000
committerDaniel Dunbar <daniel@zuster.org>2010-04-21 19:10:49 +0000
commit2ba67440b62277c6ebcd269f9bf7144ece72fee4 (patch)
tree02593eb20179ff60eb1fb62f49f1f805193becc1 /clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
parent1a6e39987497d8eea51fd72f2d28241a84ab663c (diff)
downloadbcm5719-llvm-2ba67440b62277c6ebcd269f9bf7144ece72fee4.tar.gz
bcm5719-llvm-2ba67440b62277c6ebcd269f9bf7144ece72fee4.zip
IRgen: Add checking that the LLVM and AST record layout offsets agree (for
non-bit-fields). llvm-svn: 102014
Diffstat (limited to 'clang/lib/CodeGen/CGRecordLayoutBuilder.cpp')
-rw-r--r--clang/lib/CodeGen/CGRecordLayoutBuilder.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
index 89b62bfa5a8..fe28495e5da 100644
--- a/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/clang/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -20,6 +20,7 @@
#include "CodeGenTypes.h"
#include "llvm/DerivedTypes.h"
#include "llvm/Type.h"
+#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetData.h"
using namespace clang;
@@ -569,7 +570,25 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
getTargetData().getTypeAllocSize(Ty) &&
"Type size mismatch!");
- // FIXME: We should verify the individual field offsets here as well.
+ // Verify that the LLVM and AST field offsets agree.
+#ifndef NDEBUG
+ const llvm::StructType *ST =
+ dyn_cast<llvm::StructType>(RL->getLLVMType());
+ const llvm::StructLayout *SL = getTargetData().getStructLayout(ST);
+
+ const ASTRecordLayout &AST_RL = getContext().getASTRecordLayout(D);
+ RecordDecl::field_iterator it = D->field_begin();
+ for (unsigned i = 0, e = AST_RL.getFieldCount(); i != e; ++i, ++it) {
+ const FieldDecl *FD = *it;
+ if (FD->isBitField()) {
+ // FIXME: Verify assorted things.
+ } else {
+ unsigned FieldNo = RL->getLLVMFieldNo(FD);
+ assert(AST_RL.getFieldOffset(i) == SL->getElementOffsetInBits(FieldNo) &&
+ "Invalid field offset!");
+ }
+ }
+#endif
return RL;
}
OpenPOWER on IntegriCloud