Temporarily relax a check in the debug info verifier.
authorAdrian Prantl <aprantl@apple.com>
Wed, 29 Apr 2015 16:52:17 +0000 (16:52 +0000)
committerAdrian Prantl <aprantl@apple.com>
Wed, 29 Apr 2015 16:52:17 +0000 (16:52 +0000)
The clang frontend helps out GDB by emitting the members of local anonymous
unions as artificial local variables with shared storage. When SROA splits
the storage for artificial local variables that are smaller than the entire
union, the overhang piece will be outside of the allotted space for the
variable and this check fails.

rdar://problem/20730771

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

lib/IR/Verifier.cpp

index 3ccc48e3ffd298e5fcfd326c82d38c447821831e..1e1c4942576ca041e2d721a0cadd1cd66443ea1e 100644 (file)
@@ -3478,6 +3478,15 @@ void Verifier::verifyBitPieceExpression(const DbgInfoIntrinsic &I,
   if (!E->isBitPiece())
     return;
 
+  // The frontend helps out GDB by emitting the members of local anonymous
+  // unions as artificial local variables with shared storage. When SROA splits
+  // the storage for artificial local variables that are smaller than the entire
+  // union, the overhang piece will be outside of the allotted space for the
+  // variable and this check fails.
+  // FIXME: Remove this check as soon as clang stops doing this; it hides bugs.
+  if (V->isArtificial())
+    return;
+
   // If there's no size, the type is broken, but that should be checked
   // elsewhere.
   uint64_t VarSize = getVariableSize(*V, TypeRefs);