From: Daniel Dunbar Date: Wed, 21 Apr 2010 19:10:49 +0000 (+0000) Subject: IRgen: Add checking that the LLVM and AST record layout offsets agree (for X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b2ae7ae59b11657416fc3f16e742713b4683e5e;p=clang IRgen: Add checking that the LLVM and AST record layout offsets agree (for non-bit-fields). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102014 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp index 89b62bfa5a..fe28495e5d 100644 --- a/lib/CodeGen/CGRecordLayoutBuilder.cpp +++ b/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(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; }