diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2012-02-29 16:28:29 +0000 | 
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2012-02-29 16:28:29 +0000 | 
| commit | c2f9dc91c1722d04ce0b0e695bb89820c7bf995d (patch) | |
| tree | 641546b4110110e4ef76c33be8001eb992bffac3 /clang/lib | |
| parent | 40d7a8acfff6c2931a37868f97a70977b3514e06 (diff) | |
| download | bcm5719-llvm-c2f9dc91c1722d04ce0b0e695bb89820c7bf995d.tar.gz bcm5719-llvm-c2f9dc91c1722d04ce0b0e695bb89820c7bf995d.zip | |
Revert r151702, "Add support for handling captured variables in lambda debug
info.", which broke some -O0 -g tests.
llvm-svn: 151730
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/CodeGen/CGDebugInfo.cpp | 91 | 
1 files changed, 30 insertions, 61 deletions
| diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index b381917d7b6..1d27c191336 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -749,75 +749,44 @@ CollectRecordFields(const RecordDecl *record, llvm::DIFile tunit,                      SmallVectorImpl<llvm::Value *> &elements,                      llvm::DIType RecordTy) {    unsigned fieldNo = 0; +  const FieldDecl *LastFD = 0; +  bool IsMsStruct = record->hasAttr<MsStructAttr>(); +      const ASTRecordLayout &layout = CGM.getContext().getASTRecordLayout(record); -  const CXXRecordDecl *CXXDecl = dyn_cast<CXXRecordDecl>(record); - -  // For C++11 Lambdas a Fields will be the same as a Capture, but the Capture -  // has the name and the location of the variable so we should iterate over -  // both concurrently. -  if (CXXDecl && CXXDecl->isLambda()) { -    RecordDecl::field_iterator Field = CXXDecl->field_begin(); -    unsigned fieldno = 0; -    for (CXXRecordDecl::capture_const_iterator I = CXXDecl->captures_begin(), -           E = CXXDecl->captures_end(); I != E; ++I, ++Field, ++fieldno) { -      const LambdaExpr::Capture C = *I; -      // TODO: Need to handle 'this' in some way by probably renaming the -      // this of the lambda class and having a field member of 'this'. -      if (C.capturesVariable()) { -        VarDecl *V = C.getCapturedVar(); -        llvm::DIFile VUnit = getOrCreateFile(C.getLocation()); -        StringRef VName = V->getName(); -        uint64_t SizeInBitsOverride = 0; -        if (Field->isBitField()) { -          SizeInBitsOverride = Field->getBitWidthValue(CGM.getContext()); -          assert(SizeInBitsOverride && "found named 0-width bitfield"); -        } -        llvm::DIType fieldType -          = createFieldType(VName, Field->getType(), SizeInBitsOverride, C.getLocation(), -                            Field->getAccess(), layout.getFieldOffset(fieldno), -                            VUnit, RecordTy); -        elements.push_back(fieldType); +  for (RecordDecl::field_iterator I = record->field_begin(), +                                  E = record->field_end(); +       I != E; ++I, ++fieldNo) { +    FieldDecl *field = *I; +    if (IsMsStruct) { +      // Zero-length bitfields following non-bitfield members are ignored +      if (CGM.getContext().ZeroBitfieldFollowsNonBitfield((field), LastFD)) { +        --fieldNo; +        continue;        } +      LastFD = field;      } -  } else { -    bool IsMsStruct = record->hasAttr<MsStructAttr>(); -    for (RecordDecl::field_iterator I = record->field_begin(), -           E = record->field_end(); -         I != E; ++I, ++fieldNo) { -      FieldDecl *field = *I; -      const FieldDecl *LastFD = 0; - -      if (IsMsStruct) { -        // Zero-length bitfields following non-bitfield members are ignored -        if (CGM.getContext().ZeroBitfieldFollowsNonBitfield((field), LastFD)) { -          --fieldNo; -          continue; -        } -        LastFD = field; -      } -      StringRef name = field->getName(); -      QualType type = field->getType(); +    StringRef name = field->getName(); +    QualType type = field->getType(); -      // Ignore unnamed fields unless they're anonymous structs/unions. -      if (name.empty() && !type->isRecordType()) { -        LastFD = field; -        continue; -      } +    // Ignore unnamed fields unless they're anonymous structs/unions. +    if (name.empty() && !type->isRecordType()) { +      LastFD = field; +      continue; +    } -      uint64_t SizeInBitsOverride = 0; -      if (field->isBitField()) { -        SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); -        assert(SizeInBitsOverride && "found named 0-width bitfield"); -      } +    uint64_t SizeInBitsOverride = 0; +    if (field->isBitField()) { +      SizeInBitsOverride = field->getBitWidthValue(CGM.getContext()); +      assert(SizeInBitsOverride && "found named 0-width bitfield"); +    } -      llvm::DIType fieldType -        = createFieldType(name, type, SizeInBitsOverride, -                          field->getLocation(), field->getAccess(), -                          layout.getFieldOffset(fieldNo), tunit, RecordTy); +    llvm::DIType fieldType +      = createFieldType(name, type, SizeInBitsOverride, +                        field->getLocation(), field->getAccess(), +                        layout.getFieldOffset(fieldNo), tunit, RecordTy); -      elements.push_back(fieldType); -    } +    elements.push_back(fieldType);    }  } | 

