clayborg requested changes to this revision. clayborg added a comment. This revision now requires changes to proceed.
One last change to make line table parsing more efficient by not having to check the arch for every line table entry. ================ Comment at: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:1131 @@ -1130,2 +1130,3 @@ std::unique_ptr<LineSequence> sequence_ap; + ArchSpec arch; }; ---------------- Maybe this should be a "lldb:addr_t addr_mask;" instead of the architecture. Then you determine the mask one time before you parse a line table and fill it in. ================ Comment at: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:1160-1170 @@ -1158,1 +1159,13 @@ } + + /* + * MIPS: + * The SymbolContext may not have a valid target, thus we may not be able + * to call Address::GetOpcodeLoadAddress() which would clear the bit #0 + * for MIPS. Use ArchSpec to clear the bit #0. + */ + lldb::addr_t file_addr = state.address; + if (info->arch.GetMachine() == llvm::Triple::mips || info->arch.GetMachine() == llvm::Triple::mipsel + || info->arch.GetMachine() == llvm::Triple::mips64 || info->arch.GetMachine() == llvm::Triple::mips64el) + file_addr = state.address & (~1ull); + ---------------- Move this code to where the ParseDWARFLineTableCallbackInfo is filled in and fill in "addr_mask" as described above. Otherwise each time we append a line entry to a sequence we will be checking the arch over and over and over and over.... ================ Comment at: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:1173 @@ -1159,3 +1172,3 @@ line_table->AppendLineEntryToSequence (info->sequence_ap.get(), - state.address, + file_addr, state.line, ---------------- change this line to: ``` file_addr & info->addr_mask, ``` ================ Comment at: source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp:1213 @@ -1199,2 +1212,3 @@ info.line_table = line_table_ap.get(); + GetObjectFile()->GetArchitecture(info.arch); lldb::offset_t offset = cu_line_offset; ---------------- Fill in "info.addr_mask" here: ``` /* * MIPS: * The SymbolContext may not have a valid target, thus we may not be able * to call Address::GetOpcodeLoadAddress() which would clear the bit #0 * for MIPS. Use ArchSpec to clear the bit #0. */ ArchSpec arch; GetObjectFile()->GetArchitecture(arch); switch (arch.GetMachine()) { case llvm::Triple::mips: case llvm::Triple::mipsel: case llvm::Triple::mips64: case llvm::Triple::mips64el: info.addr_mask = ~((lldb::addr_t)1); break; default: info.addr_mask = ~((lldb::addr_t)0); break; } ``` Repository: rL LLVM http://reviews.llvm.org/D12079 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits