Przeglądaj źródła

LibELF: Move the implementation of find_demangled_function to ELF::Image

Itamar 4 lat temu
rodzic
commit
93b68f5566

+ 20 - 0
Libraries/LibELF/Image.cpp

@@ -24,6 +24,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+#include <AK/Demangle.h>
 #include <AK/Memory.h>
 #include <AK/StringBuilder.h>
 #include <AK/StringView.h>
@@ -301,4 +302,23 @@ StringView Image::Symbol::raw_data() const
     return { section.raw_data() + (value() - section.address()), size() };
 }
 
+Optional<Image::Symbol> Image::find_demangled_function(const String& name) const
+{
+    Optional<Image::Symbol> found;
+    for_each_symbol([&](const Image::Symbol symbol) {
+        if (symbol.type() != STT_FUNC)
+            return IterationDecision::Continue;
+        auto demangled = demangle(symbol.name());
+        auto index_of_paren = demangled.index_of("(");
+        if (index_of_paren.has_value()) {
+            demangled = demangled.substring(0, index_of_paren.value());
+        }
+        if (demangled != name)
+            return IterationDecision::Continue;
+        found = symbol;
+        return IterationDecision::Break;
+    });
+    return found;
+}
+
 } // end namespace ELF

+ 2 - 0
Libraries/LibELF/Image.h

@@ -208,6 +208,8 @@ public:
     FlatPtr base_address() const { return (FlatPtr)m_buffer; }
     size_t size() const { return m_size; }
 
+    Optional<Symbol> find_demangled_function(const String& name) const;
+
 private:
     const char* raw_data(unsigned offset) const;
     const Elf32_Ehdr& header() const;

+ 0 - 19
Libraries/LibELF/Loader.cpp

@@ -144,25 +144,6 @@ bool Loader::layout()
     return !failed;
 }
 
-Optional<Image::Symbol> Loader::find_demangled_function(const String& name) const
-{
-    Optional<Image::Symbol> found;
-    m_image.for_each_symbol([&](const Image::Symbol symbol) {
-        if (symbol.type() != STT_FUNC)
-            return IterationDecision::Continue;
-        auto demangled = demangle(symbol.name());
-        auto index_of_paren = demangled.index_of("(");
-        if (index_of_paren.has_value()) {
-            demangled = demangled.substring(0, index_of_paren.value());
-        }
-        if (demangled != name)
-            return IterationDecision::Continue;
-        found = symbol;
-        return IterationDecision::Break;
-    });
-    return found;
-}
-
 #ifndef KERNEL
 Optional<Image::Symbol> Loader::find_symbol(u32 address, u32* out_offset) const
 {

+ 4 - 1
Libraries/LibELF/Loader.h

@@ -59,7 +59,10 @@ public:
         return m_image.entry();
     }
     const Image& image() const { return m_image; }
-    Optional<Image::Symbol> find_demangled_function(const String& name) const;
+    Optional<Image::Symbol> find_demangled_function(const String& name) const
+    {
+        return m_image.find_demangled_function(name);
+    }
 
     bool has_symbols() const { return m_symbol_count; }