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

Reply via email to