Add an objfile getter to gdb.Type
[deliverable/binutils-gdb.git] / gdb / dwarf2loc.c
index bac74461f9abafe65b672e7ed7393c2ac97fe0e9..37cda40ecf35e8f9257b0e8899ed67477a215fbf 100644 (file)
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-
-/* Standard C++ includes.  */
-#include <algorithm>
-#include <unordered_set>
-#include <vector>
-
-/* Local non-gdb includes.  */
-#include "ax-gdb.h"
+#include "ui-out.h"
+#include "value.h"
+#include "frame.h"
+#include "gdbcore.h"
+#include "target.h"
+#include "inferior.h"
 #include "ax.h"
+#include "ax-gdb.h"
+#include "regcache.h"
+#include "objfiles.h"
 #include "block.h"
-#include "common/byte-vector.h"
-#include "common/selftest.h"
-#include "common/underlying.h"
-#include "compile/compile.h"
+#include "gdbcmd.h"
 #include "complaints.h"
-#include "dwarf2-frame.h"
 #include "dwarf2.h"
 #include "dwarf2expr.h"
 #include "dwarf2loc.h"
-#include "frame.h"
-#include "gdbcmd.h"
-#include "gdbcore.h"
-#include "inferior.h"
-#include "objfiles.h"
-#include "regcache.h"
-#include "target.h"
-#include "ui-out.h"
-#include "value.h"
+#include "dwarf2read.h"
+#include "dwarf2-frame.h"
+#include "compile/compile.h"
+#include "common/selftest.h"
+#include <algorithm>
+#include <vector>
+#include <unordered_set>
+#include "common/underlying.h"
+#include "common/byte-vector.h"
 
 extern int dwarf_always_disassemble;
 
@@ -640,7 +637,7 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context
   }
 
   /* Callback function for dwarf2_evaluate_loc_desc.
-     Fetch the address indexed by DW_OP_GNU_addr_index.  */
+     Fetch the address indexed by DW_OP_addrx or DW_OP_GNU_addr_index.  */
 
   CORE_ADDR get_addr_index (unsigned int index) override
   {
@@ -1199,11 +1196,11 @@ call_site_find_chain (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
 {
   struct call_site_chain *retval = NULL;
 
-  TRY
+  try
     {
       retval = call_site_find_chain_1 (gdbarch, caller_pc, callee_pc);
     }
-  CATCH (e, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &e)
     {
       if (e.error == NO_ENTRY_VALUE_ERROR)
        {
@@ -1213,9 +1210,8 @@ call_site_find_chain (struct gdbarch *gdbarch, CORE_ADDR caller_pc,
          return NULL;
        }
       else
-       throw_exception (e);
+       throw;
     }
-  END_CATCH
 
   return retval;
 }
@@ -2168,11 +2164,11 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
   ctx.ref_addr_size = dwarf2_per_cu_ref_addr_size (per_cu);
   ctx.offset = dwarf2_per_cu_text_offset (per_cu);
 
-  TRY
+  try
     {
       ctx.eval (data, size);
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &ex)
     {
       if (ex.error == NOT_AVAILABLE_ERROR)
        {
@@ -2190,9 +2186,8 @@ dwarf2_evaluate_loc_desc_full (struct type *type, struct frame_info *frame,
          return allocate_optimized_out_value (subobj_type);
        }
       else
-       throw_exception (ex);
+       throw;
     }
-  END_CATCH
 
   if (ctx.pieces.size () > 0)
     {
@@ -2386,11 +2381,11 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
   ctx.ref_addr_size = dwarf2_per_cu_ref_addr_size (dlbaton->per_cu);
   ctx.offset = dwarf2_per_cu_text_offset (dlbaton->per_cu);
 
-  TRY
+  try
     {
       ctx.eval (dlbaton->data, dlbaton->size);
     }
-  CATCH (ex, RETURN_MASK_ERROR)
+  catch (const gdb_exception_error &ex)
     {
       if (ex.error == NOT_AVAILABLE_ERROR)
        {
@@ -2403,9 +2398,8 @@ dwarf2_locexpr_baton_eval (const struct dwarf2_locexpr_baton *dlbaton,
          return 0;
        }
       else
-       throw_exception (ex);
+       throw;
     }
-  END_CATCH
 
   switch (ctx.location)
     {
@@ -2500,8 +2494,12 @@ dwarf2_evaluate_property (const struct dynamic_prop *prop,
        struct value *val;
 
        for (pinfo = addr_stack; pinfo != NULL; pinfo = pinfo->next)
-         if (pinfo->type == baton->referenced_type)
-           break;
+         {
+           /* This approach lets us avoid checking the qualifiers.  */
+           if (TYPE_MAIN_TYPE (pinfo->type)
+               == TYPE_MAIN_TYPE (baton->referenced_type))
+             break;
+         }
        if (pinfo == NULL)
          error (_("cannot find reference address for offset property"));
        if (pinfo->valaddr != NULL)
@@ -2649,7 +2647,7 @@ class symbol_needs_eval_context : public dwarf_expr_context
     push_address (0, 0);
   }
 
-  /* DW_OP_GNU_addr_index doesn't require a frame.  */
+  /* DW_OP_addrx and DW_OP_GNU_addr_index doesn't require a frame.  */
 
    CORE_ADDR get_addr_index (unsigned int index) override
    {
@@ -4093,6 +4091,7 @@ disassemble_dwarf_expression (struct ui_file *stream,
          fprintf_filtered (stream, " offset %s", phex_nz (ul, 4));
          break;
 
+       case DW_OP_addrx:
        case DW_OP_GNU_addr_index:
          data = safe_read_uleb128 (data, end, &ul);
          ul = dwarf2_read_addr_index (per_cu, ul);
This page took 0.027794 seconds and 4 git commands to generate.