Index: include/lldb/Expression/ClangASTSource.h =================================================================== --- include/lldb/Expression/ClangASTSource.h +++ include/lldb/Expression/ClangASTSource.h @@ -11,6 +11,7 @@ #define liblldb_ClangASTSource_h_ #include +#include #include "clang/Basic/IdentifierTable.h" #include "lldb/Symbol/ClangExternalASTSourceCommon.h" @@ -20,6 +21,12 @@ #include "llvm/ADT/SmallSet.h" +namespace clang +{ +class CharUnits; +class FieldDecl; +} + namespace lldb_private { //---------------------------------------------------------------------- @@ -122,7 +129,10 @@ FindExternalLexicalDecls (const clang::DeclContext *DC, bool (*isKindWeWant)(clang::Decl::Kind), llvm::SmallVectorImpl &Decls); - + + typedef std::vector> FieldOffsetList; + typedef std::vector> BaseOffsetList; + //------------------------------------------------------------------ /// Specify the layout of the contents of a RecordDecl. /// @@ -155,15 +165,11 @@ /// /// @return /// True <=> the layout is valid. - //----------------------------------------------------------------- - bool - layoutRecordType(const clang::RecordDecl *Record, - uint64_t &Size, - uint64_t &Alignment, - llvm::DenseMap &FieldOffsets, - llvm::DenseMap &BaseOffsets, - llvm::DenseMap &VirtualBaseOffsets); - + //----------------------------------------------------------------- + bool layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, + FieldOffsetList &FieldOffsets, BaseOffsetList &BaseOffsets, + BaseOffsetList &VirtualBaseOffsets); + //------------------------------------------------------------------ /// Complete a TagDecl. /// @@ -277,14 +283,10 @@ { return m_original.CompleteType(Class); } - - bool - layoutRecordType(const clang::RecordDecl *Record, - uint64_t &Size, - uint64_t &Alignment, - llvm::DenseMap &FieldOffsets, - llvm::DenseMap &BaseOffsets, - llvm::DenseMap &VirtualBaseOffsets) + + bool + layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, + FieldOffsetList &FieldOffsets, BaseOffsetList &BaseOffsets, BaseOffsetList &VirtualBaseOffsets) { return m_original.layoutRecordType(Record, Size, Index: include/lldb/Symbol/ClangExternalASTSourceCallbacks.h =================================================================== --- include/lldb/Symbol/ClangExternalASTSourceCallbacks.h +++ include/lldb/Symbol/ClangExternalASTSourceCallbacks.h @@ -34,13 +34,11 @@ typedef void (*CompleteTagDeclCallback)(void *baton, clang::TagDecl *); typedef void (*CompleteObjCInterfaceDeclCallback)(void *baton, clang::ObjCInterfaceDecl *); typedef void (*FindExternalVisibleDeclsByNameCallback)(void *baton, const clang::DeclContext *DC, clang::DeclarationName Name, llvm::SmallVectorImpl *results); - typedef bool (*LayoutRecordTypeCallback)(void *baton, - const clang::RecordDecl *Record, - uint64_t &Size, - uint64_t &Alignment, - llvm::DenseMap &FieldOffsets, - llvm::DenseMap &BaseOffsets, - llvm::DenseMap &VirtualBaseOffsets); + typedef bool (*LayoutRecordTypeCallback)( + void *baton, const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets); ClangExternalASTSourceCallbacks (CompleteTagDeclCallback tag_decl_callback, CompleteObjCInterfaceDeclCallback objc_decl_callback, @@ -121,14 +119,11 @@ virtual void CompleteType (clang::ObjCInterfaceDecl *objc_decl); - - bool - layoutRecordType(const clang::RecordDecl *Record, - uint64_t &Size, - uint64_t &Alignment, - llvm::DenseMap &FieldOffsets, - llvm::DenseMap &BaseOffsets, - llvm::DenseMap &VirtualBaseOffsets); + + bool layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets); void SetExternalSourceCallbacks (CompleteTagDeclCallback tag_decl_callback, CompleteObjCInterfaceDeclCallback objc_decl_callback, Index: source/Expression/ClangASTSource.cpp =================================================================== --- source/Expression/ClangASTSource.cpp +++ source/Expression/ClangASTSource.cpp @@ -1532,46 +1532,37 @@ while(0); } -typedef llvm::DenseMap FieldOffsetMap; -typedef llvm::DenseMap BaseOffsetMap; - template static bool -ImportOffsetMap (llvm::DenseMap &destination_map, - llvm::DenseMap &source_map, - ClangASTImporter *importer, +ImportOffsetList(std::vector> &destination_list, + const std::vector> &source_list, ClangASTImporter *importer, ASTContext &dest_ctx) { - typedef llvm::DenseMap MapType; + typedef std::vector> ListType; - for (typename MapType::iterator fi = source_map.begin(), fe = source_map.end(); - fi != fe; - ++fi) + for (const auto &fi : source_list) { - DeclFromUser user_decl(const_cast(fi->first)); + DeclFromUser user_decl(const_cast(fi.first)); DeclFromParser parser_decl(user_decl.Import(importer, dest_ctx)); if (parser_decl.IsInvalid()) return false; - destination_map.insert(std::pair(parser_decl.decl, fi->second)); + destination_list.push_back(std::pair(parser_decl.decl, fi.second)); } return true; } -template bool ExtractBaseOffsets (const ASTRecordLayout &record_layout, - DeclFromUser &record, - BaseOffsetMap &base_offsets) +template +bool +ExtractBaseOffsets(const ASTRecordLayout &record_layout, DeclFromUser &record, + ClangASTSource::BaseOffsetList &base_offsets) { - for (CXXRecordDecl::base_class_const_iterator - bi = (IsVirtual ? record->vbases_begin() : record->bases_begin()), - be = (IsVirtual ? record->vbases_end() : record->bases_end()); - bi != be; - ++bi) + for (const auto &base : (IsVirtual ? record->vbases() : record->bases())) { - if (!IsVirtual && bi->isVirtual()) + if (!IsVirtual && base.isVirtual()) continue; - const clang::Type *origin_base_type = bi->getType().getTypePtr(); + const clang::Type *origin_base_type = base.getType().getTypePtr(); const clang::RecordType *origin_base_record_type = origin_base_type->getAs(); if (!origin_base_record_type) @@ -1594,19 +1585,16 @@ else base_offset = record_layout.getBaseClassOffset(origin_base_cxx_record.decl); - base_offsets.insert(std::pair(origin_base_cxx_record.decl, base_offset)); + base_offsets.push_back(std::make_pair(origin_base_cxx_record.decl, base_offset)); } return true; } bool -ClangASTSource::layoutRecordType(const RecordDecl *record, - uint64_t &size, - uint64_t &alignment, - FieldOffsetMap &field_offsets, - BaseOffsetMap &base_offsets, - BaseOffsetMap &virtual_base_offsets) +ClangASTSource::layoutRecordType(const RecordDecl *record, uint64_t &size, uint64_t &alignment, + FieldOffsetList &field_offsets, BaseOffsetList &base_offsets, + BaseOffsetList &virtual_base_offsets) { ClangASTMetrics::RegisterRecordLayout(); @@ -1627,9 +1615,9 @@ if (origin_record.IsInvalid()) return false; - FieldOffsetMap origin_field_offsets; - BaseOffsetMap origin_base_offsets; - BaseOffsetMap origin_virtual_base_offsets; + FieldOffsetList origin_field_offsets; + BaseOffsetList origin_base_offsets; + BaseOffsetList origin_virtual_base_offsets; ClangASTContext::GetCompleteDecl(&origin_record->getASTContext(), const_cast(origin_record.decl)); @@ -1640,16 +1628,15 @@ int field_idx = 0, field_count = record_layout.getFieldCount(); - for (RecordDecl::field_iterator fi = origin_record->field_begin(), fe = origin_record->field_end(); - fi != fe; - ++fi) + origin_field_offsets.reserve(field_count); + for (const auto &field : origin_record->fields()) { if (field_idx >= field_count) return false; // Layout didn't go well. Bail out. uint64_t field_offset = record_layout.getFieldOffset(field_idx); - origin_field_offsets.insert(std::pair(*fi, field_offset)); + origin_field_offsets.push_back(std::pair(field, field_offset)); field_idx++; } @@ -1665,9 +1652,9 @@ return false; } - if (!ImportOffsetMap(field_offsets, origin_field_offsets, m_ast_importer, parser_ast_context) || - !ImportOffsetMap(base_offsets, origin_base_offsets, m_ast_importer, parser_ast_context) || - !ImportOffsetMap(virtual_base_offsets, origin_virtual_base_offsets, m_ast_importer, parser_ast_context)) + if (!ImportOffsetList(field_offsets, origin_field_offsets, m_ast_importer, parser_ast_context) || + !ImportOffsetList(base_offsets, origin_base_offsets, m_ast_importer, parser_ast_context) || + !ImportOffsetList(virtual_base_offsets, origin_virtual_base_offsets, m_ast_importer, parser_ast_context)) return false; size = record_layout.getSize().getQuantity() * m_ast_context->getCharWidth(); @@ -1685,9 +1672,10 @@ fi != fe; ++fi) { - log->Printf("LRT[%u] (FieldDecl*)%p, Name = '%s', Offset = %" PRId64 " bits", - current_id, static_cast(*fi), - fi->getNameAsString().c_str(), field_offsets[*fi]); + + log->Printf("LRT[%u] (FieldDecl*)%p, Name = '%s', Offset = %" PRId64 " bits", current_id, + static_cast(*fi), fi->getNameAsString().c_str(), + record_layout.getFieldOffset(fi->getFieldIndex())); } DeclFromParser parser_cxx_record = DynCast(parser_record); if (parser_cxx_record.IsValid()) @@ -1704,13 +1692,11 @@ DeclFromParser base_record(base_record_type->getDecl()); DeclFromParser base_cxx_record = DynCast(base_record); - log->Printf("LRT[%u] %s(CXXRecordDecl*)%p, Name = '%s', Offset = %" PRId64 " chars", - current_id, (is_virtual ? "Virtual " : ""), - static_cast(base_cxx_record.decl), - base_cxx_record.decl->getNameAsString().c_str(), - (is_virtual - ? virtual_base_offsets[base_cxx_record.decl].getQuantity() - : base_offsets[base_cxx_record.decl].getQuantity())); + clang::CharUnits base_offset = is_virtual ? record_layout.getVBaseClassOffset(base_cxx_record.decl) + : record_layout.getBaseClassOffset(base_cxx_record.decl); + log->Printf("LRT[%u] %s(CXXRecordDecl*)%p, Name = '%s', Offset = %" PRId64 " chars", current_id, + (is_virtual ? "Virtual " : ""), static_cast(base_cxx_record.decl), + base_cxx_record.decl->getNameAsString().c_str(), base_offset); } } else Index: source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp =================================================================== --- source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp +++ source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCDeclVendor.cpp @@ -141,12 +141,10 @@ } bool - layoutRecordType(const clang::RecordDecl *Record, - uint64_t &Size, - uint64_t &Alignment, - llvm::DenseMap &FieldOffsets, - llvm::DenseMap &BaseOffsets, - llvm::DenseMap &VirtualBaseOffsets) + layoutRecordType(const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets) { return false; } Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.h @@ -151,22 +151,16 @@ clang::DeclarationName Name, llvm::SmallVectorImpl *results); - static bool - LayoutRecordType (void *baton, - const clang::RecordDecl *record_decl, - uint64_t &size, - uint64_t &alignment, - llvm::DenseMap &field_offsets, - llvm::DenseMap &base_offsets, - llvm::DenseMap &vbase_offsets); - - bool - LayoutRecordType (const clang::RecordDecl *record_decl, - uint64_t &size, - uint64_t &alignment, - llvm::DenseMap &field_offsets, - llvm::DenseMap &base_offsets, - llvm::DenseMap &vbase_offsets); + static bool + LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets); + + bool LayoutRecordType(const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets); struct LayoutInfo { @@ -180,9 +174,9 @@ } uint64_t bit_size; uint64_t alignment; - llvm::DenseMap field_offsets; - llvm::DenseMap base_offsets; - llvm::DenseMap vbase_offsets; + std::vector> field_offsets; + std::vector> base_offsets; + std::vector> vbase_offsets; }; //------------------------------------------------------------------ // PluginInterface protocol Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -2073,8 +2073,9 @@ GetClangASTContext().GetBuiltinTypeForEncodingAndBitSize(eEncodingSint, word_width), accessibility, anon_field_info.bit_size); - - layout_info.field_offsets.insert(std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset)); + + layout_info.field_offsets.push_back( + std::make_pair(unnamed_bitfield_decl, anon_field_info.bit_offset)); } } last_field_info = this_field_info; @@ -2124,9 +2125,8 @@ bit_size); GetClangASTContext().SetMetadataAsUserID (field_decl, MakeUserID(die->GetOffset())); - - layout_info.field_offsets.insert(std::make_pair(field_decl, field_bit_offset)); + layout_info.field_offsets.push_back(std::make_pair(field_decl, field_bit_offset)); } else { @@ -2287,8 +2287,9 @@ } else { - layout_info.base_offsets.insert(std::make_pair(base_class_clang_type.GetAsCXXRecordDecl(), - clang::CharUnits::fromQuantity(member_byte_offset))); + layout_info.base_offsets.push_back( + std::make_pair(base_class_clang_type.GetAsCXXRecordDecl(), + clang::CharUnits::fromQuantity(member_byte_offset))); } } } @@ -2669,43 +2670,36 @@ static_cast(layout_info.base_offsets.size()), static_cast(layout_info.vbase_offsets.size())); - uint32_t idx; - { - llvm::DenseMap ::const_iterator pos, end = layout_info.field_offsets.end(); - for (idx = 0, pos = layout_info.field_offsets.begin(); pos != end; ++pos, ++idx) + for (const auto &entry : layout_info.field_offsets) { - GetObjectFile()->GetModule()->LogMessage (log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = { bit_offset=%u, name='%s' }", - static_cast(clang_type.GetOpaqueQualType()), - idx, - static_cast(pos->second), - pos->first->getNameAsString().c_str()); - } + GetObjectFile()->GetModule()->LogMessage( + log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) field[%u] = " + "{ bit_offset=%u, name='%s' }", + static_cast(clang_type.GetOpaqueQualType()), entry.first->getFieldIndex(), + static_cast(entry.second), entry.first->getNameAsString().c_str()); } + uint32_t idx = 0; + for (const auto &entry : layout_info.base_offsets) { - llvm::DenseMap ::const_iterator base_pos, base_end = layout_info.base_offsets.end(); - for (idx = 0, base_pos = layout_info.base_offsets.begin(); base_pos != base_end; ++base_pos, ++idx) - { - GetObjectFile()->GetModule()->LogMessage (log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { byte_offset=%u, name='%s' }", - clang_type.GetOpaqueQualType(), - idx, - (uint32_t)base_pos->second.getQuantity(), - base_pos->first->getNameAsString().c_str()); + GetObjectFile()->GetModule()->LogMessage( + log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) base[%u] = { " + "byte_offset=%u, name='%s' }", + clang_type.GetOpaqueQualType(), idx, (uint32_t)entry.second.getQuantity(), + entry.first->getNameAsString().c_str()); + ++idx; } - } - { - llvm::DenseMap ::const_iterator vbase_pos, vbase_end = layout_info.vbase_offsets.end(); - for (idx = 0, vbase_pos = layout_info.vbase_offsets.begin(); vbase_pos != vbase_end; ++vbase_pos, ++idx) + + idx = 0; + for (const auto &entry : layout_info.vbase_offsets) { - GetObjectFile()->GetModule()->LogMessage (log, - "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = { byte_offset=%u, name='%s' }", - static_cast(clang_type.GetOpaqueQualType()), - idx, - static_cast(vbase_pos->second.getQuantity()), - vbase_pos->first->getNameAsString().c_str()); - } + GetObjectFile()->GetModule()->LogMessage( + log, "SymbolFileDWARF::ResolveClangOpaqueTypeDefinition (clang_type = %p) vbase[%u] = " + "{ byte_offset=%u, name='%s' }", + static_cast(clang_type.GetOpaqueQualType()), idx, + static_cast(entry.second.getQuantity()), + entry.first->getNameAsString().c_str()); + ++idx; } } m_record_decl_to_layout_map.insert(std::make_pair(record_decl, layout_info)); @@ -7918,27 +7912,22 @@ } } -bool -SymbolFileDWARF::LayoutRecordType (void *baton, - const clang::RecordDecl *record_decl, - uint64_t &size, - uint64_t &alignment, - llvm::DenseMap &field_offsets, - llvm::DenseMap &base_offsets, - llvm::DenseMap &vbase_offsets) +bool +SymbolFileDWARF::LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, + uint64_t &alignment, + std::vector> &field_offsets, + std::vector> &base_offsets, + std::vector> &vbase_offsets) { SymbolFileDWARF *symbol_file_dwarf = (SymbolFileDWARF *)baton; return symbol_file_dwarf->LayoutRecordType (record_decl, size, alignment, field_offsets, base_offsets, vbase_offsets); } - -bool -SymbolFileDWARF::LayoutRecordType (const clang::RecordDecl *record_decl, - uint64_t &bit_size, - uint64_t &alignment, - llvm::DenseMap &field_offsets, - llvm::DenseMap &base_offsets, - llvm::DenseMap &vbase_offsets) +bool +SymbolFileDWARF::LayoutRecordType(const clang::RecordDecl *record_decl, uint64_t &bit_size, uint64_t &alignment, + std::vector> &field_offsets, + std::vector> &base_offsets, + std::vector> &vbase_offsets) { Log *log (LogChannelDWARF::GetLogIfAll(DWARF_LOG_DEBUG_INFO)); RecordDeclToLayoutMap::iterator pos = m_record_decl_to_layout_map.find (record_decl); Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.h @@ -102,16 +102,12 @@ static void CompleteObjCInterfaceDecl (void *baton, clang::ObjCInterfaceDecl *); - - static bool - LayoutRecordType (void *baton, - const clang::RecordDecl *record_decl, - uint64_t &size, - uint64_t &alignment, - llvm::DenseMap &field_offsets, - llvm::DenseMap &base_offsets, - llvm::DenseMap &vbase_offsets); + static bool + LayoutRecordType(void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets); //------------------------------------------------------------------ // PluginInterface protocol Index: source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp =================================================================== --- source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp +++ source/Plugins/SymbolFile/DWARF/SymbolFileDWARFDebugMap.cpp @@ -1474,14 +1474,12 @@ } } -bool -SymbolFileDWARFDebugMap::LayoutRecordType (void *baton, - const clang::RecordDecl *record_decl, - uint64_t &size, - uint64_t &alignment, - llvm::DenseMap &field_offsets, - llvm::DenseMap &base_offsets, - llvm::DenseMap &vbase_offsets) +bool +SymbolFileDWARFDebugMap::LayoutRecordType( + void *baton, const clang::RecordDecl *record_decl, uint64_t &size, uint64_t &alignment, + std::vector> &field_offsets, + std::vector> &base_offsets, + std::vector> &vbase_offsets) { SymbolFileDWARFDebugMap *symbol_file_dwarf = (SymbolFileDWARFDebugMap *)baton; SymbolFileDWARF *oso_dwarf; Index: source/Symbol/ClangExternalASTSourceCallbacks.cpp =================================================================== --- source/Symbol/ClangExternalASTSourceCallbacks.cpp +++ source/Symbol/ClangExternalASTSourceCallbacks.cpp @@ -141,13 +141,12 @@ m_callback_objc_decl (m_callback_baton, objc_decl); } -bool -ClangExternalASTSourceCallbacks::layoutRecordType(const clang::RecordDecl *Record, - uint64_t &Size, - uint64_t &Alignment, - llvm::DenseMap &FieldOffsets, - llvm::DenseMap &BaseOffsets, - llvm::DenseMap &VirtualBaseOffsets) +bool +ClangExternalASTSourceCallbacks::layoutRecordType( + const clang::RecordDecl *Record, uint64_t &Size, uint64_t &Alignment, + std::vector> &FieldOffsets, + std::vector> &BaseOffsets, + std::vector> &VirtualBaseOffsets) { if (m_callback_layout_record_type) return m_callback_layout_record_type(m_callback_baton, Index: test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py =================================================================== --- test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py +++ test/functionalities/data-formatter/data-formatter-stl/libcxx/vbool/TestDataFormatterLibcxxVBool.py @@ -20,7 +20,7 @@ self.data_formatter_commands() @skipIfLinux # No standard locations for libc++ on Linux, so skip for now - @skipIfWindows # http://llvm.org/pr21800 + @skipIfWindows # Windows doesn't have libcxx @dwarf_test def test_with_dwarf_and_run_command(self): """Test data formatter commands.""" Index: test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py =================================================================== --- test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py +++ test/functionalities/data-formatter/data-formatter-stl/libstdcpp/vbool/TestDataFormatterStdVBool.py @@ -22,7 +22,6 @@ @expectedFailureFreeBSD("llvm.org/pr20548") # fails to build on lab.llvm.org buildbot @dwarf_test - @skipIfWindows # http://llvm.org/pr21800 @skipIfDarwin def test_with_dwarf_and_run_command(self): """Test data formatter commands.""" Index: test/lang/c/bitfields/TestBitfields.py =================================================================== --- test/lang/c/bitfields/TestBitfields.py +++ test/lang/c/bitfields/TestBitfields.py @@ -26,7 +26,6 @@ self.bitfields_variable_python() @dwarf_test - @unittest2.skipIf(sys.platform.startswith("win32"), "BitFields exhibit crashes in record layout on Windows (http://llvm.org/pr21800)") def test_with_dwarf_and_run_command(self): """Test 'frame variable ...' on a variable with bitfields.""" self.buildDwarf() @@ -34,7 +33,6 @@ @python_api_test @dwarf_test - @unittest2.skipIf(sys.platform.startswith("win32"), "BitFields exhibit crashes in record layout on Windows (http://llvm.org/pr21800)") @expectedFailureGcc # GCC (4.6/4.7) generates incorrect code with unnamed bitfields. def test_with_dwarf_and_python_api(self): """Use Python APIs to inspect a bitfields variable."""