diff options
author | Daniel Dunbar <daniel@zuster.org> | 2010-04-21 19:10:49 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2010-04-21 19:10:49 +0000 |
commit | 2ba67440b62277c6ebcd269f9bf7144ece72fee4 (patch) | |
tree | 02593eb20179ff60eb1fb62f49f1f805193becc1 /clang/lib/CodeGen/CGRecordLayoutBuilder.cpp | |
parent | 1a6e39987497d8eea51fd72f2d28241a84ab663c (diff) | |
download | bcm5719-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.cpp | 21 |
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; } |