]> granicus.if.org Git - clang/commitdiff
IRgen: Add checking that the LLVM and AST record layout offsets agree (for
authorDaniel Dunbar <daniel@zuster.org>
Wed, 21 Apr 2010 19:10:49 +0000 (19:10 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 21 Apr 2010 19:10:49 +0000 (19:10 +0000)
non-bit-fields).

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@102014 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGRecordLayoutBuilder.cpp

index 89b62bfa5a84188f999ca4e967c7af4ebedbd21b..fe28495e5da6a4ddd52560940562349eb4846cd3 100644 (file)
@@ -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;
 }