Remove get_frame_cfa from dwarf_expr_context
authorZoran Zaric <Zoran.Zaric@amd.com>
Fri, 9 Oct 2020 10:22:23 +0000 (11:22 +0100)
committerZoran Zaric <zoran.zaric@amd.com>
Thu, 5 Aug 2021 15:39:27 +0000 (16:39 +0100)
Following the idea of merging the evaluators, the get_frame_cfa method
can be moved from dwarf_expr_executor and dwarf_evaluate_loc_desc
classes to their base class dwarf_expr_context. Once this is done,
it becomes apparent that the method is only called once and it can be
inlined.

It is also necessary to check if the frame context information was
provided before the DW_OP_call_frame_cfa operation is executed.

gdb/ChangeLog:

* dwarf2/expr.c (dwarf_expr_context::get_frame_cfa): Remove
method.
(dwarf_expr_context::execute_stack_op): Call frame context info
check for DW_OP_call_frame_cfa. Remove use of get_frame_cfa.
* dwarf2/expr.h (dwarf_expr_context::get_frame_cfa): Remove
method.
* dwarf2/frame.c (dwarf_expr_context::get_frame_cfa): Remove
method.
* dwarf2/loc.c (dwarf_expr_context::get_frame_cfa): Remove
method.

gdb/dwarf2/expr.c
gdb/dwarf2/expr.h
gdb/dwarf2/frame.c
gdb/dwarf2/loc.c

index 0e992c162e592a8697a592fbfc47dad24a284b8c..4427c53fe691e0a0b0182b17be55ed716ef4c745 100644 (file)
@@ -29,6 +29,7 @@
 #include "dwarf2/expr.h"
 #include "dwarf2/loc.h"
 #include "dwarf2/read.h"
+#include "frame.h"
 #include "gdbsupport/underlying.h"
 #include "gdbarch.h"
 
@@ -1217,7 +1218,9 @@ dwarf_expr_context::execute_stack_op (const gdb_byte *op_ptr,
          break;
 
        case DW_OP_call_frame_cfa:
-         result = this->get_frame_cfa ();
+         ensure_have_frame (this->frame, "DW_OP_call_frame_cfa");
+
+         result = dwarf2_frame_cfa (this->frame);
          result_val = value_from_ulongest (address_type, result);
          in_stack_memory = true;
          break;
index b227690df4d847c803ec48b46208b1360e7534d1..f1c931e219062ffdf5a38b3a6b883e412453544c 100644 (file)
@@ -192,9 +192,6 @@ struct dwarf_expr_context
   /* Read LENGTH bytes at ADDR into BUF.  */
   virtual void read_mem (gdb_byte *buf, CORE_ADDR addr, size_t length) = 0;
 
-  /* Return the CFA for the frame.  */
-  virtual CORE_ADDR get_frame_cfa () = 0;
-
   /* Return the PC for the frame.  */
   virtual CORE_ADDR get_frame_pc ()
   {
index 19915df7a83bd2f8a70390ecfdcf5b33a8e5bac5..d7cc764f2d65f4f9a4a74eb54ea7170c581dce24 100644 (file)
@@ -249,11 +249,6 @@ public:
     invalid ("DW_OP_push_object_address");
   }
 
-  CORE_ADDR get_frame_cfa () override
-  {
-    invalid ("DW_OP_call_frame_cfa");
-  }
-
   CORE_ADDR get_tls_address (CORE_ADDR offset) override
   {
     invalid ("DW_OP_form_tls_address");
index d004ea5cd65b66dd98936f6f0d8e074a4911ddd1..723d9a40af5f9ea5c3067ddba13ed25edc9bab77 100644 (file)
@@ -699,14 +699,6 @@ public:
   struct dwarf2_per_cu_data *per_cu;
   CORE_ADDR obj_address;
 
-  /* Helper function for dwarf2_evaluate_loc_desc.  Computes the CFA for
-     the frame in BATON.  */
-
-  CORE_ADDR get_frame_cfa () override
-  {
-    return dwarf2_frame_cfa (frame);
-  }
-
   /* Helper function for dwarf2_evaluate_loc_desc.  Computes the PC for
      the frame in BATON.  */