Pull in r157212 from upstream clang trunk:

Revert r115805. An array type is required to have a range type,
  however, the range can be unknown for the upper bound.

  Testcase to follow.

  Part of rdar://11457152

This should fix ctfconvert producing error messages during kernel
builds, similar to:

  ERROR: scsi_all.c: die 24561: failed to retrieve array bounds

These were caused by incorrect debug information for flexible array
members of structs.

MFC after:	3 days
This commit is contained in:
Dimitry Andric 2012-05-27 13:33:54 +00:00
parent 8f62d384b9
commit 1cbbf59138

View File

@ -1479,25 +1479,21 @@ llvm::DIType CGDebugInfo::CreateType(const ArrayType *Ty,
// obvious/recursive way?
SmallVector<llvm::Value *, 8> Subscripts;
QualType EltTy(Ty, 0);
if (Ty->isIncompleteArrayType())
while ((Ty = dyn_cast<ArrayType>(EltTy))) {
int64_t UpperBound = 0;
int64_t LowerBound = 0;
if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) {
if (CAT->getSize().getZExtValue())
UpperBound = CAT->getSize().getZExtValue() - 1;
} else
// This is an unbounded array. Use Low = 1, Hi = 0 to express such
// arrays.
LowerBound = 1;
// FIXME: Verify this is right for VLAs.
Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound,
UpperBound));
EltTy = Ty->getElementType();
else {
while ((Ty = dyn_cast<ArrayType>(EltTy))) {
int64_t UpperBound = 0;
int64_t LowerBound = 0;
if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(Ty)) {
if (CAT->getSize().getZExtValue())
UpperBound = CAT->getSize().getZExtValue() - 1;
} else
// This is an unbounded array. Use Low = 1, Hi = 0 to express such
// arrays.
LowerBound = 1;
// FIXME: Verify this is right for VLAs.
Subscripts.push_back(DBuilder.getOrCreateSubrange(LowerBound,
UpperBound));
EltTy = Ty->getElementType();
}
}
llvm::DIArray SubscriptArray = DBuilder.getOrCreateArray(Subscripts);