jankratochvil updated this revision to Diff 236777. jankratochvil added a comment.
Found some way. Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D63540/new/ https://reviews.llvm.org/D63540 Files: lldb/include/lldb/Symbol/Symtab.h lldb/include/lldb/Utility/RangeMap.h lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp lldb/source/Symbol/Symtab.cpp lldb/test/Shell/SymbolFile/Inputs/symbol-binding.s lldb/test/Shell/SymbolFile/symbol-binding.test
Index: lldb/test/Shell/SymbolFile/symbol-binding.test =================================================================== --- /dev/null +++ lldb/test/Shell/SymbolFile/symbol-binding.test @@ -0,0 +1,22 @@ +# Some targets do not have the .size directive. +# RUN: %clang -target x86_64-unknown-unknown-elf %S/Inputs/symbol-binding.s -c -o %t.o +# RUN: %lldb %t.o -s %s -o quit | FileCheck %s + +image lookup --address 4 +# CHECK: Summary: symbol-binding.test.tmp.o`case1_global +image lookup --address 5 +# CHECK: Summary: symbol-binding.test.tmp.o`case2_weak +image lookup --address 6 +# CHECK: Summary: symbol-binding.test.tmp.o`case3_global +image dump symtab +# CHECK: Index UserID DSX Type File Address/Value Load Address Size Flags Name +# CHECK-NEXT:------- ------ --- --------------- ------------------ ------------------ ------------------ ---------- ---------------------------------- +# CHECK-NEXT:[ 0] 1 Code 0x0000000000000004 0x0000000000000001 0x00000000 case1_local +# CHECK-NEXT:[ 1] 2 Code 0x0000000000000005 0x0000000000000001 0x00000000 case2_local +# CHECK-NEXT:[ 2] 3 Code 0x0000000000000003 0x0000000000000001 0x00000000 sizeend +# CHECK-NEXT:[ 3] 4 Code 0x0000000000000001 0x0000000000000002 0x00000000 sizeful +# CHECK-NEXT:[ 4] 5 Code 0x0000000000000001 0x0000000000000002 0x00000000 sizeless +# CHECK-NEXT:[ 5] 6 X Code 0x0000000000000004 0x0000000000000001 0x00000010 case1_global +# CHECK-NEXT:[ 6] 7 Code 0x0000000000000005 0x0000000000000001 0x00000020 case2_weak +# CHECK-NEXT:[ 7] 8 X Code 0x0000000000000006 0x0000000000000001 0x00000010 case3_global +# CHECK-NEXT:[ 8] 9 Code 0x0000000000000006 0x0000000000000001 0x00000020 case3_weak Index: lldb/test/Shell/SymbolFile/Inputs/symbol-binding.s =================================================================== --- /dev/null +++ lldb/test/Shell/SymbolFile/Inputs/symbol-binding.s @@ -0,0 +1,22 @@ + .text + .byte 0 +sizeless: +sizeful: + .byte 0 + .byte 0 +sizeend: + .size sizeful, sizeend - sizeful + .byte 0 +case1_local: +case1_global: + .globl case1_global + .byte 0 +case2_local: +case2_weak: + .weak case2_weak + .byte 0 +case3_weak: + .weak case3_weak +case3_global: + .globl case3_global + .byte 0 Index: lldb/source/Symbol/Symtab.cpp =================================================================== --- lldb/source/Symbol/Symtab.cpp +++ lldb/source/Symbol/Symtab.cpp @@ -28,7 +28,7 @@ using namespace lldb_private; Symtab::Symtab(ObjectFile *objfile) - : m_objfile(objfile), m_symbols(), m_file_addr_to_index(), + : m_objfile(objfile), m_symbols(), m_file_addr_to_index(*this), m_name_to_index(), m_mutex(), m_file_addr_to_index_computed(false), m_name_indexes_computed(false) {} Index: lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp =================================================================== --- lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp +++ lldb/source/Plugins/ObjectFile/ELF/ObjectFileELF.cpp @@ -2258,6 +2258,8 @@ symbol_size_valid, // Symbol size is valid has_suffix, // Contains linker annotations? flags); // Symbol flags. + if (symbol.getBinding() == STB_WEAK) + dc_symbol.SetIsWeak(true); symtab->AddSymbol(dc_symbol); } return i; Index: lldb/include/lldb/Utility/RangeMap.h =================================================================== --- lldb/include/lldb/Utility/RangeMap.h +++ lldb/include/lldb/Utility/RangeMap.h @@ -621,14 +621,17 @@ } }; -template <typename B, typename S, typename T, unsigned N = 0> +template <typename B, typename S, typename T, unsigned N = 0, + class Compare = std::less<RangeData<B, S, T>>> class RangeDataVector { public: typedef lldb_private::Range<B, S> Range; typedef RangeData<B, S, T> Entry; typedef llvm::SmallVector<Entry, N> Collection; - RangeDataVector() = default; + template <class... CompareArgs> + RangeDataVector(CompareArgs &&... compareargs) + : m_compare(std::forward<CompareArgs>(compareargs)...) {} ~RangeDataVector() = default; @@ -636,7 +639,7 @@ void Sort() { if (m_entries.size() > 1) - std::stable_sort(m_entries.begin(), m_entries.end()); + std::stable_sort(m_entries.begin(), m_entries.end(), m_compare); } #ifdef ASSERT_RANGEMAP_ARE_SORTED @@ -817,6 +820,7 @@ protected: Collection m_entries; + Compare m_compare; }; // A simple range with data class where you get to define the type of Index: lldb/include/lldb/Symbol/Symtab.h =================================================================== --- lldb/include/lldb/Symbol/Symtab.h +++ lldb/include/lldb/Symbol/Symtab.h @@ -143,7 +143,36 @@ typedef std::vector<Symbol> collection; typedef collection::iterator iterator; typedef collection::const_iterator const_iterator; - typedef RangeDataVector<lldb::addr_t, lldb::addr_t, uint32_t> + typedef RangeDataVector<lldb::addr_t, lldb::addr_t, uint32_t>::Entry + FileRangeToIndexMapEntry; + class FileRangeToIndexMapCompare { + public: + FileRangeToIndexMapCompare(const Symtab &symtab) : m_symtab(symtab) {} + bool operator()(const FileRangeToIndexMapEntry &a, + const FileRangeToIndexMapEntry &b) { + // For each matching address range choose the most global symbol. + if (a.GetRangeBase() != b.GetRangeBase() || + a.GetByteSize() != b.GetByteSize()) + return a < b; + return rank(a) > rank(b); + } + + private: + // How much preferred is this symbol? + int rank(const FileRangeToIndexMapEntry &entry) const { + const Symbol &symbol = *m_symtab.SymbolAtIndex(entry.data); + if (symbol.IsExternal()) + return 3; + else if (symbol.IsWeak()) + return 2; + else if (symbol.IsDebug()) + return 0; + return 1; + } + const Symtab &m_symtab; + }; + typedef RangeDataVector<lldb::addr_t, lldb::addr_t, uint32_t, 0, + FileRangeToIndexMapCompare> FileRangeToIndexMap; void InitNameIndexes(); void InitAddressIndexes();
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits