Change tui_show_symtab_source to be a method
[external/binutils.git] / gdb / blockframe.c
index 6ea0965..4462274 100644 (file)
@@ -1,7 +1,7 @@
 /* Get info from stack frames; convert between frames, blocks,
    functions and pc values.
 
-   Copyright (C) 1986-2018 Free Software Foundation, Inc.
+   Copyright (C) 1986-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -217,7 +217,6 @@ find_pc_partial_function (CORE_ADDR pc, const char **name, CORE_ADDR *address,
   struct symbol *f;
   struct bound_minimal_symbol msymbol;
   struct compunit_symtab *compunit_symtab = NULL;
-  struct objfile *objfile;
   CORE_ADDR mapped_pc;
 
   /* To ensure that the symbol returned belongs to the correct setion
@@ -237,18 +236,19 @@ find_pc_partial_function (CORE_ADDR pc, const char **name, CORE_ADDR *address,
     goto return_cached_value;
 
   msymbol = lookup_minimal_symbol_by_pc_section (mapped_pc, section);
-  ALL_OBJFILES (objfile)
-  {
-    if (objfile->sf)
-      {
-       compunit_symtab
-         = objfile->sf->qf->find_pc_sect_compunit_symtab (objfile, msymbol,
-                                                          mapped_pc, section,
-                                                          0);
-      }
-    if (compunit_symtab != NULL)
-      break;
-  }
+  for (objfile *objfile : current_program_space->objfiles ())
+    {
+      if (objfile->sf)
+       {
+         compunit_symtab
+           = objfile->sf->qf->find_pc_sect_compunit_symtab (objfile, msymbol,
+                                                            mapped_pc,
+                                                            section,
+                                                            0);
+       }
+      if (compunit_symtab != NULL)
+       break;
+    }
 
   if (compunit_symtab != NULL)
     {
@@ -331,6 +331,8 @@ find_pc_partial_function (CORE_ADDR pc, const char **name, CORE_ADDR *address,
        *address = 0;
       if (endaddr != NULL)
        *endaddr = 0;
+      if (block != nullptr)
+       *block = nullptr;
       return 0;
     }
 
@@ -377,6 +379,43 @@ find_pc_partial_function (CORE_ADDR pc, const char **name, CORE_ADDR *address,
 
 /* See symtab.h.  */
 
+bool
+find_function_entry_range_from_pc (CORE_ADDR pc, const char **name,
+                                  CORE_ADDR *address, CORE_ADDR *endaddr)
+{
+  const struct block *block;
+  bool status = find_pc_partial_function (pc, name, address, endaddr, &block);
+
+  if (status && block != nullptr && !BLOCK_CONTIGUOUS_P (block))
+    {
+      CORE_ADDR entry_pc = BLOCK_ENTRY_PC (block);
+
+      for (int i = 0; i < BLOCK_NRANGES (block); i++)
+        {
+         if (BLOCK_RANGE_START (block, i) <= entry_pc
+             && entry_pc < BLOCK_RANGE_END (block, i))
+           {
+             if (address != nullptr)
+               *address = BLOCK_RANGE_START (block, i);
+
+             if (endaddr != nullptr)
+               *endaddr = BLOCK_RANGE_END (block, i);
+
+             return status;
+           }
+       }
+
+      /* It's an internal error if we exit the above loop without finding
+         the range.  */
+      internal_error (__FILE__, __LINE__,
+                      _("Entry block not found in find_function_entry_range_from_pc"));
+    }
+
+  return status;
+}
+
+/* See symtab.h.  */
+
 struct type *
 find_function_type (CORE_ADDR pc)
 {