jankratochvil updated this revision to Diff 235518.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D63540/new/
https://reviews.llvm.org/D63540
Files:
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
@@ -928,8 +928,27 @@
}
}
+ // How much preferred is this symbol?
+ auto rank = [this](const FileRangeToIndexMap::Entry &entry) {
+ const Symbol &symbol = *SymbolAtIndex(entry.data);
+ if (symbol.IsExternal())
+ return 3;
+ else if (symbol.IsWeak())
+ return 2;
+ else if (symbol.IsDebug())
+ return 0;
+ return 1;
+ };
+
// Sort again in case the range size changes the ordering
- m_file_addr_to_index.Sort();
+ m_file_addr_to_index.Sort([rank](const FileRangeToIndexMap::Entry &a,
+ const FileRangeToIndexMap::Entry &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);
+ });
}
}
}
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
@@ -638,6 +638,10 @@
if (m_entries.size() > 1)
std::stable_sort(m_entries.begin(), m_entries.end());
}
+ template <class Compare> void Sort(Compare comp) {
+ if (m_entries.size() > 1)
+ std::stable_sort(m_entries.begin(), m_entries.end(), comp);
+ }
#ifdef ASSERT_RANGEMAP_ARE_SORTED
bool IsSorted() const {
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits