Index: lit/Modules/ELF/many-sections.s =================================================================== --- lit/Modules/ELF/many-sections.s +++ lit/Modules/ELF/many-sections.s @@ -7,7 +7,7 @@ ## aaaaaaaa..dddddddd, plus a couple of standard ones (.strtab, etc.) ## Check the number is correct plus the names of a couple of chosen sections. -# CHECK: Showing 65541 sections +# CHECK: Showing 65540 sections # CHECK: Name: aaaaaaaa # CHECK: Name: bbbbbbbb # CHECK: Name: cccccccc Index: lit/Modules/MachO/subsections.yaml =================================================================== --- lit/Modules/MachO/subsections.yaml +++ lit/Modules/MachO/subsections.yaml @@ -3,6 +3,7 @@ #CHECK: Showing 2 sections #CHECK-NEXT: Index: 0 +#CHECK-NEXT: ID: 256 #CHECK-NEXT: Name: __PAGEZERO #CHECK-NEXT: Type: container #CHECK-NEXT: Permissions: --- @@ -13,6 +14,7 @@ #CHECK-NEXT: There are no subsections #CHECK-EMPTY: #CHECK-NEXT: Index: 1 +#CHECK-NEXT: ID: 512 #CHECK-NEXT: Name: __TEXT #CHECK-NEXT: Type: container #CHECK-NEXT: Permissions: r-x @@ -22,6 +24,7 @@ #CHECK-NEXT: File size: 4096 #CHECK-NEXT: Showing 3 subsections #CHECK-NEXT: Index: 0 +#CHECK-NEXT: ID: 1 #CHECK-NEXT: Name: __text #CHECK-NEXT: Type: code #CHECK-NEXT: Permissions: r-x @@ -31,6 +34,7 @@ #CHECK-NEXT: File size: 22 #CHECK-EMPTY: #CHECK-NEXT: Index: 1 +#CHECK-NEXT: ID: 2 #CHECK-NEXT: Name: __unwind_info #CHECK-NEXT: Type: compact-unwind #CHECK-NEXT: Permissions: r-x @@ -40,6 +44,7 @@ #CHECK-NEXT: File size: 76 #CHECK-EMPTY: #CHECK-NEXT: Index: 2 +#CHECK-NEXT: ID: 3 #CHECK-NEXT: Name: __eh_frame #CHECK-NEXT: Type: eh-frame #CHECK-NEXT: Permissions: r-x Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.h =================================================================== --- source/Plugins/ObjectFile/ELF/ObjectFileELF.h +++ source/Plugins/ObjectFile/ELF/ObjectFileELF.h @@ -220,10 +220,10 @@ /// The address class for each symbol in the elf file FileAddressToAddressClassMap m_address_class_map; - /// Returns a 1 based index of the given section header. + /// Returns the index of the given section header. size_t SectionIndex(const SectionHeaderCollIter &I); - /// Returns a 1 based index of the given section header. + /// Returns the index of the given section header. size_t SectionIndex(const SectionHeaderCollConstIter &I) const; // Parses the ELF program headers. Index: source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp =================================================================== --- source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -889,11 +889,11 @@ } size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) { - return std::distance(m_section_headers.begin(), I) + 1u; + return std::distance(m_section_headers.begin(), I); } size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const { - return std::distance(m_section_headers.begin(), I) + 1u; + return std::distance(m_section_headers.begin(), I); } bool ObjectFileELF::ParseHeader() { @@ -1081,7 +1081,7 @@ return 0; // sh_link: section header index of string table used by entries in the // section. - Section *dynstr = section_list->FindSectionByID(header->sh_link + 1).get(); + Section *dynstr = section_list->FindSectionByID(header->sh_link).get(); if (!dynstr) return 0; @@ -1717,10 +1717,10 @@ const ObjectFileELF::ELFSectionHeaderInfo * ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) { - if (!id || !ParseSectionHeaders()) + if (!ParseSectionHeaders()) return NULL; - if (--id < m_section_headers.size()) + if (id < m_section_headers.size()) return &m_section_headers[id]; return NULL; @@ -1853,7 +1853,7 @@ m_sections_ap.reset(new SectionList()); VMAddressProvider address_provider(CalculateType()); - for (SectionHeaderCollIter I = m_section_headers.begin(); + for (SectionHeaderCollIter I = std::next(m_section_headers.begin()); I != m_section_headers.end(); ++I) { const ELFSectionHeaderInfo &header = *I; @@ -2000,7 +2000,7 @@ symbol_type = eSymbolTypeUndefined; break; default: - symbol_section_sp = section_list->GetSectionAtIndex(section_idx); + symbol_section_sp = section_list->FindSectionByID(section_idx); break; } @@ -2282,9 +2282,8 @@ assert(symtab_hdr->sh_type == SHT_SYMTAB || symtab_hdr->sh_type == SHT_DYNSYM); - // sh_link: section header index of associated string table. Section ID's are - // ones based. - user_id_t strtab_id = symtab_hdr->sh_link + 1; + // sh_link: section header index of associated string table. + user_id_t strtab_id = symtab_hdr->sh_link; Section *strtab = section_list->FindSectionByID(strtab_id).get(); if (symtab && strtab) { @@ -2494,10 +2493,6 @@ if (!symtab_id || !plt_id) return 0; - // Section ID's are ones based; - symtab_id++; - plt_id++; - const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id); if (!plt_hdr) return 0; @@ -2523,7 +2518,7 @@ return 0; // sh_link points to associated string table. - Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get(); + Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get(); if (!strtab) return 0; @@ -2651,9 +2646,8 @@ if (!section_list) return 0; - // Section ID's are ones based. - user_id_t symtab_id = rel_hdr->sh_link + 1; - user_id_t debug_id = rel_hdr->sh_info + 1; + user_id_t symtab_id = rel_hdr->sh_link; + user_id_t debug_id = rel_hdr->sh_info; const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id); if (!symtab_hdr) Index: tools/lldb-test/lldb-test.cpp =================================================================== --- tools/lldb-test/lldb-test.cpp +++ tools/lldb-test/lldb-test.cpp @@ -732,6 +732,7 @@ assert(S); AutoIndent Indent(Printer, 2); Printer.formatLine("Index: {0}", I); + Printer.formatLine("ID: {0}", S->GetID()); Printer.formatLine("Name: {0}", S->GetName().GetStringRef()); Printer.formatLine("Type: {0}", S->GetTypeAsCString()); Printer.formatLine("Permissions: {0}", GetPermissionsAsCString(S->GetPermissions()));