Return symbol from symbol_at_address_func

Message ID 20210406135744.GN5425@bubble.grove.modra.org
State New
Headers show
Series
  • Return symbol from symbol_at_address_func
Related show

Commit Message

Luis Machado via Binutils April 6, 2021, 1:57 p.m.
include/
	* dis-asm.h (struct disassemble_info <symbol_at_address_func>):
	Return asymbol*.
binutils/
	* objdump.c (objdump_symbol_at_address): Return asymbol*.
opcodes/
	* dis-buf.c (generic_symbol_at_address): Return symbol* NULL.
	* s12z-dis.c (decode_possible_symbol): Use symbol returned from
	symbol_at_address_func.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/binutils/objdump.c b/binutils/objdump.c
index aa1215cede8..ea80a704ee3 100644
--- a/binutils/objdump.c
+++ b/binutils/objdump.c
@@ -1459,14 +1459,16 @@  objdump_print_address (bfd_vma vma, struct disassemble_info *inf)
 
 /* Determine if the given address has a symbol associated with it.  */
 
-static int
+static asymbol *
 objdump_symbol_at_address (bfd_vma vma, struct disassemble_info * inf)
 {
   asymbol * sym;
 
   sym = find_symbol_for_address (vma, inf, NULL);
+  if (sym != NULL && bfd_asymbol_value (sym) == vma)
+    return sym;
 
-  return (sym != NULL && (bfd_asymbol_value (sym) == vma));
+  return NULL;
 }
 
 /* Hold the last function name and the last line number we displayed
diff --git a/include/dis-asm.h b/include/dis-asm.h
index 4f5008436d4..f3562faa000 100644
--- a/include/dis-asm.h
+++ b/include/dis-asm.h
@@ -144,13 +144,13 @@  typedef struct disassemble_info
      some circumstances we want to include the overlay number in the
      address, (normally because there is a symbol associated with
      that address), but sometimes we want to mask out the overlay bits.  */
-  int (* symbol_at_address_func)
+  asymbol * (*symbol_at_address_func)
     (bfd_vma addr, struct disassemble_info *dinfo);
 
   /* Function called to check if a SYMBOL is can be displayed to the user.
      This is used by some ports that want to hide special symbols when
      displaying debugging outout.  */
-  bool (* symbol_is_valid)
+  bool (*symbol_is_valid)
     (asymbol *, struct disassemble_info *dinfo);
 
   /* These are for buffer_read_memory.  */
@@ -376,11 +376,11 @@  extern void perror_memory (int, bfd_vma, struct disassemble_info *);
 extern void generic_print_address
   (bfd_vma, struct disassemble_info *);
 
-/* Always true.  */
-extern int generic_symbol_at_address
+/* Always NULL.  */
+extern asymbol *generic_symbol_at_address
   (bfd_vma, struct disassemble_info *);
 
-/* Also always true.  */
+/* Always true.  */
 extern bool generic_symbol_is_valid
   (asymbol *, struct disassemble_info *);
 
diff --git a/opcodes/dis-buf.c b/opcodes/dis-buf.c
index 2a934652a1e..dfc1563f09d 100644
--- a/opcodes/dis-buf.c
+++ b/opcodes/dis-buf.c
@@ -87,13 +87,13 @@  generic_print_address (bfd_vma addr, struct disassemble_info *info)
   (*info->fprintf_func) (info->stream, "0x%s", buf);
 }
 
-/* Just return true.  */
+/* Just return NULL.  */
 
-int
+asymbol *
 generic_symbol_at_address (bfd_vma addr ATTRIBUTE_UNUSED,
 			   struct disassemble_info *info ATTRIBUTE_UNUSED)
 {
-  return 1;
+  return NULL;
 }
 
 /* Just return TRUE.  */
diff --git a/opcodes/s12z-dis.c b/opcodes/s12z-dis.c
index 4616bc82711..ec8f4f70883 100644
--- a/opcodes/s12z-dis.c
+++ b/opcodes/s12z-dis.c
@@ -206,27 +206,12 @@  decode_possible_symbol (bfd_vma addr, bfd_vma base,
                         struct disassemble_info *info, bool relative)
 {
   const char *fmt = relative  ? "*%+" BFD_VMA_FMT "d" : "%" BFD_VMA_FMT "d";
-  if (!info->symbol_at_address_func (addr + base, info))
-    {
-      (*info->fprintf_func) (info->stream, fmt, addr);
-    }
+  asymbol *sym = info->symbol_at_address_func (addr + base, info);
+
+  if (!sym)
+    (*info->fprintf_func) (info->stream, fmt, addr);
   else
-    {
-      asymbol *sym = NULL;
-      int j;
-      for (j = 0; j < info->symtab_size; ++j)
-	{
-	  sym = info->symtab[j];
-	  if (bfd_asymbol_value (sym) == addr + base)
-	    {
-	      break;
-	    }
-	}
-      if (j < info->symtab_size)
-	(*info->fprintf_func) (info->stream, "%s", bfd_asymbol_name (sym));
-      else
-        (*info->fprintf_func) (info->stream, fmt, addr);
-    }
+    (*info->fprintf_func) (info->stream, "%s", bfd_asymbol_name (sym));
 }